|
|
  |
Работа с 25lc640 |
|
|
|
May 16 2006, 17:43
|
Частый гость
 
Группа: Новичок
Сообщений: 100
Регистрация: 9-03-06
Пользователь №: 15 088

|
Hi, All! С форума взял исходники для работы с 25lc640, немного переделал. Добавил функцию для записи страниц (32 байта). И при проверке произходит следующее: 1. Пишем страницу. 2. Читаем 32 байта. Записанное и прочитанное совпадают. 1. Пишем 32 байта с помощью функции, записывающей 1 байт за раз 2. Читаем 32 байта. Записанное и прочитанное совпадают. 1. Пишем 1 байт с помощью функции записи страницы. 2. Пишем страницу. 3. Читаем 33 байта. Записанное и прочитанное совпадают. //================================================================================ == Теперь пошли баги: 1. Пишем 1 байт. 2. Пишем страницу. 3. Читаем 33 байта. Записанное и прочитанное не совпадают. Конкретно: не записывается самый первый байт, пишется как "0". Обмен местами пунктов 1 и 2 не дает результата. 1. Пишем 1 байт. 2. Пишем 1 байт. 3. Пишем страницу. 4. Читаем 34 байта. Записанное и прочитанное не совпадают. Конкретно: не записывается первые два байта, пишутся как "0". У кого какие идей возникли? Компилятор CVAAVR 1.24.4
25lc640.txt ( 3.51 килобайт )
Кол-во скачиваний: 225
Сообщение отредактировал CSB - May 16 2006, 18:10
|
|
|
|
|
May 16 2006, 18:27
|
Частый гость
 
Группа: Новичок
Сообщений: 100
Регистрация: 9-03-06
Пользователь №: 15 088

|
Цитата Два замечания. 1. Столь внушительный исходник не стоит включать в сообщение в виде текста. Лучше отдельным файлом присоедините к сообщению. Не вопрос. Цитата 2. Я просмотрел исходник конечно "по диагонали", но не увидел где у вас идет проверка и выравнивание на размер страницы при записи произвольного количества байт? При записи страницы мы начинаем новый цикл записи и то что перед этим был записан байт не важно. Возможно я вас неправильно понял, тогда объясните подробнее.
|
|
|
|
|
May 16 2006, 19:19
|
Частый гость
 
Группа: Новичок
Сообщений: 100
Регистрация: 9-03-06
Пользователь №: 15 088

|
А теперь понятно. Разбивка в программе. Что-то типа такого (нужно записать 64 байта): Код .......... eeprom_address = 0; eeprom_putbytes(eeprom_address, ptr, 32); eeprom_address += 32; eeprom_putbytes(eeprom_address, ptr + 32, 32); ......... Только в datasheet явно про страницы ничего не сказано, кроме того что они по 32 байта. Причем это страницы для записи, т.е. память на страницы не разбита. datasheet 25lc640
Сообщение отредактировал CSB - May 16 2006, 19:39
|
|
|
|
|
May 16 2006, 19:50
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(CSB @ May 17 2006, 01:19)  Только в datasheet явно про страницы ничего не сказано, кроме того что они по 32 байта. Причем это страницы для записи, т.е. память на страницы не разбита. Писать можно не более 32 байт за раз. Читать можно непрерывную последовательность байт, не превышающую разрядность внутреннего автоинкрементного счетчика (0x1FFF). Цитата(CSB @ May 17 2006, 01:19)  Цитата начинать нужно с адреса не кратного странице
Почему? (где про подобное можно почитать) раздел 3.3 Write Sequence Цитата Once the write enable latch is set, the user may proceed by setting the CS low, issuing a WRITE instruction, followed by the address, and then the data to be written. Up to 32 bytes of data can be sent to the 25XX640 before a write cycle is necessary. The only restriction is that all of the bytes must reside in the same page. A page address begins with XXX0 0000 and ends with XXX1 1111. If the internal address counter reaches XXX1 1111 and the clock continues, the counter will roll back to the first address of the page and overwrite any data in the page that may have been written. P.S. вы бы не могли остановиться в непрерывном редактировании ваших сообщений? Готовлю ответ с цитированием, глядь, а сообщение уже изменилось
|
|
|
|
|
May 16 2006, 20:03
|
Частый гость
 
Группа: Новичок
Сообщений: 100
Регистрация: 9-03-06
Пользователь №: 15 088

|
Цитата P.S. вы бы не могли остановиться в непрерывном редактировании ваших сообщений? Готовлю ответ с цитированием, глядь, а сообщение уже изменилось Могу. Просто поспешил и не все написал.  Цитата раздел 3.3 Write Sequence Это все понятно. Только почему при записи 1 байта (например, значение 0xAB по адресу 0x0000) и следом еще 32 байта (пишу как страницу, в новом цикле записи, начиная с 0x0001), не происходит записи первого байта (0xAB). Иногда бывает записана с ошибками часть 32 байтовой последовательности.
|
|
|
|
|
May 16 2006, 21:31
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Пардон, прочитал внимательно вопрос. Цитата почему при записи 1 байта (например, значение 0xAB по адресу 0x0000) и следом еще 32 байта (пишу как страницу, в новом цикле записи, начиная с 0x0001), не происходит записи первого байта (0xAB). Потому что первый байт (по адресу 0x0000) перезаписывается 31 байтом следующей последовательности. 1+32 равно вроде как 33 (0x0021), но счетчик-то буфера записи всего лишь 5-битный и он даст адрес по маске 0x1F: 0x0021&0x1F=0x0001, вместо ожидаемого 0x0021.
|
|
|
|
|
May 17 2006, 12:33
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(CSB @ May 17 2006, 14:57)  Счетчик буфера при новом цикле записи должен обнулится. А так не происходит! Дык не обнуляется он, а устанавливается при передаче адреса. Только потом от установленного адреса считает автоинкрементно в пределах пяти младших адресных бит. Т.е. если установили начальный адрес 0x0001, то при записи внутренний счетчик будет считать адреса 0x0001, 0x0002, 0x0003 .... 0x001E, 0x001F, 0x0000, 0x0001 и т.д. по кольцу. При чтении аналогично, но внутренний счетчик крутится в пределах 13- ти бит. Т.е. например, при чтении, начиная c адреса 0x03FF0, будет такая последовательность: 0x03FF0, 0x3FF1, 0x3FF2 ... 0x3FFF, 0x2000, 0x2001, 0x2002. Ну теперь-то надеюсь вы поняли?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|