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.
TCAN4550 μ nINT中断到M3连接如上图所示。
M3想尽快收到CAN总线上的报文,以减少TCAN4550转换带来的通信延迟。
1 μ、这里想通过nINT中断方式通知M3,当有外部中断来的时候,在M3的外部中断中进行接收消息标志位检测,,如果有消息,则读取CAN消息放至本地的接收队列中;直到TCAN4550的接收队列为空,退出接收及接收中断。A
但是通过M3的手册得知,TCAN4550的nINT中断是很多中断信号的或,,只要有任何中断来,都会引起nINT引脚由高到低(如果原来是低电平,会维持低电平);我已经在该外部中断中清除了所有中断,,还是会引起该中断信号一直是低电平,,不知道是不能通过该方式接收消息,还是我清除中断的方式不对。如果不对,,有没有参考的调用清除中断的调用及传参可以提供??
2 μ A、我看DEMO中给出接收CAN消息是通过查询方式,因为我的TCAN4550任务是周期性的,,如果查询方式,最大会有一个任务周期的消息接收延时,,所以不倾向于查询方式接收CAN消息。
3 μ、还有没有更好的接收方式可以提供?
期待回复!
您好、Nicolas、
nINT 引脚是全局中断引脚、用于反映在器件和 CAN 级别设置的任何已启用的中断位。 器件级中断包括 SPI 通信错误、过压或欠压以及过热条件等事件。 CAN 级别中断将包括 MCAN 模块内所有与 CAN 相关的中断、包括新消息。
TCAN4550将 Bosch MCAN IP 用作 CAN 控制器、并且有两条专用的 MCAN 中断线路可用于隔离重要的特定中断。 GPIO1和 GPO2引脚可以配置成反映这两条 MCAN 中断线路、允许您将它们用作可以在 MCU 的 ISR 中优先级化的额外硬件中断引脚。 新的 RX 报文中断位可以自行分配给 GPIO1或 GPO2引脚、这样它只会指示新的报文已到达。
由于 nINT 引脚是全局中断引脚、它也会反映新消息已到达、但正如您所指示的、可以设置其他事件来也将线路保持为低电平。 您可以禁用寄存器0x0830中任何您不用考虑的器件级中断位。
MCAN 中断在寄存器0x1054中启用、并可分配给寄存器0x1054中两个 MCAN 中断线路的其中一个。 您可以在寄存器0x105C 中启用 MCAN 中断线路。
如果要将 GPIO1引脚用于 MCAN 中断线路、请确保 GPIO1_GPO_CONFIG 位设置为"01"、以启用 MCAN_INT_1线路(0x0800 [11:10]=2'b01)、这是该寄存器的默认值。
如果您要将 GPO2引脚用于 MCAN 中断线路、请确保将 GPO2_CONFIG 位设置为"01"、以启用不是此寄存器默认值的 MCAN_INT_0线路(0x0800[23:22]=2'b01)。
此致、
乔纳森
我在nINTl输入至M3的外部中断服务函数中已经清除了所有中断,伪代码如下TCAN4x5x _mcan_interrupts mcan_ir
mcan_ir.word = 0xFFFFFFFF;
TCAN4x5x_MCAN_ClearInterrupts (&mcan_ir);
按理上来说清除所有故障标志后,TCAN4550的nINT信号会拉高,,但实际仍然为低。。是我清除的方法不对?还是需要清除别的寄存器???
目前还是倾向于通过nINT中断接收CAN消息。
您好、Nicolas、
nINT 引脚是寄存器0x0820和0x0824中所有未被屏蔽的位的逻辑或、为了使 nINT 引脚从低电平有效状态释放、您可能需要清除多个寄存器中的位。
寄存器0x0820包含与器件相关的中断、此中断不是专门针对 CAN 消息的。
寄存器0x0824是寄存器0x1050的只读副本、包含来自 MCAN 控制器的与 CAN 相关的中断。 要清除任何 MCAN 中断、必须通过写入0x1050寄存器而不是0x0824只读寄存器来清除这些中断。 寄存器0x0824位于寄存器0x0820旁边、因此可以在长度字段设置为2的单个双字 SPI 读取事务中读取两个中断寄存器、这比两个单独读取寄存器0x0820和0x1050的操作更高效。
如果设置了寄存器0x0820中的 SPIERR 位、则需要通过写入寄存器0x000C 来清除状态寄存器0x000C 中设置的位。
看起来您可能正在清除寄存器0x0824和0x01050中的 MCAN 中断、但如果存在 SPI 错误、您可能无法清除寄存器0x0800和0x000C 中反映的其他与器件相关的中断。 您是否可以验证所有寄存器是否都已清除、然后检查 nINT 引脚?
此致、
乔纳森