I2C прием, ложный прием данных в PIC - PullRequest
0 голосов
/ 08 апреля 2019

Я пытаюсь связаться с устройством с помощью SMBU. Я использую PIC18F26K83 и могу передавать данные. (Думаю.) Я проверяю I2CxCon0.B3, который является битом запроса основных данных, и он устанавливается программой. Это значит:

Главный конечный автомат делает паузу, пока данные не будут считаны / записаны для продолжения (SCL выводится с низким уровнем)

Также я проверяю бит пустого буфера передачи, и он очищается программным обеспечением.

Так я могу быть уверен, что передача прошла успешно?

Затем я отправляю адрес чтения ведомому и проверяю бит состояния полного буфера приема. Он получает 1, поэтому я знаю, что получил данные. Тем не менее, все данные, которые я получаю, равны 0. Я запрашиваю состояние зарядки, и оно не может быть нулевым. Итак, мои вопросы, связанные с этим:

  1. Когда процессы передачи и получения будут выполнены, есть ли вероятность, что передача все еще повреждена? Я имею в виду неудачный.
  2. Перед включением главного стартового бита я загружаю регистр счета I2C. Я также добавляю в этот регистр адресный буфер? Например, мне нужно отправить данные 0x0D на адрес 0x16, а затем получить данные. В этом случае я сначала загружаю регистр счетчика 2, затем после передачи для процесса чтения загружаю 1. Это правильный путь?
  3. В чем может быть причина получения ложных данных? Я думаю, аппаратное обеспечение правильно, потому что передача и прием происходит Также конфигурации I2C снова верны. Так в чем может быть причина?

Вот код приема: (А2 - светодиод, который я использую для отладки. Ничего особенного)

 void SMBus_Data(){
      I2C2STAT1.B2 = 1;      // CLRBF=1, EMPTIES TRANSMIT BUFFER,i.e. TXBE=1
      I2C2ADB1     = 0x16;    //Address for smart battery
      I2C2TXB      = 0x0E;    //Relative SOC

      while (!I2C2STAT0.B7) {}  // BUS FREE BFRE=1
      I2C2CNT     = 1;          //BYTE COUNT REGISTER
      I2C2CON0.B6 = 1;          //RSEN=1;

       //******START**********
      I2C2CON0.B5 = 1;  //MASTER START BIT

      while(!I2C2CON0.B3) {}   //Master Data request
      while(!I2C2Stat1.B5){}   //Transmit Buffer empty status bit.
      I2C2ADB1    = (0x16 | 0x01);
      I2C2CNT     = 1;
      I2C2CON0.B5 = 1;         //MASTER START BIT
      I2C2CON0.B6 = 0;         //RSEN=1;
      while(!I2C2stat1.B0){}   //RXBF Receive Buffer Full Status Bit
      Data_10 = I2C2TXB ;
 }

1 Ответ

0 голосов
/ 09 апреля 2019

Data_10 = I2C2TXB ; это должно было быть Data_10 = I2C2RXB;

...