Например TDA7294

Форум РадиоКот :: Просмотр темы - Не работает I2C. Нет сигнала подтверждения. Help!
Форум РадиоКот
https://radiokot.ru/forum/

Не работает I2C. Нет сигнала подтверждения. Help!
https://radiokot.ru/forum/viewtopic.php?f=20&t=71078
Страница 1 из 1

Автор:  kushman [ Пт май 04, 2012 17:16:10 ]
Заголовок сообщения:  Не работает I2C. Нет сигнала подтверждения. Help!

В общем, товарищи, столкнулся с данной проблемой. Микроконтроллер - ADuC845 (отладочная плата) соединен с E2PROM памятью от ATMEL и часами DS1307 по I2C. Соединения проверял неоднократно, все верно. После передачи стартового условия и первого байта, на девятом такте приемное устройство не хочет давать сигнал подтверждения приема, независимо от того, память это, или часы. Подозреваю, что проблема в программе, но вот где собака порылась найти не могу :( Ниже выкладываю код программы (полезную часть), надеюсь на Вашу помощь :)


....

sbit SDA=P3^3;
sbit SCL=P3^5;

...

void I2C_Start(void) {

SDA=1;
SCL=1;
delay();
if(SDA==0) {er=1;};
if(SCL==0) {er=1;};
if(er==1) {send_lcd_symbol(set_second_line+4, 'X');};
SDA=0;
delay();
SCL=0;

}

void I2C_Send_byte(char byte) {

unsigned int bits;
for(bits=0; bits<8;bits++) {
if((byte&0x80)==0x80) {
SDA=1;
delay();
SCL=1;
delay();
SCL=0;
send_lcd_symbol(set_first_line+bits, '1');
}
else {
SDA=0;
delay();
SCL=1;
delay();
SCL=0;
send_lcd_symbol(set_first_line+bits, '0');
};
byte=byte<<1;
}
SDA=1;
delay();
SCL=1;
delay();
if(SDA==0) {
NOACK=1;
send_lcd_symbol(set_second_line, 'A');
} else {
NOACK=0;
send_lcd_symbol(set_second_line, 'E');
}
SCL=0;
}

...


void main(void) {


En=0;
RW=0;
LCD_Init();
SDA=1;
SCL=1;
I2C_Start();
I2C_Send_byte(0xA1);
while(1) {}
}


PS. Для понятия того, что ТАМ творится, использую ЖКИ, поэтому пусть он Вас не смущает =)

Автор:  Финский [ Пт май 04, 2012 22:25:18 ]
Заголовок сообщения:  Re: Не работает I2C. Нет сигнала подтверждения. Help!

Насколько я знаю, (извините, если глупость сморозю:) по стандарту I2C для передачи "1" нельзя внаглую выставлять на ножке мастера высокий уровень. Нужно перевести вывод порта на вход, и дождаться пока подтягивающие резисторы поднимут шину в "1". У вас в коде
Код:
SDA=1;
 SCL=1;
 delay();
 if(SDA==0) {er=1;};
 if(SCL==0) {er=1;};

непонятно. Ставим SCL и SDA в "1" и тут же проверяем их на "0"

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/