Форум РадиоКот 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/ |