Переделал под CVAVR. Теоретически все работает, но с некоторыми багофичами неприятными. Может кто сталкивался?
1) В указаных апноутах функционал I2C реализован не полностью. Например на мастере можно только Послать N байт (старт, серия байт с подтверждением, стоп) или принять N байт (Старт, прием неск байт, стоп). А например для нормальной работы с ЕЕПРОМом нужно не делая стоп, выполнять повторный старт и т.д. Ну это ладно, я допишу, это несложно.
2) С учетом пункта 1 пока сделал функцию записи 1 байта в ЕЕПРОМ и функцию чтения 1 байта. Функции работают, проверял. Но при попытке записать много байт, вызывая эту функцию в цикле возникает проблема.
- Код: Выделить всё
// Функция записи 1 байта
unsigned char twi_eeprom_write1b(unsigned int addr, unsigned char byte)
{
unsigned int w;
messageBuf[0] = 0b10101110; // Адрес Slave(ЕЕПРОМ) + БитЗапись
messageBuf[1] = (unsigned char)(addr >> 8); // Старший байт адреса
messageBuf[2] = (unsigned char)(addr & 0xff); // Младший байт адреса
messageBuf[3] = byte; // 1 байт
TWI_Start_Transceiver_With_Data( messageBuf, 3+1 );
while(TWI_Transceiver_Busy()) continue;
//delay_ms(3); - Про эту строку подробней дальше
return(TWI_statusReg.lastTransOK); // Возвращается статус операции - удачно записано или нет.
}
Если эту функцию вызывать 1 раз - проблем нет, все работает.
Если в цикле, например 1 кБайт переслать, то функция возвращает true только примерно каждые 16 байт
Если раскомментировать строку с задержкой - то все ок, 100% возврат true.
Далее!!!
если вместо задержки написать следующее:
- Код: Выделить всё
if(TWI_statusReg.lastTransOK==0) delay_ms(3);
Т.е. вставлять задержку только если операция неудачно завершилась, то опять только каждый 16й байт успешно записан. Пробовал играть со скоростью в настройках I2C. Менял от 32 кГц до 400 кГц - это ничего не меняет. А постаянная задержка в 3мс это очень медленно получается.
3) Пробовал соединить 2 МК, один мастер, другой слейв. Пересылка по 1 байту работает, по 2-4 работает, а вот начиная с 5 байт данные не передаются.