您好!
我们将 TMS320F28069与 I2C IO 扩展器结合使用。
有时 I2C 接口有问题。 似乎 FIFO 溢出。
应发送值0x09和值(通常为0x1C)。 在代码中、始终首先发送值0x09 (IO 扩展器的寄存器)。
通过 LogicAnalyzer、我们可以看到值按错误的顺序发送(请参阅屏幕截图)。

Config:
void InitI2C ( void )
{
I2caRegs.I2CSAR = I2C_SLAVE_ADDR; // (0x20)
I2caRegs.I2CPSC.all = 8; // Prescaler - 10MHz
I2caRegs.I2CMDR.bit.IRS = 1;
// The prescaled frequency takes effect only when IRS is changed to 1.
I2caRegs.I2CCLKL = 7; // NOTE: must be non zero
I2caRegs.I2CCLKH = 7; // NOTE: must be non zero
// --> 100.44 kHz I2C Speed
I2caRegs.I2CFFTX.all = 0x6000; // Enable FIFO mode and TXFIFO
I2caRegs.I2CFFRX.all = 0x2040; // Enable RXFIFO, clear RXFFINT
}
Function:
int16 write_I2c_data ( unsigned int slave_addr, unsigned int length, unsigned char I2CRegister, unsigned char Value )
{
int16 retval = 1;
retval = check_BB_bit (I2C_TIMEOUT);
if (retval < 0)
{
I2caRegs.I2CMDR.bit.IRS = 0; // Timed out. Reset module.
I2C_ Errorhandling ();
return retval; // Abbrechen
}
/***************Write******************/
I2caRegs.I2CSAR = slave_addr; // Setup slave address
I2caRegs.I2CCNT = length; // Setup number of bytes to send MsgBuffer + Address
I2caRegs.I2CDXR = I2CRegister;
I2caRegs.I2CDXR = Value;
// Send start as master transmitter
I2caRegs.I2CMDR.all = 0x6E20; //gesetzt werden FREE, STT, STP, MST, TRX, IRS
// -->> -- I2CMaster_Wait
retval |= check_STP_and_BB_bit ( I2C_TIMEOUT);
if (retval < 0)
{
I2caRegs.I2CMDR.bit.IRS = 0; // Timed out. Reset module.
I2C_Errorhandling();
return retval; // Abbrechen
}
//--<<---
return retval;
}
致电:
WRITE_I2C_DATA (I2C_SLAVE_ADDR,2,MCP23008_GPIO,GPIO_exp.all);
可以非常快速地调用该函数。
发送 FIFO 的溢出是否已知?
我该如何进行准确的调试?
谢谢你。
马库斯