Ошибки I2C панели запуска TI TivaC

Я пытаюсь связаться по I2C с Pololu MinIMU9v2 с TM4C123GXL Launchpad, но каждый раз, когда я пытаюсь записать в шину, я получаю 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;
}

Любые идеи, что я могу делать неправильно?


person Bobby    schedule 10.03.2014    source источник


Ответы (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 отсутствовала в большинстве примеров, которые мне удалось найти, и я заметил, что ее нет и в вашем коде. Прежде чем я добавил эту строку, я не мог заставить свою шину I2C что-либо делать; после его добавления это как минимум передача данных.

Я не уверен, является ли это источником вашей проблемы или нет, но подумал, что передам его, если это поможет.

person Paul Van Wieren    schedule 19.03.2014
comment
Собственно в этом и была проблема. Я узнал об этом на форумах TI и забыл опубликовать это здесь. Хотелось бы, чтобы у них было несколько полнофункциональных примеров, демонстрирующих нормальные варианты использования, но, по крайней мере, сейчас я нахожу больше помощи на форумах, чем где бы то ни было. Спасибо за продолжение! - person Bobby; 19.03.2014