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.

TM4C129 硬件IIC从机问题?



这样初始化是否有问题,根据官方库来的:


/*
================================================================================
描述 :
输入 :
输出 :
================================================================================
*/
void IICxSlaveIntHandler(void)
{
I2CSlaveIntClear(IICx_BASE);
g_sWorkPort.recv_buff[g_sWorkPort.iRecv++]=I2CSlaveDataGet(IICx_BASE);
if(g_sWorkPort.iRecv>=PORT_BUFF_SIZE)
{
g_sWorkPort.iRecv=0;
}
}

/*
================================================================================
描述 : IIC从模式初始化
输入 :
输出 :
================================================================================
*/
void mcu_port_iic_slave_init(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C8);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
GPIOPinConfigure(GPIO_PD2_I2C8SCL);
GPIOPinConfigure(GPIO_PD3_I2C8SDA);
GPIOPinTypeI2CSCL(GPIO_PORTD_BASE, GPIO_PIN_2);
GPIOPinTypeI2C(GPIO_PORTD_BASE, GPIO_PIN_3);

I2CIntRegister(IICx_BASE, IICxSlaveIntHandler);//接收中断注册
IntEnable(INT_I2C8);
I2CSlaveIntEnableEx(IICx_BASE, I2C_SLAVE_INT_DATA);

I2CMasterInitExpClk(IICx_BASE, 120000000, true);

I2CSlaveEnable(IICx_BASE);
I2CSlaveInit(IICx_BASE, SLAVE_ADDRESS);

// I2CMasterSlaveAddrSet(I2C0_BASE, SLAVE_ADDRESS, false);
// IntMasterEnable();
}

头文件定义:

#define IICx_BASE I2C8_BASE

#define PORT_BUFF_SIZE 200

#define SLAVE_ADDRESS 0x3C

typedef struct
{
u8 recv_buff[PORT_BUFF_SIZE];
u16 iRecv;
}WorkPortStruct;

