Недавно решил сделать программный I2C для микроконтроллера STC89C52RC. Поковырялся в тырнете, работающих сразу примеров не нашел. Погрустил, почитал DiHalt-а, поковырялся в разных чужих листингах, и решил написать еще один.
И вроде даже написал. Для начала традиционно взял EEPROM AT24C32N (меньше не нашлось). Программа состоит из двух частей, первая пишет в микросхему байт по нулевому адресу, вторая часть читает его оттуда, и показывает на полосковом светодиодном индикаторе. Но заработало не очень. Первая часть программы работает нормально, байт пишется - в этом я убедился, прочитав микруху программатором. Читает и показывает тоже нормально - байт, записанный программатором или первой частю программы - читается. Но все вместе это не работает.
Я решил узнать где происходит затык, для этого я использовал светодиод на контакте P1.0 , строчку зажигания которого размещал в разных частях программы. После какой инструкции не зажигался - там и затык. Оказалось что после перехода к чтению, и отправки аппаратного адреса микрухи, подпрограмма отправки стоит и ждет нуля на линии SDA, который микросхема не выдает. Если пропустить ACK - выдает невесть что.
Чё с этим делать - не знаю. Всю циклограмму обращения к микрухе проверил на соответствие даташиту пошагово и побайтно, раз 5. Есть ощущение что микросхема криво инициализирована, потому не выставляет готовность. Но если неправильно, почему тогда части программы работают правильно. Что я сделал не так?


