TI中文支持网
TI专业的中文技术问题搜集分享网站

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,会卡死。

user4619179:

主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);
}

Susan Yang:

首先请您参考文档

Using Feature Set of I2C Master on TM4C129x Microcontrollers

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

www.ti.com/…/spma073.pdf

包含了相应的代码

您可以在下面的链接下载

www.ti.com/…/spma073

user4619179:

回复 Susan Yang:

按照文档初始化IIC,示波器看不到波形,按道理发送起始信号要有波形的吧? 另外把TM4C129作为从机初始化有哪些区别,有没有相应的例程。官方库里的代码试了都没反应。

xyz549040622:

回复 user4619179:

对于从机来说,对SCL是没有任何控制能力的,SCL都是由主机发出的,你抓到SCL信号就不对了,抓不到才是正常的。

user4619179:

回复 xyz549040622:

我主从机都是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));

xyz549040622:

回复 user4619179:

你好,不知道你的问题是否已经解决呢?

user4619179:

回复 xyz549040622:

还没呢,硬件IIC用起来确实不太顺,一般的IIC器件之前一直都是用模拟IIC的,在stm32上也是。只是这次串口不够用要用两块TM4C129芯片之间通讯的。

赞(0)
未经允许不得转载:TI中文支持网 » TM4C129 硬件IIC从机问题?
分享到: 更多 (0)