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.

LM4F120H5QR的I2C问题



最近愁于I2C,例程实在太少了,,,

一个器件的I2C为:

写地址是0XA6.

初始化代码为:

  ROM_SysCtlClockSet(SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ |           //80mhz
                       SYSCTL_OSC_MAIN);
  SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0);
  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
  GPIOPinConfigure(GPIO_PB2_I2C0SCL);
  GPIOPinConfigure(GPIO_PB3_I2C0SDA);
  GPIOPinTypeI2C(GPIO_PORTB_BASE,  GPIO_PIN_3);
  GPIOPinTypeI2CSCL(GPIO_PORTB_BASE, GPIO_PIN_2 );
  I2CMasterInitExpClk(I2C0_MASTER_BASE, SysCtlClockGet(), true);        //400kbps
  I2CMasterEnable(I2C0_MASTER_BASE);

应该没问题吧...

可往往下就不会写了...

对这几个函数十分不明白

 I2CMasterSlaveAddrSet (unsigned long ulBase, unsigned char ucSlaveAddr, tBoolean bReceive)

这个函数是设置从器件的地址的吧??最后一个参数定义是写地址还是读地址..

 I2CMasterSlaveAddrSet(I2C0_MASTER_BASE,0XA6,false);此处应该这样写吧??

还有就是这两个函数

  I2CMasterControl
  I2CMasterDataPut

如果要对器件0x45这个8位寄存器读一个字节,那这个程序应该怎么写呢?

那如果多0x46这个寄存器读4个字节呢?

谢谢~

  • 1.  I2CMasterSlaveAddrSet (unsigned long ulBase, unsigned char ucSlaveAddr, tBoolean bReceive)

         最后一个参数用来指示发送写命令还是读命令。 为0 表示发送写命令,为1表示发送读命令。

    2.   I2CMasterDataPut(I2C0_BASE, DAT);把要写的数据写放到发送寄存器中

           I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_SINGLE_SEND); 把要写的数据单次或连续发送到总线上.

    3. 对器件0X45的寄存器读操作应该这样写:

    I2CMasterSlaveAddrSet(I2C0_BASE, ulSlaveAddr, 0);  //其中ulSlaveAddr 为I2c从设备的地址.

    I2CMasterDataPut(I2C0_BASE, 0x45);   // 0X45为设备寄存器地址

    I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_SINGLE_SEND); 

    I2CMasterSlaveAddrSet(I2C0_BASE, ulSlaveAddr, 1);  //其中ulSlaveAddr 为I2c从设备的地址.

    pui32DataRx = I2CSlaveDataGet(I2C0_BASE);   

    中间略掉了ACK应答判断。

  • 补充一下,关于API函数的及参数的具体解释,请参考具体的library guide  下面附上地址:

    http://www.ti.com/lit/ug/spmu298/spmu298.pdf

  • 经过调试

    正确的方式应该是:

    unsigned int ADXL_Single_Read(unsigned int reg)
    {
      unsigned int back;
      I2CMasterSlaveAddrSet(I2C0_MASTER_BASE,SlaveAddress,false);
      I2CMasterDataPut(I2C0_MASTER_BASE,reg);
      I2CMasterControl(I2C0_MASTER_BASE,I2C_MASTER_CMD_BURST_SEND_START);
      while(I2CMasterBusy(I2C0_MASTER_BASE));
      I2CMasterSlaveAddrSet(I2C0_MASTER_BASE,SlaveAddress,true);
      I2CMasterControl(I2C0_MASTER_BASE,I2C_MASTER_CMD_SINGLE_RECEIVE);
      while(I2CMasterBusy(I2C0_MASTER_BASE));
      back=I2CMasterDataGet(I2C0_MASTER_BASE);
      return(back);
    }

    多谢回答