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

 
 
> 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
Ответов
sls_
сообщение May 30 2007, 06:41
Сообщение #2


Участник
*

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



Да правильно:
MDO = ; //Data Output
MDE = ; //1-(Tx).0-(Rx).
MCO = ; //Clock Output
MDI = ; //Data Input
По поводу транзистора не уверен, в даташите не нашол. (ADuC848) хотя думаю что "i2c честный" - порты специальные
По данной Вами ссылке посмотрел но не очень понял, буду пробовать.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 30 2007, 07:35
Сообщение #3


Гуру
******

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



Цитата(sls_ @ May 30 2007, 09:41) *
По поводу транзистора не уверен, в даташите не нашол. (ADuC848) хотя думаю что "i2c честный" - порты специальные
Мда, доку на цифровые микросхемы аналоговые девицы писать не умеют. Эта такой же ужас как и на ADuC70xx sad.gif В общем я просмотрел описание, единственное упоминание не внесло ясности:
Цитата
Serial Interface Clock for the I2C Interface. As an input, this pin is a Schmitt- triggered input. A weak
internal pull-up is present on this pin unless it is outputting logic low. This pin can also be controlled in software as a digital output pin.

Serial Data Pin for the I2C Interface. As an input, this pin has a weak internal pull-up present unless it is outputting logic low.
Так в режиме вывода он пуш-пульный или открытый сток??? Если я понял все правильно, и в режиме мастера эти ноги работают в пуш-пульном режиме, то, похоже, и о работе I2C инженера этого модуля знают весьма поверхностно.

Придется вам проделать эксперимент - отпаяйте подтяжку на SDATA, выдайте единицу на эту ногу и подключая 10К резистор с этой ноги на плюс и на землю посмотрите, будет ли также меняться уровень на SDATA или он останется высоким.


--------------------
На любой вопрос даю любой ответ
"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 Текстовая версия Сейчас: 24th July 2025 - 01:55
Рейтинг@Mail.ru


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