航顺HK32F系列MCU都采用的是ARM®Cortex内核架构,其中HK32F103家族使用的是Cortex-M3内核,支持96M的系统时钟,内部资源以及外设丰富,其内部自带的CAN模块应用非常广泛。工业类,汽车电子产品大部分需要用到CAN通讯协议,并且采用正向设计软硬件全兼容国外进口产品,本节就针对航顺HK32F103x8xB系列MCU 的CAN应用差异部分做个说明。
CAN是控制器局域网络(Controller Area Network, CAN)的简称,是由以研发和生产汽车电子产品著称的德国BOSCH公司开发的,并最终成为国际标准(ISO 11898),是国际上应用最广泛的现场总线之一。在北美和西欧,CAN总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以CAN为底层协议专为大型货车和重工机械车辆设计的J1939协议。
CAN总线的特点——————————————————
(1)它是一种多主总线,即每个节点机均可成为主机,且节点机之间也可进行通信。
(2)通信介质可以是双绞线、同轴电缆或光导纤维,通信速率可达1mb/s。
(3)CAN总线通信接口中集成了CAN协议的物理层和数据链路层功能,可完成对通信数据的成帧处理,包括位填充、数据块编码、循环冗余校验、优先级判别等项工作。
(4)CAN协议的一个最大特点是废除了传统的站地址编码,代之以对通信数据块进行编码。采用这种方法的优点是可使网络内的节点个数在理论上不受限制,数据块的标识码可由11位或29位二进制数组成,因此可以定义211或229个不同的数据块,这种数据块编码方式,还可使不同的节点同时接收到相同的数据,这一点在分步式控制中非常重要。
(5)数据段长度最多为8个字节,可满足通常工业领域中控制命令、工作状态及测试数据的一般要求。同时,8个字节不会占用总线时间过长,从而佐证了通信的实时性。
(6)CAN协议采用crc检验并可提供相应的错误处理功能,保证了数据通信的可靠性。CAN总线所具有的卓越性能、极高的可靠性和独特设计,特别适合工业设备测控单元互连。因此备受工业界的重视,并已公认为最有前途的现场总线之一。
以下为用户使用HK芯片替代S*M 系列的CAN应用常见的问题
CAN 环回测试失败
MXCube 比较老的版本(比如 4.17.0),产生的 CAN 初始化代码不正确。
错误如下:
while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK))
……
while(HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK))
解决方案:
1.确认库版本,经过我们测试发现,这2个判断顺序反了,MXCube4.22.0产生的CAN初始化代码已经交换过来了
CAN 初始化不能完成
CAN总线在没有数据发送时,默认为隐性。对于我们芯片CANRX就应该是高电平,如果CAN网络出现异常,将总线拉成显性,或者,测试中CANRX接口没有接PHY芯片,也没有接上拉电阻,我们芯片都会出现CAN初始化不能完成,S*T*M32F103相同条件下可以初始化完成。
根本原因:
我们芯片在初始化过程中会判断总线的隐性状态,如果不是隐性,不能完成初始化。
解决方案:
1. CANRX 必须接上拉电阻或内部上拉。
MSR寄存器INAK 置位慢
客户使用CAN接口标准库,初始化CAN控制器,HK32F103在INRQ置位后,INAK并没有立即置1,导致客户代码进入Fail,后续初始化程序没有运行到。
客户原始代码如下:
/* Request initialisation */
CAN->MCR = CAN_MCR_INRQ;
/* ...and check acknowledged */
if ((CAN->MSR & CAN_MSR_INAK) == 0)
{
InitStatus = CANINITFAILED;
}
else
{初始化CAN控制器的寄存器}
推荐方案:在设置INRQ后,延时等待检查INAK=1后,再进行初始化。
/* Request initialisation */
CAN->MCR = CAN_MCR_INRQ;
while((CAN->MSR & CAN_MSR_INAK) ==0)
{
i++;
if(i>100)return CANINITFAILED;
}
/* ...and check acknowledged */
if ((CAN->MSR & CAN_MSR_INAK) == 0)
{
InitStatus = CANINITFAILED;
}
else
{初始化CAN控制器的寄存器
}
根本原因:
HK32F103在INRQ置位后,INAK需要98个PCLK才会被置1。
航顺F1系列专用函数库以及S*M最新的标准库都是加了延时了。 |