Столкнулся со странной проблемой при работе с I2C. Код прекрасно работающий в отладчике, отказывается работать в железе.
Есть вот такой код
TWI_START(); // В TWSR код 0х08 - Было сформировано состояние СТАРТ TWI_ADDR(0x74); // В TWSR код 0х18 - Был передан пакет SLA+W // и принято подтверждение (ACK) TWI_DATA(0x00); // А вот при передаче данных начинаются глюки.. // В TWSR код 0х10 (ПОВСТАРТ) или 0х20 (ПОВСТАРТ+NACK) ?? TWI_DATA(0x34); TWI_DATA(0x0C); TWI_DATA(0x06); TWI_DATA(0x35); TWI_DATA(0x03); TWI_DATA(0x04); TWI_DATA(0x08); TWI_DATA(0x10); TWI_DATA(0x42); TWI_DATA(0x97); TWI_STOP();
Как и главное почему после передачи байта данных появляется статус как после передачи стартового пакета??
Первый раз с таким сталкиваюсь. Тот же код, но на ассемблере работает прекрасно. Микроконтроллер и устройство с которым он связан исправны, проверял с прошивкой на ассемблере.
Код функций TWI
void TWI_START() { // Формирую состояние старт // Жду когда установится флаг TWINT // Отправляю статус по UART TWCR |= (1 << 7) | (1 << 5) | (1 << 2); while ( !( TWCR & (1 << 7))){} UDR = TWSR; } void TWI_ADDR(char temp) { // Загружаю адрес // Отправляю адрес // Жду когда установится флаг TWINT // Отправляю статус по UART TWDR = temp; TWCR |= (1 << 7) | (1 << 2); while ( !( TWCR & (1 << 7))){} UDR = TWSR; } void TWI_DATA(char temp) { // Загружаю байт данных // Отправляю данные // Жду когда установится флаг TWINT // Отправляю статус по UART TWDR = temp; TWCR |= (1 << 7) | (1 << 2); while ( !( TWCR & (1 << 7))){} UDR = TWSR; } void TWI_STOP() { // Формирую состояние СТОП TWCR |= (1 << 7) | (1 << 2) | (1 << 4); }
Глупая ошибка была.. Надо поменять все «|=» на «=». Первый раз писал на Си под AVR. Почему то решил, что надо так присваивать, в каком то исходнике увидел. :)
Код TWCR |= (1 < 7) | (1 < 2) в функции отправки данных устанавливал соответствующие биты в регистре TWCR, но при этом не обнулялись все остальные биты, в том числе и бит TWSTA отвечающий за старт и повстарт.
Следующим постом будет исходник конвертера UART -> I2C.

Похожие статьи
Нет отзывов к этой записи