请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TMS570LS3137 您好!
我在试图使 CAN 中断工作时遇到了困难。
如果我通过 HAL 配置标准或扩展 CAN ID、中断工作正常。 但是、如果我想通过代码从标准 CAN 更改为扩展 CAN、或者从扩展 CAN 更改为标准 CAN、CAN 中断将停止工作。 我已经完成了两个函数、这些函数通过 接收 SCI (UART)的命令帮助我从一种格式更改为另一种格式。
使用逻辑分析仪、我已经验证了帧以相应的格式发送、但是中断不会被触发。
我在下面附上两个函数的代码。
//Set standard ID for some CAN interface
void standardId(canBASE_t *canREG)
{
/** - Initialize message 1
* - Wait until IF1 is ready for use
* - Set message mask
* - Set message control word
* - Set message arbitration
* - Set IF1 control byte
* - Set IF1 message number
*/
/*SAFETYMCUSW 28 D MR:NA <APPROVED> "Potentially infinite loop found - Hardware Status check for execution sequence" */
while ((canREG->IF1STAT & 0x80U) ==0x80U)
{
} /* Wait */
canREG->IF1MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x00000000U & (uint32)0x000007FFU) << (uint32)18U);
canREG->IF1ARB = (uint32)0x80000000U | (uint32)0x00000000U | (uint32)0x20000000U | (uint32)((uint32)((uint32)1U & (uint32)0x000007FFU) << (uint32)18U);
canREG->IF1MCTL = 0x00001000U | (uint32)0x00000000U | (uint32)0x00000000U | (uint32)0x00000000U | (uint32)8U;
canREG->IF1CMD = (uint8) 0xF8U;
canREG->IF1NO = 1U;
}
//Set extended ID for some CAN interface
void extendedId(canBASE_t *canREG)
{
/** - Setup control register
* - Disable automatic wakeup on bus activity
* - Local power down mode disabled
* - Disable DMA request lines
* - Enable global Interrupt Line 0 and 1
* - Disable debug mode
* - Release from software reset
* - Enable/Disable parity or ECC
* - Enable/Disable auto bus on timer
* - Setup message completion before entering debug state
* - Setup normal operation mode
* - Request write access to the configuration registers
* - Setup automatic retransmission of messages
* - Disable error interrupts
* - Disable status interrupts
* - Enter initialization mode
*/
canREG->CTL = (uint32)0x00000000U
| (uint32)0x00000020U
| (uint32)((uint32)0x00000005U << 10U)
| 0x00020043U;
/** - Initialize message 1
* - Wait until IF1 is ready for use
* - Set message mask
* - Set message control word
* - Set message arbitration
* - Set IF1 control byte
* - Set IF1 message number
*/
/*SAFETYMCUSW 28 D MR:NA <APPROVED> "Potentially infinite loop found - Hardware Status check for execution sequence" */
while ((canREG->IF1STAT & 0x80U) ==0x80U)
{
} /* Wait */
canREG->IF1MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x00000000U & (uint32)0x1FFFFFFFU) << (uint32)0U);
canREG->IF1ARB = (uint32)0x80000000U | (uint32)0x40000000U | (uint32)0x20000000U | (uint32)((uint32)((uint32)1U & (uint32)0x1FFFFFFFU) << (uint32)0U);
canREG->IF1MCTL = 0x00001000U | (uint32)0x00000000U | (uint32)0x00000000U | (uint32)0x00000000U | (uint32)8U;
canREG->IF1CMD = (uint8) 0xF8U;
canREG->IF1NO = 1U;
/** - Leave configuration and initialization mode */
canREG->CTL &= ~(uint32)(0x00000041U);
}
非常感谢、此致、
莱安德罗