大家好、
我正在使用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