реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Работа с 25lc640
CSB
сообщение May 16 2006, 17:43
Сообщение #1


Частый гость
**

Группа: Новичок
Сообщений: 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
Go to the top of the page
 
+Quote Post
rezident
сообщение May 16 2006, 18:06
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Два замечания.
1. Столь внушительный исходник не стоит включать в сообщение в виде текста. Лучше отдельным файлом присоедините к сообщению.
2. Я просмотрел исходник конечно "по диагонали", но не увидел где у вас идет проверка и выравнивание на размер страницы при записи произвольного количества байт?
Go to the top of the page
 
+Quote Post
CSB
сообщение May 16 2006, 18:27
Сообщение #3


Частый гость
**

Группа: Новичок
Сообщений: 100
Регистрация: 9-03-06
Пользователь №: 15 088



Цитата
Два замечания.
1. Столь внушительный исходник не стоит включать в сообщение в виде текста. Лучше отдельным файлом присоедините к сообщению.

Не вопрос.

Цитата
2. Я просмотрел исходник конечно "по диагонали", но не увидел где у вас идет проверка и выравнивание на размер страницы при записи произвольного количества байт?


При записи страницы мы начинаем новый цикл записи и то что перед этим был записан байт не важно.
Возможно я вас неправильно понял, тогда объясните подробнее.
Go to the top of the page
 
+Quote Post
rezident
сообщение May 16 2006, 19:15
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(CSB @ May 17 2006, 00:27) *
При записи страницы мы начинаем новый цикл записи и то что перед этим был записан байт не важно.
Возможно я вас неправильно понял, тогда объясните подробнее.

Где идет разбивка на страницы? В основной программе? Допустим нужно записать 100 байт с адреса 0x15. 100 байт это 100/32=3 и 1/8 страницы. Все бы ничего, но начинать нужно с адреса не кратного странице. Т.е. в первой (нулевой) странице нужно записать всего 10 байт со смещением 0x15. Потом две полных страницы по 32 байта. Затем 26 байт в четвертой странице с начала страницы. Мой вопрос был: где именно делается эта разбивка на страницы?
Go to the top of the page
 
+Quote Post
CSB
сообщение May 16 2006, 19:19
Сообщение #5


Частый гость
**

Группа: Новичок
Сообщений: 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
Go to the top of the page
 
+Quote Post
rezident
сообщение May 16 2006, 19:50
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 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. вы бы не могли остановиться в непрерывном редактировании ваших сообщений? Готовлю ответ с цитированием, глядь, а сообщение уже изменилось smile.gif
Go to the top of the page
 
+Quote Post
CSB
сообщение May 16 2006, 20:03
Сообщение #7


Частый гость
**

Группа: Новичок
Сообщений: 100
Регистрация: 9-03-06
Пользователь №: 15 088



Цитата
P.S. вы бы не могли остановиться в непрерывном редактировании ваших сообщений? Готовлю ответ с цитированием, глядь, а сообщение уже изменилось

Могу. Просто поспешил и не все написал. smile.gif


Цитата
раздел 3.3 Write Sequence

Это все понятно. Только почему при записи 1 байта (например, значение 0xAB по адресу 0x0000) и следом еще 32 байта (пишу как страницу, в новом цикле записи, начиная с 0x0001), не происходит записи первого байта (0xAB). Иногда бывает записана с ошибками часть 32 байтовой последовательности.
Go to the top of the page
 
+Quote Post
rezident
сообщение May 16 2006, 20:16
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(CSB @ May 17 2006, 02:03) *
Это все понятно. Только почему при записи 1 байта (например, значение 0xAB по адресу 0x0000) и следом еще 32 байта (пишу как страницу, в новом цикле записи, начиная с 0x0001), не происходит записи первого байта (0xAB). Иногда бывает записана с ошибками часть 32 байтовой последовательности.

Потому что внутренний цикл записи начинается сразу же после того как CS был переведен в неактивное состояние. И перед началом следующей записи/чтения нужно опрашивать регистр RDSR на предмет завершения предыдущего цикла записи (бит WIP).
Go to the top of the page
 
+Quote Post
CSB
сообщение May 16 2006, 20:28
Сообщение #9


Частый гость
**

Группа: Новичок
Сообщений: 100
Регистрация: 9-03-06
Пользователь №: 15 088



Я это делаю.
Go to the top of the page
 
+Quote Post
rezident
сообщение May 16 2006, 21:31
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
CSB
сообщение May 17 2006, 08:57
Сообщение #11


Частый гость
**

Группа: Новичок
Сообщений: 100
Регистрация: 9-03-06
Пользователь №: 15 088



Все верно, так и происходит. Только первый байт я пишу в одном цикле записи, следующие 32 в другом. Счетчик буфера при новом цикле записи должен обнулится. А так не происходит!
Go to the top of the page
 
+Quote Post
rezident
сообщение May 17 2006, 12:33
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 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. Ну теперь-то надеюсь вы поняли? ninja.gif
Go to the top of the page
 
+Quote Post
CSB
сообщение May 17 2006, 16:36
Сообщение #13


Частый гость
**

Группа: Новичок
Сообщений: 100
Регистрация: 9-03-06
Пользователь №: 15 088



Вот теперь понял. Просто думал, что после установки адреса, счетчик считает 32 раза и адрес увеличивается нормально.

Теперь понятно почему вы спросили про выравнивание страниц.

Большое спасибо за ответы.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 15:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.0148 секунд с 7
ELECTRONIX ©2004-2016