TI Tiva Launchpad I2C错误

时间:2014-03-10 21:53:57

标签: i2c texas-instruments cortex-m

我正在尝试通过I2C与来自 TM4C123GXL Launchpad Pololu MinIMU9v2 进行通信,但每次我尝试写入总线时,我都会 I2C_MASTER_ERR_ADDR_ACK I2C_MASTER_ERR_DATA_ACK 。打印出从机地址表明它看起来是正确的,所以我认为这可能是我使用TI Launchpad驱动程序库时可能出错的。

这是初始化例程:

void
InitI2CBus(void)
{
    // Initialize the TM4C I2C hardware for I2C0
    SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
                   SYSCTL_XTAL_16MHZ);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
    GPIOPinConfigure(GPIO_PB2_I2C0SCL);
    GPIOPinConfigure(GPIO_PB3_I2C0SDA);
    GPIOPinTypeI2C(GPIO_PORTB_BASE, GPIO_PIN_3);
    // Initialize the bus
    I2CMasterInitExpClk(I2C0_BASE, SysCtlClockGet(), false);
}

以下是尝试从设备读取字节的代码:

uint8_t
ReadByte(uint8_t slaveAddr, uint8_t subAddr)
{
    // Write SUB
    slaveAddr |= 1; // Set LSB to writemode
    I2CMasterSlaveAddrSet(I2C0_BASE, slaveAddr, false);

    I2CMasterDataPut(I2C0_BASE, subAddr);
    I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_SINGLE_SEND);
    while(I2CMasterBusy(I2C0_BASE)) { }

    if (CheckError())
    {
        return 0;
    }

    // Read data
    slaveAddr &= ~1; // Set LSB to readmode
    I2CMasterSlaveAddrSet(I2C0_BASE, slaveAddr, true);
    I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);
    while(I2CMasterBusy(I2C0_BASE)) { }
    I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);
    while(I2CMasterBusy(I2C0_BASE)) { }

    uint8_t response = I2CMasterDataGet(I2C0_BASE);

    if (CheckError())
    {
        return 0;
    }

    return response;
}

任何想法我可能做错了什么?

1 个答案:

答案 0 :(得分:1)

我正忙着让我的I2C总线在这块电路板上工作。我不确定这是否是您的问题,但这是我使用的初始化代码(I' m在I2C2上):

1. SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C2);
2. SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
**3. GPIOPinTypeI2CSCL(GPIO_PORTF_BASE, GPIO_PIN_6);**
4. GPIOPinTypeI2C(GPIO_PORTF_BASE, GPIO_PIN_7);
5. GPIOPinConfigure(GPIO_PF6_I2C2SCL);
6. GPIOPinConfigure(GPIO_PF7_I2C2SDA);
7. I2CMasterInitExpClk(I2C2_BASE, SysCtlClockGet(), false);
8. I2CMasterSlaveAddrSet(I2C2_BASE, 0x48, false);

我能找到的大部分示例都缺少第3行,我发现你的代码中也缺少它。在我添加这条线之前,我无法让我的I2C总线做任何事情;添加之后,它至少会传输数据。

我不确定这是否是您问题的根源,但我认为如果有帮助我会将其传递给您。