2

我正在尝试通过 I2C 与TM4C123GXL Launchpad的Pololu MinIMU9v2进行通信,但每次我尝试写入总线时,我都会收到I2C_MASTER_ERR_ADDR_ACKI2C_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;
}

有什么想法我可能做错了吗?

4

1 回答 1

1

我花了很长时间让我的 I2C 总线在这个板上工作。我不确定这是否是您的问题,但这是我正在使用的初始化代码(我在 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 行,我注意到您的代码中也缺少第 3 行。在我添加这条线之前,我无法让我的 I2C 总线做任何事情;添加后它至少在传输数据。

我不确定这是否是您问题的根源,但我想我会通过它以防万一。

于 2014-03-19T00:11:16.153 回答