can的使用是毕竟是车规级的芯片最重要的外设之一,首先介绍一下CAN FD模块的相关介绍 :
ANFD 模块是 CAN 的升级版本,它同时支持 CANFD(CAN with Flexible Data rate)协议和 CAN 2.0B 协议,两种协议下均可收发标准帧和扩展帧。在收发 CAN FD 帧时,帧数据长度最大可以达到 64 字节,发送速率可以达到 8Mb/s。
使用CANFD模块的建议:
1、务必使用外部晶振做为工作时钟的来源;
2、尽可能使用1个发送,其余的可以根据需要配置为多个接收;
(一)了解一下芯旺微canfd的结构
canfd外设本身配置就是配置寄存器,邮箱是芯片硬件在RAM里面开辟的单独空间,发送can帧的数据都是往ram的邮箱里面去丢,接收can帧也是去ram里面进行存取。下面是操作代码的部分。
1、寄存器部分
基本配置其实库函数已经进行了配置,具体的可以直接点进去查看库函数里面的内容,这里想说的是注意有个RSMOD,这个是复位canfd外设的位。当busoff的时候,该位是会置1,常常将其清0做为恢复busoff,代码如下:
Canfd_Gpio_Init(); //配置位对应的pin脚
Can_m_FdControllerDeInit(CANfd6); //复位外设和初始化canfd6的时钟
//配置canfd6外设
Can_m_FdControllerInit(CANfd6, Canfd_Controller_AllConfig,Initindex_0);
这里面的外设配置离不开三步走:配置所需引脚重映射为某功能 — 开启外设时钟 — 配置外设底层驱动
Canfd_Controller_AllConfig 这个参数是个结构体,点进去可以看到结构体里面的参数,好在是基本上都会有宏定义放好了,配置比较方便。
2、发送配置
//这里仅仅只是对can帧的结构体进行某些参数的配置
Canfd_Sdu.Can_MailboxHeader[0].TransceiveType = MAIL_TRANSMIT; //配置为发送
Canfd_Sdu.Can_MailboxHeader[0].BRS = CANFD_BRS_DISABLE; //加速波特率切换
Canfd_Sdu.Can_MailboxHeader[0].Can_frame = CAN_FRAME_CLASSICAL ; //can or canfd
Canfd_Sdu.Can_MailboxHeader[0].Id = 0x100; //can id
//更新邮箱,往Mailbox_0(也就是第一个邮箱)写入刚刚配置的参数
Can_m_FdMailBox_Write(CANfd6, Mailbox_0,&Canfd_Sdu.Can_MailboxHeader[0]);
//当配置完成后,即可执行发送函数,此函数是进行手动邮箱仲裁
Can_m_FdTransmit(CANfd6);
|