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

 
 
> AT24C512 и ADuC848, проблемма с чтением
sls_
сообщение May 29 2007, 07:35
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 4-03-07
Пользователь №: 25 875



Всем привет, нужна помощь.
Память АТ24С512 и часы D1340 подключены к ADuC848 по I2C.
Проблемма: при чтении из памяти по байтно при единичном чтении из любой ячейки чтение корректно, но как только начинаю читать этой же функцией несколько байт подряд значения зависят от прдидущего прочитанного байта. Т.е. если предидущий прочитанный байт содержит чотное число следующее читается верно, если не четное то прочитанное число на 128 больше.
Пример:
Ячейка Записываю Считываю
----0-----------0------------0
----1-----------1------------1
----2-----------2----------130
----3-----------3------------3
----4-----------4----------132
Такое ощущение что младший бит предидущего байта попадает в старший последующего.
Пробовал читать страницами эфект тотже. С часов висящих на том же порту читаю все значения корректны.
функции для чтения записи:
#define EEPROM_BUS_ADDRESS 0xA0
void write_byte_eeprom (unsigned int address, unsigned char datas)
{
i2c_start();
i2c_tx(EEPROM_BUS_ADDRESS);
i2c_tx((unsigned char)address>>8);
i2c_tx((unsigned char)address);
i2c_tx(datas);
i2c_stop();
}
unsigned char read_byte_eeprom (unsigned int address)
{
unsigned char datas;
i2c_start();
i2c_tx(EEPROM_BUS_ADDRESS);
i2c_tx((unsigned char)address>>8);
i2c_tx((unsigned char)address);
i2c_start();
i2c_tx(EEPROM_BUS_ADDRESS | 1);
datas = i2c_rx(0);
i2c_stop();
return datas;
}
Буду благодарен за любую помощь.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение May 29 2007, 18:41
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(sls_ @ May 29 2007, 10:35) *
datas = i2c_rx(0);
i2c_stop();
Вот тут у вас ошибка. При приеме последнего байта вы должны ответить NACK, иначе при определенных условиях не сможете сформировать стоп. Условие просто - если в следующем байте в памяти старший бит равен нулю. Память начнет выдавать его на шину сразу после ACK и не даст вам сформировать стоп - высокий уровень на SDA не появится. Не работал с 848, поэтому запутался в MDO/MDE в вашем исходнике. На всякий случай посмотрите еще вот это сообщение.

P.S. ой, извиняюсь, не обратил внимания на строчки
Код
if(ack){MDE=1; MDO=0;}// bSDA = 0;
else {MDE=1; MDO=1;}//bSDA = 1;
Ответ снимаю...

А правильно ли я понимаю, что MDE=1 настраивает ногу на вывод? И правильно ли я догадываюсь, что этот порт у 848 "честный", т.е. с верхним транзистором? Тогда в сообщении по ссылке скорее всего и описан корень вашей проблемы. Если нет, объясните кратенько назначение MDE и MDO, я попробую проанализировать ваш исходник детально.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



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

 


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


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