И прочие почеркушки в массив WorkLog.
Т.е. мы пишем все статусы TWSR с лог, а потом, спустя какое то время (я
выбирал около 1с) сбрасываем его в терминал.
1
2
3
4
5
6
7
8
9
10
11
12
13
void LogOut(void) // Выброс логов
{
u08 i;
WorkLog[WorkIndex]= 0xFF;
WorkIndex++;
for(i=0;i!=WorkIndex+1;i++)
{
UDR = WorkLog[i];
_delay_ms(30);
}
}
Напрямую в UART данные пихать нельзя. Т.к. TWI автомат щелкает гораздо
быстрей чем UART может прожевать. И получится что что то потеряется, что
то перепутается. А так мы получаем четкую историю работы программы.
Понятно что происходит, где зацикливается передача, где не идет обмен.
Вот, например, мне Slave выдавал такие логи в хексах:
60 80 88 08 20 08 18 28 28 10 40 58 08 18 30
Сразу видно, по статусам, как прошел обмен. Как он получил байт от Master
(60 80 88). Как попытался достучаться до EEPROM, но та была занята
прожевыванием предыдущего байта (08 20). Как повторил попытку и
успешно записал в нее адрес и считал байт (08 18 28 28 10 40 58), а потом
отправил его другому контроллеру (08 18 30).
А отслеживать прохождение отдельных байт помогал осциллограф.
Показывая что творится на шине, есть ли там NACK/ACK и когда идет
ответы от Slave.
Кстати, пробовал, ради прикола, погонять пример в Proteus — выдал какую
то неадекватную муть. I2C анализатор вообще половину обмена прошляпил.