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.
大家好、
以下是客户可能需要您的帮助的问题:
当我与 LIN 通信时、LinaRegs.SCIFLR.bit.PE = 1|和 LinaRegs.SCIFLR.bit.FE = 1在 LIN 通信中将触发错误、导致无法中断 LIN 中的通信。 目前、我采用复位 SWnRESET 的方法来解决这个问题。 但仍然会有错误帧、也就是机器没有响应的现象、你好、我想问一下是否有更好的解决方案? 以及为什么 LinaRegs.SCIFLR.bit.PE = 1且 LinaRegs.SCIFLR.bit.FE = 1。
--
谢谢、此致
你好,耶鲁,
我有几个澄清问题、然后才能提出任何建议。
当接收到的数据存在奇偶校验错误时、SCIFLR 寄存器的 PE 标志被置位、这意味着接收到的数据中1的数量与应该存在的1的数量(偶数或奇数)不匹配、 由数据的奇偶校验位指示。
当接收到的数据存在帧错误时、SCIFLR 寄存器的 FE 标志会被置位、这意味着接收到的数据字节中有一个缺少停止位、或者未正确检测到停止位。 这表明与发送设备存在同步问题。
此致、
德拉尼
尊敬的 Delaney:
首先,非常感谢您的答复,我将逐一回答您的问题。
1、我们使用 LIN 模块。
2、它充当响应者。
3、Using Tumos' LIN Box。
4、是、当 SWnRESET 位被置位时、将有数据丢失、并且上部计算机报告的错误没有被从计算机应答。我的理解是、当接收数据错误时、FE、PE 被置位、 然后我将 SWnRESET 位置位、这次不能触发中断、导致从器件 μ。没有回复
5、是的,我看到的现象是,一旦 PE,FE 设置。 RX、TX 中断不能触发中断
6、捕获的波形如下。
这就是我对您的问题的全部答复,期待您的答复。
此致、
张
添加通过 LIN 芯片模块处理后发送到 MCU 的信号波形
尊敬的 Zhang:
您启用了哪些中断标志? LIN 模块的 FE 和 PE 标志不应阻止其他中断的发生。 但是、如果使用 LIN_INT_ID 中断、由于组帧错误而错误读取的标头 ID 字节可能会导致不触发此中断。 您是否在应用中使用任何其他中断(例如、用于不同外设的中断等、这些中断在 PIE 中具有更高的优先级并可能限制 LIN 中断)?
查看示波器捕获可以发现、数据不应导致成帧错误、因为每个接收到的字节似乎都有一个停止位。 您是否能够尝试发送0xAA 或0x55等数据、以便更容易区分示波器上的位?
还要注意的是、执行 SWnRESET 并不是清除 FE 和 PE 标志的唯一方法。 您也可以执行以下任一操作:
此致、
德拉尼
尊敬的 Delaney:
在整个项目中、我使用了计时器中断、PWM 中断和 AD 采样中断。 我想您可以这么说、但我该怎么做、在进入中断后禁用全局中断、然后在执行完成之前打开全局中断? 对于发送的数据、我已经仔细读取了每个数据帧的波形、我可以确认、发送的波形没有问题。
此致、
张
尊敬的 Delaney:
顺便说一下、我使用了 LIN INT ID 中断。
此致、
张
void LIN_init() { LIN_initModule(LINA_BASE); LIN_enableInterrupt(LINA_BASE, LIN_INT_RX); LIN_enableInterrupt(LINA_BASE, LIN_INT_ID); LIN_setInterruptLevel0(LINA_BASE, LIN_INT_RX); LIN_setInterruptLevel1(LINA_BASE, LIN_INT_ID); Interrupt_register(INT_LINA_0, &level0ISR); Interrupt_register(INT_LINA_1, &level1ISR); Interrupt_enable(INT_LINA_0); Interrupt_enable(INT_LINA_1); LIN_enableGlobalInterrupt(LINA_BASE, LIN_INTERRUPT_LINE0); LIN_enableGlobalInterrupt(LINA_BASE, LIN_INTERRUPT_LINE1); LIN_clearGlobalInterruptStatus(LINA_BASE, LIN_INTERRUPT_LINE0); LIN_clearGlobalInterruptStatus(LINA_BASE, LIN_INTERRUPT_LINE1); } void LIN_initModule(uint32_t base) { ASSERT(LIN_isBaseValid(base)); EALLOW; LIN_disableModule(base); LIN_enableModule(base); LIN_enterSoftwareReset(base); LIN_disableSCIMode(base); LIN_setLINMode(base, LIN_MODE_LIN_RESPONDER); LIN_enableAutomaticBaudrate(base); LIN_setCommMode(base, LIN_COMM_LIN_USELENGTHVAL); LIN_setDebugSuspendMode(base, LIN_DEBUG_COMPLETE); LIN_setChecksumType(base, LIN_CHECKSUM_ENHANCED); LIN_setMessageFiltering(base, LIN_MSG_FILTER_IDRESPONDER); LIN_disableIntLoopback(base); LIN_enableMultibufferMode(base); LIN_enableParity(base); LIN_enableDataTransmitter(base); LIN_enableDataReceiver(base); LIN_triggerChecksumCompare(base); LIN_disableInterrupt(base, LIN_INT_ALL); LIN_setBaudRatePrescaler(base, 389U, 10U); LIN_setMaximumBaudRate(base, 120000000U); LIN_setFrameLength(base, 8U); LIN_setSyncFields(base, 0U, 1U); LIN_setTxMask(base, 0xFFU); LIN_setRxMask(base, 0xFFU); LIN_disableExtLoopback(base); LIN_exitSoftwareReset(base); EDIS; } #pragma CODE_SECTION(level0ISR, ".TI.ramfunc"); __interrupt void level0ISR(void) { level0Count++; LinL2IntVect =LIN_getInterruptLine0Offset(LINA_BASE); LinId_test2 = LIN_getRxIdentifier(LINA_BASE); if((LinL2IntVect == 11)&&(LinId_test2 == 0xE2)) { LIN_getData(LINA_BASE,LINReceive); LIN_User_Receive(); } else if((LinL2IntVect == 11)&&(LinId_test2 == 0x64)) { LIN_getData(LINA_BASE,LINReceive); can_rx_msg_rx_update = UPDATE; } LIN_clearInterruptStatus(LINA_BASE, LIN_INT_ALL); LIN_clearGlobalInterruptStatus(LINA_BASE, LIN_INTERRUPT_LINE0); Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP6); } #pragma CODE_SECTION(level1ISR, ".TI.ramfunc"); __interrupt void level1ISR(void) { level1Count++; LinL1IntVect = LIN_getInterruptLine1Offset(LINA_BASE); LinId_test1 = LIN_getRxIdentifier(LINA_BASE); if((LinL1IntVect == 4)&&(LinId_test1 == 0xE7)) { LIN_User_Send(); LIN_sendData(LINA_BASE,LINSend); } else if((LinL1IntVect == 4)&&(LinId_test1 == 0xA3)) { //LIN_User_Send(); // LIN_sendData(LINA_BASE,g_u16CanSendUpdate); } LIN_clearInterruptStatus(LINA_BASE, LIN_INT_ALL); LIN_clearGlobalInterruptStatus(LINA_BASE, LIN_INTERRUPT_LINE1); Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP6); }
尊敬的 Delaney:
这是我的 LIN 通信配置、您能找出什么问题吗?
此致、
张
尊敬的 Delaney:
在我的项目中、我有一个100us 的计时器中断、如果我禁用计时器中断、我的 LIN 通信似乎不会被中断、但如果我启用计时器中断、这会导致 LIN 通信中断、但它不会报告任何错误、 也就是说、不会像正常通信一样在 SCIFLR 中进行任何设置。 我还扩展了计时器中断、该中断导致我的 LIN 通信在断开之前运行更长时间。有没有办法提高我的 LIN 通信中断的优先级? 或者是否有其他方法可以处理它? 非常期待您的答复,谢谢。
此致
张
尊敬的 Delaney:
我也发现了一个问题、硬件电路好像也会干扰我、我想问一下哪些情况会干扰我的 LIN 通信。 具体的现象是、当我在高电压端上电时、会产生电流。 此时、触发 FE 和 PE 的可能性将高得多、当我没有开启高电压和没有电流时、似乎没有错误
此致、
张
尊敬的 Zhang:
我建议查看[C2000ware install]/driverlib/f280015x/examples/interrupt 文件夹中的 interrupt_ex3_sw_priority 示例、了解如何为 LIN 中断提供更高的优先级。 这是一个 使用软件预配置中断优先级的示例。 我相信这会适合您的用例。
您希望/期望这些中断中的每一个按照您的应用发生的顺序是什么? 对于中断问题、通常情况下、让每个 ISR 在执行期间在 GPIO 引脚上输出一个高电平信号也很有用、这样您就可以确定每个 ISR 何时被调用、并将其与当时接收到的 LIN 数据进行比较。 这将让您了解 LIN 数据为何丢失或接收错误。
我明天会继续解答您关于硬件的问题。
此致、
德拉尼
尊敬的 Zhang:
LIN RX 线路上的噪声可能导致成帧和/或奇偶校验错误。 LIN RX 线 可能会将逻辑1计数为0或逻辑0计数为1、并错误地检测到数据或获取 LIN ID 等的无效值。 在数据表的第6.6节"电气特性"中、输入信号在达到2.0V (VIH)时计为逻辑高电平、在低于0.8V (VIL)时计为逻辑低电平。 如果您想验证传入信号是否被正确地计为高电平/低电平、您可以测量 任何 噪声尖峰的电压并确保它们处于阈值之内。
此致、
德拉尼
尊敬的 Delaney:
我们已经解决了问题,问题的根源仍然是硬件的干扰,在此期间,非常感谢你的答复,同时,我希望你越来越漂亮,每天都快乐。
此致、
张
尊敬的 Zhang:
谢谢、我很高兴听到您解决了问题
如果您有任何疑问或问题、请告诉我。
此致、
德拉尼