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.
工具与软件:
我上次询问了如何调节 SCI 中断、TI 专家告诉我可以通过 GPIO 控制调节 SCI 中断。
在数据表中: SCI 在丢失的停止位之后为9.625位时为低电平。 (开始1位+数据8位+奇偶校验1位+停止1位+ 9.625位= 20.625位低电平(在250,000波特率下为82.5us)
在上述计算之后、我将 SCI 低电平条件设为约82.5us、但很少设置 SCI_RXSTATUS_BREAK。
我在77.96us 和85.05us 之间测试了总共104次、但 SCI 中断仅发生一次。 (SCI 中断在84.968us 低电平时发生、但 SCI 中断未在另一个84.968us 处发生)
您能建议我断开 SCI 的具体时间或条件吗?
你好、Jaehoon、
您是否可以提供代码片段、其中您直接操作引脚多路复用使其成为输出并通过 GPIO 模块驱动该输出? 一些验证 SCI 引脚是否为低电平的示波器屏幕截图也会有所帮助。 您是否可以尝试在这段时间内从外部将 SCI 引脚驱动为低电平、并查看这如何影响 SCI 寄存器中的中断检测标志?
此致、
Delaney
MCU 1:通过 GPIO 控制使 SCI 线路变为低电平
GPIO_setPinConfig(GPIO_16_GPIO16); // Change Pin configuration for GPIO control GPIO_writePin(SCITXDA_GPIO, 0); // Make the SCI line to low DEVICE_DELAY_US(50); // Keep low the SCI line GPIO_setPinConfig(GPIO_16_SCIA_TX); // Release the SCI line
Break_Flag 2 :跟踪 SCI 中断和递增计数"DSSI_MCU"变量
__interrupt void sciaRxISR(void) { IER = INTERRUPT_CPU_INT3; // EPWM 1,2 EINT; Function_DSSI_Rx(); Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9); } #pragma FUNC_ALWAYS_INLINE(Function_DSSI_Rx) static inline void Function_DSSI_Rx(void) { unsigned char i, Count_Unsupported_CMD; uint16_t DSSI_Received; if((SCI_getRxStatus(SCIA_BASE) & SCI_RXSTATUS_BREAK)) // DSSI Break -> Configuration Phase { DSSI_Break_Flag++; Reply_OK(); DSSI_Packet_Index = 0; SCI_clearInterruptStatus(SCIA_BASE, SCI_INT_RXRDY_BRKDT); SCI_performSoftwareReset(SCIA_BASE); return; }
下面是 MCU 1控制的 SCI 线路的波形。
我也使用了外部开关、但很难在100us 以下延迟实现。 (我使用外部开关时、最小 SCI 低电平时间约为50ms)
你好、Jaehoon、
您此处所示的计算和配置看起来是正确的。 另一种可能是波特率错误会干扰时序-您在使用什么 LSPCLK 设置?
您的中断嵌套可能也会起作用-您是否可以尝试仅隔离 SCI RX 中断(删除嵌套和其他中断)以查看您现在是否接收到中断检测中断? 另请注意、您缺少一些用于嵌套中断的推荐代码、请参阅 此处链接的中断嵌套指南。
此致、
Delaney
尊敬的 Delaney:
DEVICE_LSPCLK_FREQ 为30MHz。
我还将按照您的建议进行测试、但如果嵌套块 SCI 中断的设置、我将如何做?
在实际操作中不应删除嵌套。
你好、Jaehoon、
在30MHz 的 LSPCLK 和250,000 bps 的波特率下、应该会有0%的误差、这应该不是问题。
中断嵌套有时会导致特定 ISR 的阻塞、或导致中断丢失。 由于您允许其他中断在执行实际功能之前中断 SCI RX ISR、因此可能无法达到 ISR 中的以下代码。 为了隔离这一点、你可以注释掉除了 ISR 内的:interrupt_clearACKGroup (interrupt_ACK_group9);行之外的所有内容?
此外、你在你的应用中启用了其它哪些中断?
此致、
Delaney
尊敬的 Delaney:
很抱歉,我在台湾出差。
__interrupt void sciaRxISR(void) { if((SCI_getRxStatus(SCIA_BASE) & SCI_RXSTATUS_BREAK)) // DSSI Break -> Configuration Phase { DSSI_Break_Flag++; SCI_clearInterruptStatus(SCIA_BASE, SCI_INT_RXRDY_BRKDT); SCI_performSoftwareReset(SCIA_BASE); } Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9); }
我类似地更改了代码、但很少像以前一样设置 SCI_RXSTATUS_Break 标志。
--------------------------------------------------------------------------------------------------------------------
INTERRUPT_ENABLE (INT_PMBUSA);
INTERRUPT_ENABLE (INT_SCIB_RX);
INTERRUPT_ENABLE (INT_SCIB_TX);
INTERRUPT_ENABLE (INT_SCIA_RX);
INTERRUPT_ENABLE (INT_SCIA_TX);
INTERRUPT_ENABLE (INT_myECAP0);
INTERRUPT_ENABLE (INT_XINT1);
interrupt_enable (TTPLPFC_C28x_instruments_interrupt_TIMER0);
interrupt_enable (TTPLPFC_C28x_instruments_interrupt_Timer1);
INTERRUPT_ENABLE (PSFB_FB_PWM1_INT);
INTERRUPT_ENABLE (PSFB_C28x_CONTROLISR_INTERRUPT);
INTERRUPT_ENABLE (INT_I2CA_FIFO);
INTERRUPT_ENABLE (INT_I2CA);
--------------------------------------------------------------------------------------------------------------------
以上是我的代码中的所有中断。
我认为这种中断不会因其他中断而发生、这是不可接受的。
中断可以因其他中断而延迟执行、但因其他中断而不执行中断没有意义。
如您所知、C2000系列用于电源控制、因此不可避免地会嵌套用于电源控制的中断。
请给我更多的基本建议。
你好、Jaehoon、
我明白、如果你仔细操作、你不应该有任何中断损失。 请查看 此处链接的文档 并将您的中断代码与此处匹配、以验证嵌套是否正确发生。 还有一些可以使用的示例屏蔽文件、如[C2000ware install]/driverlib/f28003x/examples/interrupt/interrupt_ex3_sw_prioritization.中的中断软件优先级示例所示 您能否指定要使用的优先级顺序、以及我能否为软件实现提供一些指导?
此外、排除嵌套作为一个问题的一个好方法是在禁用除 SCI A 接收中断之外的所有其他中断的情况下测试应用程序。
此致、
Delaney