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

TMS320C55X 的I2C驱动程序配置问题

我刚学DSP没多久,在配置I2C驱动程序。遇到的问题是:从机可以检测到数据并且进入接受中断程序,但是无法收到数据,不知道主机发送的数据是什么.。

程序如下:

主机配置程序:

//I2C
/* Initialize I2C module */
I2C_init(CSL_I2C0);
/* Setup I2C module */
i2cSetup.addrMode = CSL_I2C_ADDR_7BIT;
i2cSetup.bitCount = CSL_I2C_BC_8BITS;
i2cSetup.loopBack = CSL_I2C_LOOPBACK_DISABLE;
i2cSetup.freeMode = CSL_I2C_FREEMODE_DISABLE;
i2cSetup.repeatMode = CSL_I2C_REPEATMODE_DISABLE;
i2cSetup.ownAddr = Master_ADDR;//CSL_I2C_OWN_ADDR;
i2cSetup.sysInputClk = CSL_I2C_SYS_CLK;
i2cSetup.i2cBusFreq = CSL_I2C_BUS_FREQ;
startStop = ((CSL_I2C_START) | (CSL_I2C_STOP));
I2C_setup(&i2cSetup);

/* Disable CPU Interrupts */
IRQ_globalDisable();
/* Clear any pending interrupts */
IRQ_clearAll();
/* Disable all the interrupts */
IRQ_disableAll();
/* Set the interrupt vector start address */
IRQ_setVecs((Uint32)(&VECSTART));
/* Plug the I2C Isr into vector table */
IRQ_plug(I2C_EVENT, &i2c_isr);
/* Enable I2C Interrupts */
IRQ_enable(I2C_EVENT);
/* Enable CPU Interrupts */
IRQ_globalEnable();
I2C_eventEnable(CSL_I2C_EVENT_ICRRDY);//打开接受中断

主机发送程序:

module_init();
gI2cWrBuf[0] = 0x01;
gI2cWrBuf[1] = 0x02;

for(looper = 0; looper < CSL_I2C_DATA_SIZE; looper++)
{
gI2cWrBuf[looper + CSL_EEPROM_ADDR_SIZE] = looper;
gI2cRdBuf[looper] = 0x0000;
}
gI2cWrBuf[2] = 0x03;
/* Write data */
//I2C_write(gI2cWrBuf, (CSL_I2C_DATA_SIZE + CSL_EEPROM_ADDR_SIZE),CSL_I2C_EEPROM_ADDR, TRUE, startStop,CSL_I2C_MAX_TIMEOUT);
I2C_write(gI2cWrBuf, 2,Slave_ADDR1, TRUE, startStop,CSL_I2C_MAX_TIMEOUT);

从机配置程序:

/* Initialize I2C module */
I2C_init(CSL_I2C0);
/* Setup I2C module */
i2cSetup.addrMode = CSL_I2C_ADDR_7BIT;
i2cSetup.bitCount = CSL_I2C_BC_8BITS;
i2cSetup.loopBack = CSL_I2C_LOOPBACK_DISABLE;
i2cSetup.freeMode = CSL_I2C_FREEMODE_DISABLE;
i2cSetup.repeatMode = CSL_I2C_REPEATMODE_DISABLE;
//i2cSetup.ownAddr = CSL_I2C_OWN_ADDR;
i2cSetup.ownAddr = Slave_ADDR1;
i2cSetup.sysInputClk = CSL_I2C_SYS_CLK;
i2cSetup.i2cBusFreq = CSL_I2C_BUS_FREQ;
startStop = ((CSL_I2C_START) | (CSL_I2C_STOP));
I2C_setup(&i2cSetup);
/* Disable CPU Interrupts */
IRQ_globalDisable();
/* Clear any pending interrupts */
IRQ_clearAll();
/* Disable all the interrupts */
IRQ_disableAll();
/* Set the interrupt vector start address */
IRQ_setVecs((Uint32)(&VECSTART));
/* Plug the I2C Isr into vector table */
IRQ_plug(I2C_EVENT, &i2c_isr);
/* Enable I2C Interrupts */
IRQ_enable(I2C_EVENT);
/* Enable CPU Interrupts */
IRQ_globalEnable();
I2C_eventEnable(CSL_I2C_EVENT_ICRRDY);//打开接受中断

从机接收中断:

interrupt void i2c_isr(void)
{
I2C_flag=1;
IRQ_disable(I2C_EVENT);
/* Read data */
I2C_read(gI2cRdBuf, 1, Master_ADDR, gI2cWrBuf, 1, FALSE, startStop, CSL_I2C_MAX_TIMEOUT, FALSE);//从机接收
IRQ_enable(I2C_EVENT);
}
//////////////////////////////////////////////////////////////

希望可以做出指导,谢谢

Shine:

请问具体用的是哪款C55x器件?可以用示波器抓一下I2C管脚线上的时序,看一下主机有没有数据发出来?

,

user6441590:

谢谢你的回答,C5535,示波器抓过了,有数据发出,从机的ICDRR寄存器可以收到数据,现在通过读寄存器可以接受单个数据,使用CSL库的I2C_read函数读不出来数,I2C_read函数配置感觉没有错,现在找不到问题在哪里

,

Shine:

请问您是两块c5535通过I2C通信?请用仿真器跟到i2c_read函数里看一下,运行到哪一步出错了?

,

user6441590:

谢谢您的回答,问题已经找到了。我想问一下I2C的从机,怎么去判别主机要读取从机的数据?手册上说是从机地址与其主机寻找的地址相同,然后判断主机发送的R/W 的值,从机 怎么判断R/W的值?手册上没有找到R/W的相关寄存器。

,

Shine:

主机执行i2c_read语句时会去把TXR=0,表示R/W的值,建议看一下下面的应用报告,里面有i2c_read函数的流程图。
www.ti.com/…/spra785a.pdf

,

user6441590:

谢谢您的指导,问题已经解决了

赞(0)
未经允许不得转载:TI中文支持网 » TMS320C55X 的I2C驱动程序配置问题
分享到: 更多 (0)