jf101 发表于 2023-2-20 09:50

KF32A156系列的CAN FD模块的使用介绍

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.TransceiveType = MAIL_TRANSMIT;//配置为发送
                Canfd_Sdu.Can_MailboxHeader.BRS = CANFD_BRS_DISABLE;//加速波特率切换
                Canfd_Sdu.Can_MailboxHeader.Can_frame = CAN_FRAME_CLASSICAL ;//can or canfd
                Canfd_Sdu.Can_MailboxHeader.Id = 0x100;//can id
       
                //更新邮箱,往Mailbox_0(也就是第一个邮箱)写入刚刚配置的参数
                Can_m_FdMailBox_Write(CANfd6, Mailbox_0,&Canfd_Sdu.Can_MailboxHeader);
               
                //当配置完成后,即可执行发送函数,此函数是进行手动邮箱仲裁
                Can_m_FdTransmit(CANfd6);


jf101 发表于 2023-2-20 09:53

3、接收配置

初始化的配置是在初始化canfd外设完成后进行的配置
//初始化的配置
Canfd_Sdu.Can_MailboxHeader.TransceiveType = MAIL_RECEIVE;
for(uint8_t i = 1 ; i<=20 ; i++)
        {
                //调用更新邮箱的函数,配置为接受邮箱
                Can_m_FdMailBox_Write(CANfd6, i,&Canfd_Sdu.Can_MailboxHeader);
        }

//中断服务函数里面,判断到接收中断后,去查询接收邮箱
        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
                                }
                        }

                        }
        }

4、中断配置
相关分发送、接收都放在中断中进行就可以,中断配置也比较简单就不再赘述了!

259872544 发表于 2023-2-22 16:20

本帖最后由 259872544 于 2023-2-22 16:23 编辑

跟CSDN 有篇差不多啊

tpgf 发表于 2023-3-6 10:57

Can与CanFD主要区别:传输速率不同、数据长度不同、帧格式不同、ID长度不同。

八层楼 发表于 2023-3-6 11:23

CANFD:可以理解成CAN协议的升级版,只升级了协议,物理层未改变

观海 发表于 2023-3-6 11:47

CanFD:速率可变,仲裁比特率最高1Mbps(与CAN相同),数据比特率最高8Mbps

guanjiaer 发表于 2023-3-6 12:06

CanFD新增了FDF、BRS、ESI位。
FDF:表示CAN报文还是CAN-FD报文。
BRS:表示位速率转换,该位隐性时,速率可变(即BSR到CRC使用转换速率传输),该位为显性时,以正常的CAN-FD总线速率传输(恒定速率);
ESI:表示发送节点状态。

heimaojingzhang 发表于 2023-3-6 12:19

CAN标准帧ID长度最长11bit
CANFD标准帧ID长度可扩展到12bit。

keaibukelian 发表于 2023-3-6 12:54

总的感觉就是CANFD是can的升级 那么在使用的时候配置会不同吗

szt1993 发表于 2023-5-21 20:28

CAN标准帧ID长度最长11bit,CANFD标准帧ID长度可扩展到12bit,一般都有标准函数库,直接调用就可以

cemaj 发表于 2023-6-7 13:44

canfd和CAN总线是一个东西吗?

hearstnorman323 发表于 2023-6-10 10:23

在设计CAN FD应用时需要考虑硬件和软件的处理能力。如果处理能力不足,则可能会导致数据传输延迟或丢失,影响系统性能。

wangdezhi 发表于 2023-6-10 11:02

can fd总线是基于哪些因素而出现的

beacherblack 发表于 2023-6-10 11:10

CAN FD协议的数据传输速率更高

juliestephen 发表于 2023-6-10 11:16

can -fd相对于CANBUS在哪里有了提升呢?

elsaflower 发表于 2023-6-10 11:51

CAN FD是一种基于经典CAN总线的新型通信协议,它具有更高的数据传输速率和更大的数据负载能力。

ingramward 发表于 2023-6-10 12:25

可以选择在CAN FD模式或经典CAN模式下进行通信?

hearstnorman323 发表于 2023-6-10 12:31

在使用CAN FD模块进行通信时,需要保证CAN FD模块与其他设备之间的物理连接正确并稳定。

rosemoore 发表于 2023-6-10 12:38

CAN总线和CAN FD的can总线分析工具通用吗?

1988020566 发表于 2023-6-10 12:48

能够实现CAN与CAN FD之间的转换吗?
页: [1] 2 3
查看完整版本: KF32A156系列的CAN FD模块的使用介绍