您好,
我们代表Daniel Rush发布信息,但Daniel Rush无法将他的查询发布到这个特定论坛。 Daniel将在该帖子上线后收到通知,以便他可以加入并继续讨论。
帖子描述:
当从我的PC发送TX中断信号时,RXST位始终设置为帧错误。 我的中断会在每次中断后重置状态位,但从不设置BKDT标志。 我想使用中断检测来重置处理器。 我已经用逻辑分析器验证了TX-Break信号。
我的外围设备设置如下所示:
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.
您好,
我们代表Daniel Rush发布信息,但Daniel Rush无法将他的查询发布到这个特定论坛。 Daniel将在该帖子上线后收到通知,以便他可以加入并继续讨论。
帖子描述:
当从我的PC发送TX中断信号时,RXST位始终设置为帧错误。 我的中断会在每次中断后重置状态位,但从不设置BKDT标志。 我想使用中断检测来重置处理器。 我已经用逻辑分析器验证了TX-Break信号。
我的外围设备设置如下所示:
{ scia = sci_init((void*)scia_base_addr, sizeof(SCI_Obj)); piHandle = pie_init((void*)pie_base_ADDR, sizeof(pie_Obj)); sci_enable(scia); //协议为11.52万波特,8-N-1。 scia->SCIHBAUD = BAUD_11.52万>> 8;//设置波特率 sciA->SCILBAUD = BAUD_11.52万; //设置波特率 SCI_DisableParity (sciA); SCI_setNumStopBits (sciA,SCI_NumStopBits _One); SCI_setCharLength (sciA,SCI_CharLength_8_Bits); sci_disableLoopBack (sciA); // FIFO和中断设置 SCI_enableTxFifo (sciA); SCI_enableRxFifo (sciA); SCI_enableRxErrorInt(sciA); SCI_enableRxInt(sciA); SCI_enableTxInt(sci_enableTxInt(sciA); //启用接口 SCI_enableRx (sciA); SCI_enableTx (sciA); //启用外设中断 PIE_enableInt (PiHandle,PIE_GroupNumber_9,PIE_InterruptSource_SCIARX); PIE_enableInt (PiHandle,PIE_GroupNumber_9, PIE_InterruptSource_SCIATX); }
Daniel,
请确认我的理解。
清除FE/RXERROR标志的唯一方法是重置SCI,这将重置设置BRKDT标志的逻辑。 假设您正在及时处理FE标志(少于10位次数),则您将在检测到BRKDT情况之前重置SCI模块。
是否在FE上触发中断并重置SCI? 我希望这种情况比BRKDT检测快得多。
此致,
科迪
Cody,
以下是我的中断的代码片段:
IF (CHAR_INDEX >= MAX_MESSAGE_LEN){
char_index =0;
memset(CMD_buf[write_index],'\0',MAX_MESSAGE_LEN);
} 否则IF (sciA->SCIRXST & SCI_SCIRXST_BRKDT_Bits){
//中断检测:检测到中断时重置手柄
sendDebugMsg("break");
返回;
} 否则,如果(sciA->SCIRXST & SCI_SCIRXST_OE_BIT){
//溢出错误
// TODO (DJR):这只是丢弃字符可能会在将来更改此设置
Sci_reset (sci);
SCI_ENable(scia);
返回;
} 否则IF (sciA->SCIRXST & SCI_SCIRXST_FE_Bits){
//成帧错误
Sci_reset (sci);
SCI_ENable(scia);
// TODO (DJR):这只是丢弃字符可能会在将来更改此设置
返回;
} 否则IF (sciA->SCIRXST & SCI_SCIRXST_PE_Bits){
//奇偶校验错误
// TODO (DJR):丢弃字符
Sci_reset (sci);
sci_enable(scia);
} Cody,
这也是我的想法之一。 因此,在测试了这个问题之后,它确实会在10位后触发中断检测,但是,SCI_reset的原因是清除错误位,以便可以触发另一个中断,如果不清除这些中断,就会检测到第一个FE错误并进行维修, 然后忽略所有后续中断。 如技术参考中所述,只有设置SW_Reset后,位才会被清除。
运行调试器时,我可以逐步完成中断,然后在它返回到主代码后,继续步进并观看RXST寄存器,经过一段时间后,BKDT会变高,但无法知道,因为它不会导致中断。 不知道每次收到错误时如何在不重置接口的情况下不断获得中断。
Daniel,
是的,您理解正确。 我同意,实施不适合识别"中断检测"。 如果要区分Fes和BRKDT,可以在检测到FE时设置CPU计时器。 CPU计时器应配置为在超过10位数后触发中断。 在中断中,您可以确定是发生了BRKDT还是只发生了FE,然后重置SCI模块并相应地与UART发送器同步。
我建议您对传输的数据实施某种校验和,这将有助于稳健性。
解决此问题的另一种方法是定义一系列传输停止数据包(而不是在通信中添加中断),这些数据包在您的数据中不应通用。
当您发现使用UART的一个缺点 时,所有握手都是由应用程序代码完成的。
希望它有所帮助,
科迪