ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
24 ноября
914166
Nikolay_Po (04.04.2019 21:23 - 09.04.2019 20:57, просмотров: 2489) General
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         -      -