大家好、
我正在使用28388D 控制卡、并尝试让 I2C 通信与 Simulink EmbedCoder 一起工作、
我首先从 CCS C 代码 I2C 示例开始、并对数据包进行了修改、使其正常运行、这是一个非常简单的代码、通过单个器件即可对芯片中的5个寄存器进行写入和读取。 因此可以证明硬件工作正常。
最终软件设计将在 Simulink EmbedCoder 问题中完成、我在该设计中遇到了问题。 尝试使用嵌入式 I2C 块、而不是使用自定义代码/s 函数。
在 CCS 上生成代码并运行代码并进行调试后、I2C 会接收消息、但不会发送消息。
问题似乎出在线路"while (I2caRegs.I2CFFTX.bit.TXFFST!=0 & TX_LOOP<10000)"、其中 TXFFST 永远不等于零。 Simulink 中是否缺少某项内容来清除此问题?
下面是模型设置


生成的代码
if (rtb_Compare) {
/* S-Function (c280xi2c_tx): '<S9>/I2C Transmit' incorporates:
* Constant: '<S3>/Control Reg2'
*/
{
int unsigned tx_loop= 0;
I2caRegs.I2CFFTX.bit.TXFFIENA = 0;/* Disable Tx Fifo interrupt*/
while (I2caRegs.I2CFFTX.bit.TXFFST!=0 && tx_loop<10000 )
tx_loop++;
if (tx_loop!=10000) {
I2caRegs.I2CSAR.bit.SAR = 0; /* Set slave address*/
I2caRegs.I2CCNT= 1; /* Set data length */
/* mode:1 (1:master 0:slave) Addressing mode:0 (1:10-bit 0:7-bit)
free data mode:0 (1:enbaled 0:disabled) digital loopback mode:0 (1:enabled 0:disabled)
bit count:0 (0:8bit) stop condition:1 (1:enabled 0: disabled)*/
I2caRegs.I2CMDR.all = 28192;
tx_loop= 0;
while (I2caRegs.I2CFFTX.bit.TXFFST==16 && tx_loop<10000)
tx_loop++;
if (tx_loop!=10000) {
I2caRegs.I2CDXR.bit.DATA = (uint8_T)IPDM_Rev_A0_P.ControlReg2_Value;
}
}
I2caRegs.I2CFFTX.bit.TXFFIENA = 1;/* Enable Tx Fifo interrupt*/
I2caRegs.I2CFFTX.bit.TXFFINTCLR = 1;/* Clear Tx interrupt flag*/
}
/* S-Function (fcgen): '<S6>/Function-Call Generator' incorporates:
* SubSystem: '<S6>/StartRead'
*/
/* S-Function (c280xi2c_tx): '<S8>/I2C Transmit' incorporates:
* Constant: '<S6>/Constant1'
*/
{
int unsigned tx_loop= 0;
I2caRegs.I2CFFTX.bit.TXFFIENA = 0;/* Disable Tx Fifo interrupt*/
while (I2caRegs.I2CFFTX.bit.TXFFST!=0 && tx_loop<10000 )
tx_loop++;
if (tx_loop!=10000) {
I2caRegs.I2CSAR.bit.SAR = 16; /* Set slave address*/
I2caRegs.I2CCNT= 1; /* Set data length */
/* mode:1 (1:master 0:slave) Addressing mode:0 (1:10-bit 0:7-bit)
free data mode:0 (1:enbaled 0:disabled) digital loopback mode:0 (1:enabled 0:disabled)
bit count:0 (0:8bit) stop condition:0 (1:enabled 0: disabled)*/
I2caRegs.I2CMDR.all = 26144;
tx_loop= 0;
while (I2caRegs.I2CFFTX.bit.TXFFST==16 && tx_loop<10000)
tx_loop++;
if (tx_loop!=10000) {
I2caRegs.I2CDXR.bit.DATA = (uint8_T)IPDM_Rev_A0_P.Constant1_Value;
IPDM_Rev_A0_B.I2CTransmit = I2caRegs.I2CSTR.all;/* output i2c status */
} else
IPDM_Rev_A0_B.I2CTransmit = I2caRegs.I2CSTR.all | 0x40;/* output transmit data loss status */
} else
IPDM_Rev_A0_B.I2CTransmit = I2caRegs.I2CSTR.all | 0x80;/* output transmit data loss status */
I2caRegs.I2CFFTX.bit.TXFFIENA = 1;/* Enable Tx Fifo interrupt*/
I2caRegs.I2CFFTX.bit.TXFFINTCLR = 1;/* Clear Tx interrupt flag*/
}
/* End of Outputs for S-Function (fcgen): '<S6>/Function-Call Generator' */
}
Simulink 硬件设置

我不熟悉 C2000系列和 Simulink、因此我希望这是一个我遗漏的简单修复!
此致、
Neil

