This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

IIC配置连续接受2个字节数据

Other Parts Discussed in Thread: TM4C123GH6PM

TM4C123GH6PM

请问这样配置用问题吗?

怎么感觉采集到的数据有点怪?

/******************************* IIC *************************************//
//PORT : PA6-->SCL                                                         //
//       PA7-->SDA                                                         //
//*************************************************************************//

void I2C_init(void)//I2C初始化
{
  SysCtlPeripheralEnable( SYSCTL_PERIPH_I2C1);//使能I2C模块
  SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOA);//使能对应的I/O模块
 
  GPIOPinConfigure(GPIO_PA6_I2C1SCL);//配置相应的I/O管脚作为SCL/SDA
  GPIOPinConfigure(GPIO_PA7_I2C1SDA);
  GPIOPinTypeI2CSCL(GPIO_PORTA_BASE,GPIO_PIN_6);
  GPIOPinTypeI2C(GPIO_PORTA_BASE,GPIO_PIN_7);
  I2CMasterInitExpClk(I2C1_BASE,SysCtlClockGet(),true);//主机模式配置:频率80MHz=80 000 000,400kbp
  I2CMasterEnable(I2C1_BASE);//主机使能
}


int I2CRead(uint8 DevAddr,uint8 RegAddr)//写从机地址,寄存器地址,数据读取函数
{
      static int i2c_data=0;
      char i2c_getdata[2];
      uint8 i;
      I2CMasterSlaveAddrSet(I2C1_BASE, DevAddr, false);//与主机对应的从机地址设置,发送数据模式
      I2CMasterDataPut(I2C1_BASE, RegAddr);//发送一个字节的从机寄存器地址
      //while(I2CMasterBusy(I2C0_BASE));
      I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_START);//主机突发起始
      //I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_SINGLE_SEND);//主机单次发送
      while(I2CMasterBusy(I2C1_BASE));//等待总线空闲
      I2CMasterSlaveAddrSet(I2C1_BASE, DevAddr, true);//与主机对应的从机地寄存器址设置,接受数据模式
      I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_RECEIVE_START);//主机突发接受起始
      while(I2CMasterBusy(I2C1_BASE));//等待总线空闲
      for(i=0;i<2;i++)//接受两个字节数据
      {
        i2c_getdata[i]= I2CMasterDataGet(I2C1_BASE);//读取主机接受到的一个字节数据
        if(i<1)//如果接受字节<2,主机继续接受
          I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_RECEIVE_CONT);
        else//反之,结束接受
        {
          I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_RECEIVE_FINISH);
          while(I2CMasterBusy(I2C1_BASE));//等待主机空闲
          I2C_init();//方便下一次数据接受
        }
      }
      i2c_data=((int)i2c_getdata[1]<<8|i2c_getdata[0]);//2个字节数据转化为一个字的数据
      return i2c_data;//返回接受到数据
 
}