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

 
 
> 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
Ответов
DimaM
сообщение May 29 2007, 07:59
Сообщение #2


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

Группа: Участник
Сообщений: 103
Регистрация: 17-12-06
Из: село
Пользователь №: 23 615



aduc848 не работал, но тем не менее кажется ошибка в его программе
функции типа i2c_rx(0); сам писал?
я когда то много времени потратил на i2c, пока application note не взял и не написал прерывание для i2c как в примере.
Go to the top of the page
 
+Quote Post
sls_
сообщение May 29 2007, 08:08
Сообщение #3


Участник
*

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



Цитата(DimaM @ May 29 2007, 11:59) *
aduc848 не работал, но тем не менее кажется ошибка в его программе
функции типа i2c_rx(0); сам писал?
я когда то много времени потратил на i2c, пока application note не взял и не написал прерывание для i2c как в примере.

Эти функции опробованы на часах и на двух рахличных датчиках:
void i2c_dly (void)
{
}

void i2c_start (void)
{
MDE=1; MDO=1;//bSDA = 1;
i2c_dly ();
MCO=1;//bSCL = 1;
i2c_dly ();
MDE=1; MDO=0;//bSDA = 0;
i2c_dly ();
MCO=0;//bSCL = 0;
i2c_dly ();
}
void i2c_stop (void)
{
MDE=1; MDO=0;//bSDA = 0;
i2c_dly ();
MCO=1;//bSCL = 1;
i2c_dly ();
MDE=1; MDO=1;//bSDA = 1;
i2c_dly ();
}

char i2c_rx(char ack)
{
char x, d=0;
MDE=1; MDO=1;//bSDA = 1;
for(x=0; x<8; x++)
{
d <<= 1;
do
{
MCO=1;//bSCL = 1;
i2c_dly ();
}
while(MCO==0); //SCL_IN==0
i2c_dly();
MDE=0;
if(MDI) d |= 1; //SDA_IN
MCO=0;//bSCL = 0;
}
if(ack){MDE=1; MDO=0;}// bSDA = 0;
else {MDE=1; MDO=1;}//bSDA = 1;
MCO=1;//bSCL = 1;
i2c_dly();
MCO=0;//bSCL = 0;
MDE=1; MDO=1;//bSDA = 1;
return d;
}

bit i2c_tx(unsigned char d)
{
char x;
static bit b;
for(x=8; x; x--)
{
if(d&0x80) {MDE=1; MDO=1;}//bSDA = 1;
else {MDE=1; MDO=0;}//bSDA = 0;
MCO=1;//bSCL = 1;
d <<= 1;
i2c_dly ();
MCO=0;//bSCL = 0;
i2c_dly ();
}
MDE=1; MDO=1;//bSDA = 1;
MCO=1;//bSCL = 1;
i2c_dly();
MDE=0;
b = MDI;//b = bSDA; //SDA_IN
MCO=0;//bSCL = 0;
return b;
}
Go to the top of the page
 
+Quote Post
DimaM
сообщение May 29 2007, 08:30
Сообщение #4


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

Группа: Участник
Сообщений: 103
Регистрация: 17-12-06
Из: село
Пользователь №: 23 615



извени лень с битиками разбиратся
просто попробуй задержки увеличить временно
Go to the top of the page
 
+Quote Post
sls_
сообщение May 29 2007, 08:37
Сообщение #5


Участник
*

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



Цитата(DimaM @ May 29 2007, 12:30) *
извени лень с битиками разбиратся
просто попробуй задержки увеличить временно

Понимаю.
задержки увеличивать пробовал, не помогло.
резисторы подтягивающие тоже менял от 4к до 100к разницы нет
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 05:44
Рейтинг@Mail.ru


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