主机方面也是TM4C129,但是用的是模拟的IIC,根据反馈,从机IIC没有应答,所以想先确定从机的初始化是否有问题。另外,模拟的IIC原来一直有用来驱动eeprom等设备了,应该没问题。  如果主机用硬件IIC,会卡死。

  • 主TM4C129的初始化代码

    /*
    ================================================================================
    描述 : IIC主模式初始化
    输入 :
    输出 :
    ================================================================================
    */
    void mcu_port_iic_master_init(void)
    {
    SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C8);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
    GPIOPinConfigure(GPIO_PD2_I2C8SCL);
    GPIOPinConfigure(GPIO_PD3_I2C8SDA);
    GPIOPinTypeI2CSCL(GPIO_PORTD_BASE, GPIO_PIN_2);
    GPIOPinTypeI2C(GPIO_PORTD_BASE, GPIO_PIN_3);
    I2CMasterInitExpClk(IICx_BASE, 120000000, false);
    I2CMasterSlaveAddrSet(IICx_BASE, SLAVE_ADDRESS, false);
    }
  • 首先请您参考文档

    Using Feature Set of I2C Master on TM4C129x Microcontrollers

    这个文档主要是针对I2C的主机的

    www.ti.com/.../spma073.pdf

    包含了相应的代码

    您可以在下面的链接下载

    www.ti.com/.../spma073
  • 按照文档初始化IIC,示波器看不到波形,按道理发送起始信号要有波形的吧? 另外把TM4C129作为从机初始化有哪些区别,有没有相应的例程。官方库里的代码试了都没反应。
  • 对于从机来说,对SCL是没有任何控制能力的,SCL都是由主机发出的,你抓到SCL信号就不对了,抓不到才是正常的。
  • 我主从机都是TM4C,现在是 主机每隔5s发送一次数据,按道理在这发送过程中是要有脉冲的吧?
    我用回环模式测试 可以,代码如下:
    /*
    ================================================================================
    描述 :
    输入 :
    输出 :
    ================================================================================
    */
    void I2C_Test(void)
    {
    uint8_t pui32DataTx[NUM_I2C_DATA];
    uint8_t pui32DataRx[NUM_I2C_DATA];
    uint8_t ui32Index;

    SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C8);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
    GPIOPinConfigure(GPIO_PD2_I2C8SCL);
    GPIOPinConfigure(GPIO_PD3_I2C8SDA);
    GPIOPinTypeI2CSCL(GPIO_PORTD_BASE, GPIO_PIN_2);
    GPIOPinTypeI2C(GPIO_PORTD_BASE, GPIO_PIN_3);

    I2CLoopbackEnable(I2C8_BASE);

    // I2CIntRegister(I2C0_BASE, I2C0SlaveIntHandler);//接收中断注册
    // IntEnable(INT_I2C0);
    // I2CSlaveIntEnableEx(I2C0_BASE, I2C_SLAVE_INT_DATA);

    I2CMasterInitExpClk(I2C8_BASE, 120000000, false);

    I2CSlaveEnable(I2C8_BASE);
    I2CSlaveInit(I2C8_BASE, SLAVE_ADDRESS);
    I2CMasterSlaveAddrSet(I2C8_BASE, SLAVE_ADDRESS, false);

    for(ui32Index = 0; ui32Index < NUM_I2C_DATA; ui32Index++)
    {
    pui32DataRx[ui32Index] = 0;
    pui32DataTx[ui32Index] = 'A'+ui32Index;
    }
    printf("Tranferring from: Master -> Slave\n");
    printf_hex("pui32DataRx= ", pui32DataRx, NUM_I2C_DATA);
    printf_hex("pui32DataTx= ", pui32DataTx, NUM_I2C_DATA);

    for(ui32Index = 0; ui32Index < NUM_I2C_DATA; ui32Index++)
    {
    printf(" Sending: '%c' . . . ", pui32DataTx[ui32Index]);
    I2CMasterDataPut(I2C8_BASE, pui32DataTx[ui32Index]);
    I2CMasterControl(I2C8_BASE, I2C_MASTER_CMD_SINGLE_SEND);
    while(!(I2CSlaveStatus(I2C8_BASE) & I2C_SLAVE_ACT_RREQ))
    {
    }
    pui32DataRx[ui32Index] = I2CSlaveDataGet(I2C8_BASE);
    while(I2CMasterBusy(I2C8_BASE))
    {
    }
    printf("Received: '%c'\n", pui32DataRx[ui32Index]);
    }
    for(ui32Index = 0; ui32Index < NUM_I2C_DATA; ui32Index++)
    {
    pui32DataRx[ui32Index] = 0;
    }
    printf("\n\nTranferring from: Slave -> Master\n");

    I2CMasterSlaveAddrSet(I2C8_BASE, SLAVE_ADDRESS, true);
    I2CMasterControl(I2C8_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);

    while(!(I2CSlaveStatus(I2C8_BASE) & I2C_SLAVE_ACT_TREQ))
    {
    }

    for(ui32Index = 0; ui32Index < NUM_I2C_DATA; ui32Index++)
    {
    printf(" 222 Sending: '%c' . . . ", pui32DataTx[ui32Index]);
    I2CSlaveDataPut(I2C8_BASE, pui32DataTx[ui32Index]);
    I2CMasterControl(I2C8_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);
    while(!(I2CSlaveStatus(I2C8_BASE) & I2C_SLAVE_ACT_TREQ))
    {
    }
    pui32DataRx[ui32Index] = I2CMasterDataGet(I2C8_BASE);
    printf("222 Received: '%c'\n", pui32DataRx[ui32Index]);
    }
    printf("\nDone.\n\n");
    }


    但是真是设备就是通讯不上;
    主机代码:

    /*
    ================================================================================
    描述 : IIC主模式初始化
    输入 :
    输出 :
    ================================================================================
    */
    void mcu_port_iic_master_init(void)
    {

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C8);

    GPIOPinConfigure(GPIO_PD2_I2C8SCL);
    GPIOPinConfigure(GPIO_PD3_I2C8SDA);
    GPIOPinTypeI2CSCL(GPIO_PORTD_BASE, GPIO_PIN_2);
    GPIOPinTypeI2C(GPIO_PORTD_BASE, GPIO_PIN_3);


    I2CMasterInitExpClk(I2C8_BASE, 120000000, false);
    I2CMasterEnable(I2C8_BASE);
    I2CMasterSlaveAddrSet(I2C8_BASE, SLAVE_ADDRESS, false);

    printf("iic_master_init ok!\n");

    }


    /*
    ================================================================================
    描述 : 主机发送
    输入 :
    输出 :
    ================================================================================
    */
    int mcu_port_iic_send(u8 *buff, u16 len)
    {
    u16 i;
    u32 delay_value=0;

    if(len==0)
    return 0;
    printf("mcu_port_iic_send\n");
    for(i=0; i<len; i++)
    {
    delay_value=0;
    I2CMasterDataPut(I2C8_BASE, buff[i]);
    I2CMasterControl(I2C8_BASE, I2C_MASTER_CMD_SINGLE_SEND);
    while(I2CMasterBusy(I2C8_BASE) && delay_value++<5000);
    }
    return len;
    }

    从机代码:
    /*
    ================================================================================
    描述 : IIC从模式初始化
    输入 :
    输出 :
    ================================================================================
    */
    void mcu_port_iic_slave_init(void)
    {
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C8);

    GPIOPinConfigure(GPIO_PD2_I2C8SCL);
    GPIOPinConfigure(GPIO_PD3_I2C8SDA);
    GPIOPinTypeI2CSCL(GPIO_PORTD_BASE, GPIO_PIN_2);
    GPIOPinTypeI2C(GPIO_PORTD_BASE, GPIO_PIN_3);

    I2CSlaveEnable(I2C8_BASE);
    I2CSlaveInit(I2C8_BASE, SLAVE_ADDRESS);

    printf("mcu_port_iic_slave_init!\n");
    }

    主函数调用卡在这里:
    while(!(I2CSlaveStatus(I2C8_BASE) & I2C_SLAVE_ACT_RREQ));
    printf("IIC recv =0x%02X", I2CSlaveDataGet(I2C8_BASE));
  • 你好,不知道你的问题是否已经解决呢?
  • 还没呢,硬件IIC用起来确实不太顺,一般的IIC器件之前一直都是用模拟IIC的,在stm32上也是。只是这次串口不够用要用两块TM4C129芯片之间通讯的。