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.
您好,
我有一 个非常简单的 Matlab 2020b Simulink,带有一个 SystemObject 块。 此块只调用一些执行某些 I2C 事务的手代码。 当我在28069启动板上运行时,我的手代码按预期工作。 但是,当我在28069定制板上使用 Simulink Code Generation 运行相同的 I2C 代码时,该代码将无法按预期工作。
问题是,当调用我的 I2C ISR 时,I2C 中断源总是返回0。 我预期源为 I2C_ARDY _ISRC 或 I2C_nack_ISRC。
}
Uint8 i2cdrvCmdCheckSlavePresent( Uint8 slaveAddr, Uint32 timeoutMs) { Uint8 isSuccess = !i2cdrvIsBusy(); if (isSuccess) { m_state = I2CDRVSTATE_BUSY; ... I2caRegs.I2CSAR = slaveAddr; // Enable ARDY and NACK interrupts I2caRegs.I2CIER.all = 0x0006; // Mode -> FREE, STT, MST, TRX, RM, IRS all set. I2caRegs.I2CMDR.all = 0x66A0; } return isSuccess; } static void _init(void) { // Put in reset I2caRegs.I2CMDR.all = 0x0000; // Add our interrupt handler to vector table EALLOW; PieVectTable.I2CINT1A = &_i2cInt1AISR; EDIS; // Enable I2C interrupts in the PIE: Group 8 interrupt 1 and 2 PieCtrlRegs.PIEIER8.bit.INTx1 = 1; //PieCtrlRegs.PIEIER8.bit.INTx2 = 1; // Enable CPU INT8 which is connected to PIE group 8 IER |= M_INT8; // Set our own address I2caRegs.I2COAR = 0x0001; // Clocks I2caRegs.I2CPSC.all = CLK_PRESCALE; I2caRegs.I2CCLKL = CLK_LOW; I2caRegs.I2CCLKH = CLK_HIGH; // Disable all ints I2caRegs.I2CIER.all = 0x0000; // Take out of reset I2caRegs.I2CMDR.bit.IRS = 1; } // I2C-1A Interrupt - handles the basic I2C static interrupt void _i2cInt1AISR(void) { // Read interrupt source Uint16 intSrc = I2caRegs.I2CISRC.all; //this is always returning 0. it should return I2C_NACK_ISRC or I2C_ARDY_ISRC switch(intSrc) { .... } }
我认为 I2caRegs.I2CISRC 没有更新,因为到 ISR 被称为 I2C 模块时,它处于重置模式。 使用调试 器,我发现在 i2cdrvCmdCheckSlavePresent()函数的末尾,重置模式已关闭,中断已启用。
当我进入 i2cInt1AISR()时 ,我看到 I2C 模块处于重置状态。 当我在启动板上运行此 I2C 手代码时, I2caRegs.I2CMDR.Bit.IRS 始终为1。
进入重置模式的 I2C 模块能否成为中断源始终返回0的原因? 或者,我的 init 函数中的模块时钟频率或 SDCLK 周期是否可能是导致这种情况的原因?
我在 I2caRegs.I2CMDR.Bit.IRS 上设置了一个读取监视点,因此请查看该寄存器的写入内容。 只有_init()函数应该写入 I2CMDR。 由于附加监视点的原因,ISR 始终正确显示中断源为 nack 或 ARDY。
马什鲁尔
您能否澄清28069 LP 上的 Simulink 实施是否正常,或者在涉及 Simulink 时遇到上述问题。 相反,CCS 中的手代码是否适用于您的定制 PCB?
即使 I2CISRC 中没有位设置,您也可以进入 I2C ISR,这意味着它们已启用。 在系统读取时,INTCODE 已被清除,因此我想知道 Simulink 是否有一些默认操作来执行此操作(并可能将 I2C 重置)。
最佳
马修
我没有在启动板上运行 Simulink 生成的代码。 我会尝试这样做,看看会发生什么。 我也没有在定制 PCB 上运行 CSS 中的手代码。
我确实注意到,如果我手动编辑了 Simulink 代码,我就能够到达 ISR,中断源显示 nack 或 NRDY。 我的 I2C 事务由_process1ms 函数初始化:
void _process1ms(void) { // Process I2C i2cdrvProcess(); // Process Component Authentication sedrvProcess(); }
在 Simulink 生成的代码(请参阅 ERT_main.c)中,_process1ms 被称为从零到零中断的任何时间。 在这里,SystemObjectTest_step ()是我的 Simulink 模型的 STEP 函数,而 SysObj_IMEC()是模型中我的 SystemObject 块的 STEP 函数。
如果我修改 ERT_main.c 以使用简单的计时器1调度程序显式调用_process1ms(),我可以使用 正确的中断源到达_i2cInt1ASR()。 请参阅 ERT_main_handedits.c 了解我的意思。 在这种手工编辑的 Simulink 代码中,Process1ms()从 SysObj_IMEC()函数中注释掉。
e2e.ti.com/.../ert_5F00_main_5F00_handedits.ce2e.ti.com/.../ert_5F00_main.c
我运行的代码在我的定制 PCB 上的启动板上运行正常。 每次 I2caRegs.I2CMDR.Bit.IRS 为1时,都会正确调用 ISR,中断源被正确更新。
我同意,Simulink 代码中的某些内容必须是更新 I2CMDR 寄存器并阅读 I2CISRC。 但是,使用监视点我无法判断导致此问题的代码是在哪里或是什么。
马什鲁尔
我想看看我是否可以加入 MW 团队来看看这件事并发表评论。
最佳
马修