Я пытаюсь связаться с устройством с помощью SMBU. Я использую PIC18F26K83 и могу передавать данные. (Думаю.) Я проверяю I2CxCon0.B3, который является битом запроса основных данных, и он устанавливается программой. Это значит:
Главный конечный автомат делает паузу, пока данные не будут считаны / записаны для продолжения
(SCL выводится с низким уровнем)
Также я проверяю бит пустого буфера передачи, и он очищается программным обеспечением.
Так я могу быть уверен, что передача прошла успешно?
Затем я отправляю адрес чтения ведомому и проверяю бит состояния полного буфера приема. Он получает 1, поэтому я знаю, что получил данные. Тем не менее, все данные, которые я получаю, равны 0. Я запрашиваю состояние зарядки, и оно не может быть нулевым. Итак, мои вопросы, связанные с этим:
- Когда процессы передачи и получения будут выполнены, есть ли вероятность, что передача все еще повреждена? Я имею в виду неудачный.
- Перед включением главного стартового бита я загружаю регистр счета I2C. Я также добавляю в этот регистр адресный буфер? Например, мне нужно отправить данные 0x0D на адрес 0x16, а затем получить данные. В этом случае я сначала загружаю регистр счетчика 2, затем после передачи для процесса чтения загружаю 1. Это правильный путь?
- В чем может быть причина получения ложных данных? Я думаю, аппаратное обеспечение правильно, потому что передача и прием происходит Также конфигурации 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 ;
}