主题中讨论的其他部件:HALCOGEN
王工:
您好,通过HALCoGen将DCAN2、DCAN3对应的TX、RX配置成GPIO模式,且均为输入
故障现象CAN2的TX引脚导通时电平为0V,CAN3的TX引脚导通时电平2.5V,通过HALCoGen生成驱动文件“HL_CAN.c”,在文件中canInit函数中,对CAN2、CAN3的配置不一致,请问一下什么会出现这个情况(将CAN3的配置手动改成和CAN2的一样,CAN3 TX电平测量正常)
void canInit (void)(无效)
{
/*用户代码开始(4)*/
/*用户代码结束*/
/**@b初始化@b CAN2:*/
/**-设置控制寄存器
*-进入初始化模式
*/
canREG2->CTL = 0x0.0001万U;
/**- CAN2端口输出值*/
canREG2->TIOC =(UINT32)((UINT32)1U <18U )
|(UINT32)((UINT32)0U <<17U )
|(UINT32)((UINT32)0U <<16U )
|(UINT32)((UINT32)0U << 3U )
|(UINT32)((UINT32)0U <<2U )
|(UINT32)((UINT32) 0U << 1U);
canREG2->RIOC =(UINT32)((UINT32) 1U << 18U)
|(UINT32)((UINT32)0U <<17U )
|(UINT32)((UINT32)0U <<16U )
|(UINT32)((UINT32)0U << 3U )
|(UINT32)((UINT32)0U <<2U )
|(UINT32)((UINT32)0U <<1U);
/**@b初始化@b CAN3:*/
/**-设置控制寄存器
*-禁用总线自动唤醒活动
*-禁用本地断电模式
*-禁用DMA请求行
*-启用全局中断线0和1
*-禁用调试模式
*-软件重置释放
*-启用/禁用奇偶校验或ECC
*-启用/禁用自动总线开启计时器
*-进入调试状态前设置消息完成
*-设置正常操作模式
*-请求对配置寄存器的写入访问权限
*-设置自动重新传输消息
*-禁用错误中断
*-禁用状态中断
*-进入初始化模式
*/
canREG3->CTL =(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)((UINT32) 0x0.0005万U << 10U)
| 0x2.0043万U;
/**-清除所有待定错误标志并重置当前状态*/
canREG3->ES |= 0xFFFFU;
/**-为讯息指派中断级别*/
canREG3->INTMUXx[0U]=(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U;
canREG3->INTMUXx[1U]=(UINT32) 0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U
|(UINT32)0x0万U;
/**-设置自动总线打开计时器周期*/
canREG3->ABOTR =(UINT32) 0U;
/**-为数据传输设置IF1
*-等待IF1准备就绪,可供使用
*-设置IF1控制字节
*/
/*SAFETYMCUSW 28 D MR:NA <approved>“Potentially Infinite loop found - Hardware Status check for execution sequence”*/
while ((canREG3->IF1STAT & 0x80U)=0x80U)
{
}/*等待*/
canREG3->IF1CMD = 0x87U;
/**-设置用于读取数据的IF2
*-等待IF1准备就绪,可供使用
*-设置IF1控制字节
*/
/*SAFETYMCUSW 28 D MR:NA <approved>“Potentially Infinite loop found - Hardware Status check for execution sequence”*/
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) 1U <<16U)
|(UINT32)((UINT32)0U << 3U )
|(UINT32)((UINT32)0U <<2U )
|(UINT32)((UINT32) 0U << 1U);
canREG3->RIOC =(UINT32)((UINT32) 1U << 18U)
|(UINT32)((UINT32)0U <<17U )
|(UINT32)((UINT32) 1U <<16U)
|(UINT32)((UINT32)0U << 3U )
|(UINT32)((UINT32)0U <<2U )
|(UINT32)((UINT32) 0U << 1U);
/**-退出配置和初始化模式*/
canREG3->CTL &=~(UINT32)(0x0.0041万U);
/**@注意在使用驱动程序之前必须调用此函数。\n
*此功能必须在特权模式下执行。\n
*/
}