I2C мастер, что на PIC24HJ, что на dsPIC30F, не вызывает прерываний по завершению "СТОП" [РАЗОБРАЛСЯ] см. ниже сообщение "РЕШЕНИЕ ПРОБЛЕМЫ". после неподтверждения адреса. Задача модифицировать существующий, уже изготовленный продукт, поэтому замену чипа не предлагать.
Пишу страницу в I2C EEPROM AT24C64, посылки по 34 байта. Два байта - адрес записи, 32 - собственно, данные. Работа по прерываниям. Нужно записать несколько страниц в EEPROM без лишнего ожидания. Идея такова: после каждой предыдущей страницы, пытаться писать следующую снова и снова, до тех пор, пока память не станет готова и не даст подтверждение на управляющее слово (7 бит адреса плюс бит запись/чтение). EEPROM не даёт подтверждения на байт с адресом, что идёт сразу после нового старта. Это нормально. После NACK на адрес от EEPROM и генерации стопа мастером, по окончанию стопа, должно сработать прерывание мастера. Но его нет.
После нормального стопа, что следует за нормальной транзакцией с подтверждением от ведомого, например, после 32-го байта данных, прерывание мастера срабатывает как положено. Однако после стопа мастера, что идёт за NACK ведомого, прерывания нет. При этом опрос бита "P" регистра I2CSTAT показывает, что бит устанавливается как положено, когда положено.
Мало того, даже разрешение прерываний ведомого (работает отдельно параллельно и независимо от мастера) не даёт прерывания на стоп после NACK, несмотря на установку бита "P".
В таблице последовательность обмена. После прерывания № 37, в котором запускается состояние "СТОП", больше прерываний не следует.
ISR # ISR cause Action New state Byte Data byte 1 TRB insert TRB loading. Generate start. S_MASTER_SEND_ADDR - - 2 Start ended Transmit Address S_MASTER_SEND_DATA 1 - 3 Addres send complete Address Ack check. Transmit next byte S_MASTER_SEND_DATA 2 1 4 Byte send complete Data Ack check. Transmit next byte S_MASTER_SEND_DATA 3 2 5 Byte send complete Data Ack check. Transmit next byte S_MASTER_SEND_DATA 4 3 6 Byte send complete Data Ack check. Transmit next byte S_MASTER_SEND_DATA 5 4 7 Byte send complete Data Ack check. Transmit next byte S_MASTER_SEND_DATA 6 5 8 Byte send complete Data Ack check. Transmit next byte S_MASTER_SEND_DATA 7 6 9 Byte send complete Data Ack check. Transmit next byte S_MASTER_SEND_DATA 8 7 10 Byte send complete Data Ack check. Transmit next byte S_MASTER_SEND_DATA 9 8 11 Byte send complete Data Ack check. Transmit next byte S_MASTER_SEND_DATA 10 9 12 Byte send complete Data Ack check. Transmit next byte S_MASTER_SEND_DATA 11 10 13 Byte send complete Data Ack check. Transmit next byte S_MASTER_SEND_DATA 12 11 14 Byte send complete Data Ack check. Transmit next byte S_MASTER_SEND_DATA 13 12 15 Byte send complete Data Ack check. Transmit next byte S_MASTER_SEND_DATA 14 13 16 Byte send complete Data Ack check. Transmit next byte S_MASTER_SEND_DATA 15 14 17 Byte send complete Data Ack check. Transmit next byte S_MASTER_SEND_DATA 16 15 18 Byte send complete Data Ack check. Transmit next byte S_MASTER_SEND_DATA 17 16 19 Byte send complete Data Ack check. Transmit next byte S_MASTER_SEND_DATA 18 17 20 Byte send complete Data Ack check. Transmit next byte S_MASTER_SEND_DATA 19 18 21 Byte send complete Data Ack check. Transmit next byte S_MASTER_SEND_DATA 20 19 22 Byte send complete Data Ack check. Transmit next byte S_MASTER_SEND_DATA 21 20 23 Byte send complete Data Ack check. Transmit next byte S_MASTER_SEND_DATA 22 21 24 Byte send complete Data Ack check. Transmit next byte S_MASTER_SEND_DATA 23 22 25 Byte send complete Data Ack check. Transmit next byte S_MASTER_SEND_DATA 24 23 26 Byte send complete Data Ack check. Transmit next byte S_MASTER_SEND_DATA 25 24 27 Byte send complete Data Ack check. Transmit next byte S_MASTER_SEND_DATA 26 25 28 Byte send complete Data Ack check. Transmit next byte S_MASTER_SEND_DATA 27 26 29 Byte send complete Data Ack check. Transmit next byte S_MASTER_SEND_DATA 28 27 30 Byte send complete Data Ack check. Transmit next byte S_MASTER_SEND_DATA 29 28 31 Byte send complete Data Ack check. Transmit next byte S_MASTER_SEND_DATA 30 29 32 Byte send complete Data Ack check. Transmit next byte S_MASTER_SEND_DATA 31 30 33 Byte send complete Data Ack check. Transmit next byte S_MASTER_SEND_DATA 32 31 34 Byte send complete Data Ack check. Generate stop S_MASTER_IDLE 33 32 35 Stop ended TRB loading. Generate start S_MASTER_SEND_ADDR - - 36 Start ended Transmit Address S_MASTER_SEND_DATA 34 - 37 Address send complet Check acknowledge. None Ack. Generate stop. S_MASTER_IDLE - -
-
- РЕШЕНИЕ ПРОБЛЕМЫ: Nikolay_Po(680 знак., 09.04.2019 20:56 - 21:03)
- Колхозить свой сторожевой таймер. Нет ответа - создавать своё прерывание. - De_User(04.04.2019 22:54)