请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TMS570LC4357 主题中讨论的其他器件:HALCOGEN
您好!
我目前在 GIO 模式下使用 CAN 2和3、并使用 HALCoGen 04.07.01配置引脚。
- 我启用了 CAN 2和 CAN 3驱动器。
- 已在每个选项卡中查找 CAN2和 CAN 3端口初始化之间的差异。
- 在每个 Msg 选项卡中没有中断或活动消息框
- 未选择中断 VIM 通道
在 HCG 生成的文件中,函数 canInit()中的 hl_can.c:
对于 CAN 2、只修改 CTL、TIOC 和 RIOC 寄存器、这正是我所期望的。 然而、CAN 3的初始化正在配置所有其它寄存器、包括 TIOC 和 RIOC。 配置最终以离开初始化模式的指令结束。
/**-离开配置和初始化模式*/ canREG3->CTL &=~(uint32)(0x00000041U);
很遗憾、该调用会重置 GIO 设置。
我的问题是:
- 在 HCG 配置中是否可能缺少 CAN2和 CAN3之间不同的复选框、从而导致 HALCoGen 生成的初始化不同?
- 是否是唯一在用户代码5部分重新初始化 TIOC 和 RIOC 寄存器的选项?
void canInit (void)
{
/*用户代码开始(4)*/
/*用户代码结束*/
/**@b 初始化@b CAN2:*/
/**-设置控制寄存器
* -进入初始化模式
*
CANREG2->CTL = 0x00000001U;
/**- CAN2端口输出值*/
canREG2->TIOC =(UINT32)((UINT32)0U <<18U)
|(uint32)((uint32) 0U <<17U)
|(uint32)((uint32) 0U <<16U)
|(uint32)((uint32) 0U << 3U)
|(uint32)((uint32) 1U <<2U)
|(uint32)((uint32) 0U << 1U);
canREG2->RIOC =(UINT32)((UINT32)0U <<18U)
|(uint32)((uint32) 0U <<17U)
|(uint32)((uint32) 0U <<16U)
|(uint32)((uint32) 0U << 3U)
|(uint32)((uint32) 1U <<2U)
|(uint32)((uint32) 0U <<1U);
/**@b 初始化@b CAN3:*/
/**-设置控制寄存器
* -禁用总线活动时的自动唤醒
* -禁用本地断电模式
* -禁用 DMA 请求线路
* -启用全局中断线路0和1
* -禁用调试模式
* -从软件复位中释放
* -启用/禁用奇偶校验或 ECC
* -启用/禁用自动总线开启定时器
* -进入调试状态前设置消息完成
* -设置正常工作模式
* -请求对配置寄存器的写入访问
* -设置消息的自动重发
* -禁用错误中断
* -禁用状态中断
* -进入初始化模式
*
CANREG3->CTL =(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32)((UINT32) 0x00000005U << 10U)
| 0x00020043U;
/**-清除所有挂起的错误标志并重置当前状态*/
canREG3->ES |= 0xFFFFFFU;
/**-为消息分配中断级别*/
CANREG3->INTMUXx[0U]=(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x000000000000U;
CANREG3->INTMUXx[1U]=(UINT32) 0x0000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U
|(UINT32) 0x00000000U;
/**-在定时器周期上设置自动总线*/
canREG3->ABOTR =(uint32) 0U;
/**-设置 IF1以进行数据传输
* -等待 IF1就绪可供使用
* -设置 IF1控制字节
*
/*SAFETYMCUSW 28 D MR:NA "找到可能无限的循环-执行序列的硬件状态检查"*/
while ((canREG3->IF1STAT & 0x80U)=0x80U)
{
} /*等待*/
CANREG3->IF1CMD = 0x87U;
/**-设置 IF2以读取数据
* -等待 IF1就绪可供使用
* -设置 IF1控制字节
*
/*SAFETYMCUSW 28 D MR:NA "找到可能无限的循环-执行序列的硬件状态检查"*/
while ((canREG3->IF2STAT & 0x80U)=0x80U)
{
} /*等待*/
CANREG3->IF2CMD = 0x17U;
/**-设置位时序
* —设置波特率预分频器扩展
* -设置 TSeg2
* -设置 TSeg1
* -设置样本跳转宽度
* —设置波特率预分频器
*
canREG3->BTR =(uint32)((uint32) 0U <<16U)|
(uint32)((uint32)(4U - 1U)<<12U)|
(uint32)((uint32)((6U + 4U)- 1U)<<8U)|
(uint32)((uint32)(4U - 1U)<<6U)|
(uint32)(uint32) 9U;
/**- CAN3端口输出值*/
canREG3->TIOC =(UINT32)((UINT32) 1U <<18U)
|(uint32)((uint32) 0U <<17U)
|(uint32)((uint32) 0U <<16U)
|(uint32)((uint32) 0U << 3U)
|(uint32)((uint32) 1U <<2U)
|(uint32)((uint32) 1U <<1U);
canREG3->RIOC =(UINT32)((UINT32)0U <<18U)
|(uint32)((uint32) 0U <<17U)
|(uint32)((uint32) 0U <<16U)
|(uint32)((uint32) 0U << 3U)
|(uint32)((uint32) 1U <<2U)
|(uint32)((uint32) 0U << 1U);
/**-离开配置和初始化模式*/
canREG3->CTL &=~(uint32)(0x00000041U);
/**@注意,必须先调用此函数,然后才能使用驱动程序。\n
* 此函数必须在特权模式下执行。\n
*/
*用户代码开始(5)*/
}
