This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
大家好、
我正在使用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
尼尔
感谢您发布块代码、我将与我们团队的 I2C 所有者联系、看看内联代码是否有任何变化。 如果我们发现缺少某些内容、并且无法确定如何通过 GUI 实施、我们可以加入 MW 团队。
您能评论一下您在 C2000Ware 中使用的哪一个示例工作正常吗? 这将为我们提供与 Simulink 生成的代码不同的内容。
最棒的
Matthew
你好、Matthew
它是文件夹中的 i2c_ex2_EEPROM 项目。 C2000Ware_3_04_00_00\driverlib\f2838x\examples\C28x\i2c
谢谢
尼尔
您是否已启用 TX FIFO 和 RX FIFO 以开始? 您只在代码片段中附带了什么内容、我不确定您是否已启用 FIFO、如下所示。 此外、当您遇到此错误时、TXFFST 位的状态是什么? TXFFST = 0吗?
要使用 TX FIFO、您需要进行设置
I2CFFTX.I2CFFEN = 1
I2CFFTX.TXFFRST = 1.
要使用 RX FIFO、您需要进行设置
I2CFFRX.RXFFRST = 1
此致、
曼诺伊
您好 Manoj
并不一定需要 FIFO 功能、因为它的消息速率很低、
从我在 Simulink 硬件设置中可以看到、没有禁用/启用 FIFO 的选项、尽管查看生成的 c 代码(在下面提取)、Simulink 的默认值似乎是启用 FIFO?
与 FIFO 相关的唯一选项是选择 FIFO 中断级别? (所有中断被禁用)
void init_I2C_GPIO(void) { EALLOW; /* Initial I2C GPIO pin*/ GpioCtrlRegs.GPCPUD.bit.GPIO91 = 0; /* Enable pull-up on GPIO91 (SDAA)*/ GpioCtrlRegs.GPCGMUX2.bit.GPIO91 = 1;/* Configure GPIO91 as SDAA*/ GpioCtrlRegs.GPCMUX2.bit.GPIO91 = 2; /* Configure GPIO91 as SDAA*/ GpioCtrlRegs.GPCPUD.bit.GPIO92 = 0; /* Enable pull-up on GPIO92 (SCLA)*/ GpioCtrlRegs.GPCGMUX2.bit.GPIO92 = 1;/* Configure GPIO92 as SCLA*/ GpioCtrlRegs.GPCMUX2.bit.GPIO92 = 2; /* Configure GPIO92 as SCLA*/ EDIS; } void init_I2C_A(void) { /* Initialize I2C*/ EALLOW; CpuSysRegs.PCLKCR9.bit.I2C_A = 1; /* Enable pheripheral clocks for I2C */ EDIS; I2caRegs.I2CMDR.bit.MST = 1; /* Select master or slave mode*/ I2caRegs.I2CMDR.bit.DLB = 0; /* Enable digital loopback bit */ I2caRegs.I2CPSC.all = 199; /* Prescaler - need 7-12 Mhz on module clk*/ I2caRegs.I2CCLKL = 20; /* NOTE: must be non zero*/ I2caRegs.I2CCLKH = 20; /* NOTE: must be non zero*/ I2caRegs.I2CFFTX.all |= 0x6000; /* Enable TxFIFO mode*/ I2caRegs.I2CFFRX.all |= 0x2000; /* Enable RxFIFO mode*/ I2caRegs.I2CMDR.bit.IRS = 1; /* Take I2C out of reset*/ }
TXFFST 值为2这在原始 POST 代码的 while 循环行8上使用断点)或使用连续刷新选项(如果这是快速更改、则刷新选项可能会更新该值)
FIFO I2CFFEN 和 TXFFRST 的其他值 似乎与您建议使用的值相匹配、并且我尚未修改 Simulink 生成的任何代码
非常感谢、
Neil
TXFFST = 2告诉我您的 TXFIFO 中有2个字。 TXFFST 位域只有在 TXFIFO 中的内容被传输时才可读为"0"。 这只能通过生成 START 条件来实现。
我从未使用 Simulink 生成 I2C 代码。 您是否使用 Simulink 进行了检查?
此致、
曼诺伊
尼尔
此问题是否已解决? 我可以关闭此主题吗?
此致、
曼诺伊