打印
[应用笔记]

CHIPON 芯旺微的KF32A156系列的CAN FD模块的使用介绍

[复制链接]
1319|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
慢醇|  楼主 | 2023-6-8 23:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
hello大家好,今天主要来说KF32A156系列(包括KF32A146/KF32A136)的CAN FD模块的使用(这里均已A02版本为准)。毕竟是车规级的芯片嘛,can的使用是最重要的外设之一,所以先把CAN FD的使用放在前面。
首先介绍一下CAN FD模块的相关介绍 :
CANFD 模块是 CAN 的升级版本,它同时支持 CANFD(CAN with Flexible Data rate)协议和 CAN 2.0B 协议,两种协议下均可收发标准帧和扩展帧。在收发 CAN FD 帧时,帧数据长度最大可以达到 64 字节,发送速率可以达到 8Mb/s。

can2.0和canfd协议我这里就不详细介绍了,网上资料也比较多。

使用CANFD模块的建议先放在前面:
1、务必使用外部晶振做为工作时钟的来源;
2、尽可能使用1个发送邮箱,其余的可以根据需要配置为多个接收邮箱;

(一)了解一下芯旺微canfd的结构
canfd外设本身配置就是配置寄存器,邮箱是芯片硬件在RAM里面开辟的单独空间,发送can帧的数据都是往ram的邮箱里面去丢,接收can帧也是去ram里面进行存取。下面是操作代码的部分。


使用特权

评论回复
评论
慢醇 2023-6-8 23:45 回复TA
———————————————— 版权声明:本文为CSDN博主「阿范1」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/Fanshijun1/article/details/128143846 
沙发
慢醇|  楼主 | 2023-6-8 23:44 | 只看该作者
寄存器部分
基本配置其实库函数已经进行了配置,具体的可以直接点进去查看库函数里面的内容,这里想说的是注意有个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 这个参数是个结构体,点进去可以看到结构体里面的参数,好在是基本上都会有宏定义放好了,配置比较方便。

使用特权

评论回复
板凳
慢醇|  楼主 | 2023-6-8 23:44 | 只看该作者
发送邮箱配置
                //这里仅仅只是对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);

使用特权

评论回复
地板
慢醇|  楼主 | 2023-6-8 23:44 | 只看该作者
接收邮箱配置
初始化的配置是在初始化canfd外设完成后进行的配置
//初始化的配置
Canfd_Sdu.Can_MailboxHeader[0].TransceiveType = MAIL_RECEIVE;
for(uint8_t i = 1 ; i<=20 ; i++)
        {
                //调用更新邮箱的函数,配置为接受邮箱
                Can_m_FdMailBox_Write(CANfd6, i,&Canfd_Sdu.Can_MailboxHeader[0]);
        }

//中断服务函数里面,判断到接收中断后,去查询接收邮箱
        if (Can_Controller_InterruptFlag.RxIntFlag == 0x01)
        {

                for(uint8_t i = 1 ; i<=20 ; i++)
                        {
                        if(Can_m_FdGetMailBoxState(CANfd6,i) == MAIL_RECEIVE_SUCCESS)
                        {
                                /* Read recevie mailbox information and reinitialize mailbox code */
                                if(Can_m_FdMailBox_Read(CANfd6, i, &Canfd_MailboxHeader_R,MAIL_RECEIVE) == CAN_OK)
                                {
                                        //USER CODE
                                }
                        }

                        }
        }

使用特权

评论回复
5
慢醇|  楼主 | 2023-6-8 23:44 | 只看该作者
中断配置
中断一般是会开启 发送中断 、接收中断、can_busoff中断、can_error中断

好啦,以上这些配置完成后,基本上就可以进行can的收发啦。

使用特权

评论回复
6
tpgf| | 2023-7-5 11:53 | 只看该作者
CAN FD协议由Bosch(与行业专家)预先开发,并于2012年发布

使用特权

评论回复
7
nawu| | 2023-7-5 12:04 | 只看该作者
CAN FD 每个数据帧最多支持64个数据字节,而Classic CAN 支持8个数据字节。这减少了协议开销,并提高了协议效

使用特权

评论回复
8
zljiu| | 2023-7-5 13:25 | 只看该作者
在某些条件下,可以混合使用CAN FD和经典CAN ECU。

使用特权

评论回复
9
gwsan| | 2023-7-5 13:45 | 只看该作者
CAN FD使用改进的循环冗余校验(CRC)和“受保护的填充位计数器”,从而降低了未被检测到的错误的风险

使用特权

评论回复
10
tfqi| | 2023-7-5 14:14 | 只看该作者
与经典CAN 相比,CAN FD可以将网络带宽提高3到8 倍,从而为数据增长提供了一种简单的解决方案

使用特权

评论回复
11
aoyi| | 2023-7-5 19:40 | 只看该作者
CAN FD支持双比特率:经典CAN中给定的标称(仲裁)比特率限制为1 Mbit / s,而数据比特率则取决于网络拓扑和收发器。实际上,可以实现高达5 Mbit / s的数据比特率。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

127

主题

1262

帖子

5

粉丝