您好!
我们将 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 的溢出是否已知?
我该如何进行准确的调试?
谢谢你。
马库斯