I2C接收,PIC中的错误数据接收

时间:2019-04-08 07:08:11

标签: c embedded pic i2c

我正在尝试使用SMBU与设备进行通信。我使用PIC18F26K83,并且可以传输数据。 (我猜。)我检查了I2CxCon0.B3,它是主数据请求位,并由程序设置。这意味着:

  

主状态机暂停,直到读取/写入数据以继续   (SCL输出保持低电平)

我还要检查“发送缓冲区为空”位,然后软件将其清除。

那么我可以确定传输成功吗?

然后,我将读取地址发送到从设备,然后检查接收缓冲区已满状态位。它得到1,所以我知道我收到了数据。但是,我得到的所有数据都是0。我要求充电状态,并且不能为零。因此,我与此相关的问题是:

  1. 完成发送和接收过程后,传输是否仍会损坏?我的意思是不成功。
  2. 在启用主机启动位之前,我要加载I2C计数寄存器。是否也将这个寄存器添加到地址缓冲区?例如,我需要将数据0x0D发送到地址0x16,然后接收数据。在这种情况下,我先加载计数寄存器2,然后在传输读取过程后加载1。这是正确的方法吗?
  3. 错误数据接收的原因可能是什么?我猜硬件是正确的,因为发生了发送和接收。同样,I2C配置也正确。那是什么原因呢?

这是接收代码:(A2是我用于调试的led。没什么特别的)

 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 :(得分:0)

Data_10 = I2C2TXB ;应该是Data_10 = I2C2RXB;