0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用 AS32A601和1042CAN控制器来实现CANFD的收发功能?

安芯 来源:jf_29981791 作者:jf_29981791 2025-11-30 10:44 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1. 简介

控制器局域网络(CAN)根据 ISO11898-1:2015和 Bosch CAN FD规范进行通信。连接到物理层需要额外的收发器硬件。所有有关处理消息的函数都由接收处理程序和发送处理程序实现。

CAN/CANFD特性介绍:

  • 数据长度扩展:传统CAN的数据段长度固定为8字节,而CAN FD将数据段长度扩展至最大64字节。这意味着单次报文可传输更多数据,减少了报文发送次数,降低了总线负载,尤其适用于需要传输大量参数或传感器数据的场景。
  • 传输速率提升:CAN FD采用“双速率段”设计,报文的仲裁段(用于ID识别和总线仲裁)仍沿用经典CAN的速率(最高1Mbps),确保与传统CAN节点的兼容性;而数据段则可切换至更高速率(理论最大值:8 Mbps——部分高端控制器在实验室条件下,实际应用典型值:2-5 Mbps,受物理层限制(线缆质量、终端电阻EMC 等),大幅提升了数据传输效率。
  • BRS位控制速率切换:通过报文中的“总线速率切换位(BRS)”控制是否启用高速数据段。当BRS=1时,数据段采用高速率;BRS=0时,数据段与仲裁段速率一致,灵活适配不同传输需求。
  • 向下兼容:CAN FD节点可与传统CAN节点在同一总线上共存,CAN FD控制器能正确接收和解析传统CAN报文,传统CAN节点虽无法解析CAN FD报文,但不会影响总线正常通信,保障了系统升级的平滑性。

本章我们将向大家介绍如何使用 AS32A601和1042CAN控制器来实现CANFD的收发功能: 我们使用的AS32A601带有两个CAN控制器,而我们本章只使用了CAN3。

2. 硬件设计

3. 软件设计

帧结构表

3.1 基础配置代码分析

CAN/CANFD的GPIO配置,注意配置正确的复用模式

/*

  • Function: CANFD3_GPIO_Config
  • Description: Configure CANFD3.
  • Param: None.
  • Return: None.

*/

void User_CANFD3_GPIO_Init()

{

CANFD3_CLK_ENABLE();

GPIOC_CLK_ENABLE();

GPIO_InitTypeDef GPIO_InitStructure;

CANFD_InitTypeDef CANFD_InitStructure;

PLIC_InitTypeDef PLIC_InitStructure;

/* Set GPIO multiplex mapping */

GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_CAN3);

GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_CAN3);

/* GPIO Configure */

GPIO_StructInit(&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;

GPIO_InitStructure.GPIO_OType = GPIO_Out_PP;

GPIO_InitStructure.GPIO_OStrength = GPIO_OStrength_9mA;

GPIO_Init(GPIOC, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;

GPIO_InitStructure.GPIO_IType = GPIO_IPU;

GPIO_InitStructure.GPIO_OStrength = GPIO_OStrength_9mA;

GPIO_Init(GPIOC, &GPIO_InitStructure);

}

根据改公式可配置出CANFD的仲裁域、数据域波特率。计算时需要注意的是BRPTS1TS2寄存器已为加1之后的数值,不需要再加1。

波特率计算公式

void CAN_ConfigBaudrate(void)

{

/* Initializes the CANFD3 */

/* Arbitration Phase (Nominal) Baud Rate 500KHz */

/* Data Phase Baud Rate 2MHz */

CANFD_StructInit(&CANFD_InitStructure);

CANFD_InitStructure.CANFD_SRR = CANFD_SRR_RESET;

CANFD_InitStructure.CANFD_APBRPR = CANFD_APBRPR_4tp;

CANFD_InitStructure.CANFD_APBTR_APTS1 = CANFD_APBTR_TS1_30tp;

CANFD_InitStructure.CANFD_APBTR_APTS2 = CANFD_APBTR_TS2_9tp;

CANFD_InitStructure.CANFD_APBTR_APSJW = CANFD_APBTR_SJW_2tp;

CANFD_InitStructure.CANFD_DPBRPR = CANFD_DPBRPR_4tp;

CANFD_InitStructure.CANFD_DPBTR_DPTS1 = CANFD_DPBTR_TS1_30tp;

CANFD_InitStructure.CANFD_DPBTR_DPTS2 = CANFD_DPBTR_TS2_9tp;

CANFD_InitStructure.CANFD_DPBTR_DPSJW = CANFD_DPBTR_SJW_1tp;

CANFD_Init(CANFD3, &CANFD_InitStructure);

}

ID 的具体字段说明

测试设置 AFMR0 为 0xFFE00000,AFIR 为 22E00000,且写入 AFR 寄

存器的 UAF0 位为 1,则表示只有符合 ID 为 0x117 的消息才能被接收。

void CANFD3_Parm_Init(void)

{

/* CANFD receive filter configure */

CANFD_FilterInit(CANFD3, TB0, 0xFFE00000, 0x22E00000);

CANFD_AutoRetransConfig(CANFD3,ENABLE);

/* Enable new message received interrupt */

CANFD_ITConfig(CANFD3, CANFD_IT_ERXOK, ENABLE);

/* CANFD Enable */

CANFD_Enable(CANFD3);

PLIC_StructInit(&PLIC_InitStructure);

/* Configer the CANFD1 interrupt */

PLIC_InitStructure.PLIC_IRQChannel = CANFD3_IRQn;

PLIC_InitStructure.PLIC_IRQPriority = 2;

PLIC_InitStructure.PLIC_IRQChannelCmd = ENABLE;

PLIC_Init(&PLIC_InitStructure);

CANFD_ClearITPendingBit(CANFD3, CANFD_CLEAR_ALL);

}

DLC 的具体字段说明

void CANFD3_Frame_Init()

{

CANFD_TXFrameTypeDef CANFD_TXFrameStruct;

/* Set the setting ID and setting mode */

CANFD_TXFrameStruct.CANFD_TX_PROTOCOL = CANFD;

CANFD_TXFrameStruct.CANFD_TX_FORMAT = EXTENDED;

CANFD_TXFrameStruct.CANFD_TX_TYPE = DATA;

CANFD_TXFrameStruct.CANFD_Frame_ID = 0x147;

CANFD_FrameInit(CANFD3, TB1, &CANFD_TXFrameStruct);

}

/*

  • Function: CANFD3_IRQ_Handler
  • Description: CANFD3 interrupt handler function.
  • Param: None.
  • Return: None.

*/

void CANFD3_IRQ_Handler()

{

if(CANFD_GetITStatus(CANFD3, CANFD_FLAG_RXOK) != RESET)

{

/* get the receive data */

Canfd1rx_flags = 1;

/* Clear the interrupt pending bits */

CANFD_ClearITPendingBit(CANFD3, CANFD_CLEAR_RXOK);

}

}

3.2多帧CAN发送配置代码分析

需要发送多帧消息,可以直接向发送请求寄存器(TRR)写发送多帧指令。如发送 TB0 到TB2,则可以向CAN 发送缓存就绪请求寄存器(CAN_TRR)写 0x00000007。

程序同时配置并触发三帧发送后,CAN 控制器(或驱动层)会根据ID优先级规则自动仲裁:

发送初始化时,三帧数据均进入发送缓冲区(如 TB0、TB1 等发送邮箱),CAN 控制器检测到总线空闲后,同时启动三帧的位仲裁;

仲裁过程中,0x147 因 ID 最小优先赢得总线控制权,先完成数据传输;

0x147 发送完成后,总线空闲,剩余两帧再次仲裁,0x148 优先发送,最后 0x149 完成传输;

void TB0_INIT(void)

{

CANFD_TXFrameTypeDef CANFD_TXFrameStruct;

/ * Setthe settingIDandsetting mode */

CANFD_TXFrameStruct.CANFD_TX_PROTOCOL=CANFD;

CANFD_TXFrameStruct.CANFD_TX_FORMAT=EXTENDED;

CANFD_TXFrameStruct.CANFD_TX_TYPE=DATA;

CANFD_TXFrameStruct.CANFD_Frame_ID=0x149 ;

CANFD_FrameInit(CANFD3, TB0, &CANFD_TXFrameStruct);

}

void TB1_INIT(void)

{

CANFD_TXFrameTypeDef CANFD_TXFrameStruct;

/ * Setthe settingIDandsetting mode */

CANFD_TXFrameStruct.CANFD_TX_PROTOCOL=CANFD;

CANFD_TXFrameStruct.CANFD_TX_FORMAT=EXTENDED;

CANFD_TXFrameStruct.CANFD_TX_TYPE=DATA;

CANFD_TXFrameStruct.CANFD_Frame_ID=0x148 ;

CANFD_FrameInit(CANFD3, TB1, &CANFD_TXFrameStruct);

}

void TB2_INIT(void)

{

CANFD_TXFrameTypeDef CANFD_TXFrameStruct;

/ * Setthe settingIDandsetting mode */

CANFD_TXFrameStruct.CANFD_TX_PROTOCOL=CANFD;

CANFD_TXFrameStruct.CANFD_TX_FORMAT=EXTENDED;

CANFD_TXFrameStruct.CANFD_TX_TYPE=DATA;

CANFD_TXFrameStruct.CANFD_Frame_ID=0x147 ;

CANFD_FrameInit(CANFD3, TB2, &CANFD_TXFrameStruct);

}

void CANFD3_Frame _Init()

{

TB0_INIT();

TB1_INIT();

TB2_INIT();

}

/ *

***** @brief 多帧发送函数

***** @param CANFDx: CANFD外设基地址

***** @param frames: 指向CANFD_MultiTxFrameInfo结构体数组的指针,包含了所有要发送的帧的信息

***** @param numFrames: 要发送的帧的数量

***** @retval****None

*/

void CANFD_MultiTransmit(CANFD_TypeDef ***** CANFDx, CANFD_MultiTxFrameInfo ***** frames, uint32_t numFrames)

{

/ * Check the parameters */

assert_param(IS_CANFD_ALL_PERIPH(CANFDx));

assert_param(frames !****=NULL);

assert_param(numFrames >0 );

uint32_t i, j;

uint32_t ***** txaddress;

uint32_t trr_mask=0 ; // 用于触发发送的TRR位掩码

//--- 步骤 1 : 填充所有发送缓冲区并准备TRR掩码 ---

for(i=0 ; i < numFrames; i ++)

{

// 检查当前帧的参数

assert_param(IS_CANFD_TB_NUMBER(frames[i].RSTBx));

assert_param(frames[i].Canfdbuf !****=NULL);

assert_param(IS_CANFD_DATA_LENGHT(frames[i].Buflength));

//1.1 设置数据长度DLC

CANFDx->TxMessage[frames[i].RSTBx].TB_DLC &****=~CANFD_TB_DLC_DLC;

CANFDx->TxMessage[frames[i].RSTBx].TB_DLC |****=(Can_DataLen2Dlc[frames[i].Buflength] << CANFD_TB_DLC_DLC_Pos);

CANFD_NormalStatus(CANFDx);// 确保CANFD处于正常工作状态

//1.2 填充数据内容

txaddress=(uint32_t ***** )&CANFDx->TxMessage[frames[i].RSTBx].TB_DW0;

for(j=0 ; j < frames[i].Buflength; j +=4 )

{

***** txaddress++=(((uint32_t)frames[i].Canfdbuf[j] <<24 ) |

((uint32_t)frames[i].Canfdbuf[j+1 ] << 16 ) |

((uint32_t)frames[i].Canfdbuf[j+2 ] << 8 ) |

(uint32_t)frames[i].Canfdbuf[j+3 ]);

}

//1.3 设置TRR掩码,标记这个TB需要被发送

trr_mask |****= **(**1 << frames[i].RSTBx);

}

//--- 步骤 2 : 一次性触发所有帧的发送 ---

CAcFDx->TRR=trr_mask;//TRR寄存器写入掩码,触发所有指定TB的发送

//--- 步骤 3 : 等待所有帧发送完成 ---

// 注意:这种等待方式会阻塞CPU,直到所有帧发送完毕

While ((CANFDx->TRR & trr_mask) !****=0 )

// 说明:发送完成后,硬件会自动清除TRR中对应的位。

// 所以当 (TRR & trr_mask) 的结果为0时,代表所有请求发送的帧都已完成。

}

4 下板验证

基础配置验证:

验证在 CAN FD 通信中,切换BRS 位为 1(启用高速数据段)和 0(禁用,使用仲裁段速率)时,总线可以成功地在冲裁域速率和数据域速率之间切换。

配置 CAN 接收端滤波参数:根据 CAN 控制器滤波机制(如掩码模式、列表模式),设置验收码为 0x117,配置对应掩码寄存器(确保仅匹配 0x117 精准 ID,无模糊匹配),启用接收滤波功能。实现对所有非 0x117 的帧ID报文实现完全过滤(不触发接收响应、不存入接收缓冲区、不产生相关中断)。

多帧CAN发送配置验证:

本次验证充分证明:实际验证(如通过 CAN 分析仪抓包)显示:帧的发送顺序严格遵循「0x147 → 0x148 → 0x149」,无乱序或优先级倒置现象,证明多帧发送程序能够严格遵循 CAN 总线 ID 优先级仲裁规则,实现按 ID 从小到大的自动顺序发送,确保了高优先级数据的实时传输,符合 CAN 总线的通信特性和嵌入式系统的实时性要求。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • CAN控制器
    +关注

    关注

    3

    文章

    76

    浏览量

    15559
  • CANFD
    +关注

    关注

    0

    文章

    101

    浏览量

    5814
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    SIT1042A 5V 供电,IO 口兼容 3.3V,±70V 总线耐压,CAN FD 待机模式总线收发器

    SIT1042A 是一款应用于 CAN 协议控制器和物理总线之间的接口芯片,可应用于卡车、公交、 小汽车、工业控制等领域,支持 5Mbps 灵活数据速率
    发表于 02-20 11:44

    一般说明:TJA1042T/3/1

    TJA1042T/3/1高速CAN收发器提供控制器之间的接口区域网络(CAN)协议控制器和物理双
    发表于 04-03 10:04

    TJA1042高速CAN 收发器

    关键词 TJA1042、高速、低功耗、CAN 收发器摘 要TJA1042 是一款高速CAN 收发器
    发表于 11-10 13:50 365次下载

    TJA1042 高速CAN收发器产品数据手册

    TJA1042 是一款高速CAN 收发器,是CAN 控制器和物理总线之间的接口,为CAN
    发表于 03-11 16:33 180次下载

    CAN控制器收发器

    一、CAN控制器CAN控制器用于将欲收发的消息(报文),转换为符合CAN规范的
    发表于 12-04 11:21 28次下载
    <b class='flag-5'>CAN</b><b class='flag-5'>控制器</b>和<b class='flag-5'>收发器</b>

    CAN控制器CANFD中会导致什么问题

    都说CANFD是兼容CAN的,实际上这句话有个大前提,那就是CAN控制器是完全遵循ISO11898-1规范的。为什么这么说,接下来听君娓娓道来…
    的头像 发表于 07-01 11:55 3363次阅读

    细数T-BOX中TI的明星产品之CAN 收发器 | 第二节 TCAN1042-Q1:“硬核”的CAN收发器

    细数T-BOX中TI的明星产品之CAN 收发器 | 第二节 TCAN1042-Q1:“硬核”的CAN收发器
    发表于 10-31 08:23 1次下载
    细数T-BOX中TI的明星产品之<b class='flag-5'>CAN</b> <b class='flag-5'>收发器</b> | 第二节 TCAN<b class='flag-5'>1042</b>-Q1:“硬核”的<b class='flag-5'>CAN</b><b class='flag-5'>收发器</b>

    通用CAN接口芯片NCA1042兼容替代TI的TCAN1042/NXP的TJA1049T

    支持CAN FD和总线唤醒功能的故障保护CAN收发器NCA1042是一款高速CAN
    发表于 10-31 12:03 3次下载

    CAN控制器CAN收发器CAN驱动的区别是什么?

    CAN总线结构中,CAN控制器CAN收发器CAN驱动
    的头像 发表于 01-30 09:44 7502次阅读
    <b class='flag-5'>CAN</b><b class='flag-5'>控制器</b>、<b class='flag-5'>CAN</b><b class='flag-5'>收发器</b>、<b class='flag-5'>CAN</b>驱动<b class='flag-5'>器</b>的区别是什么?

    CAN收发器CAN控制器的区别

    CAN总线系统是现代工业自动化和汽车控制系统中常用的通信协议。在CAN总线系统中,CAN收发器CAN
    的头像 发表于 05-28 15:44 5295次阅读

    TCAN1042具有CAN FD和故障保护功能CAN收发器数据表

    电子发烧友网站提供《TCAN1042具有CAN FD和故障保护功能CAN收发器数据表.pdf》资料免费下载
    发表于 06-19 12:30 1次下载
    TCAN<b class='flag-5'>1042</b>具有<b class='flag-5'>CAN</b> FD和故障保护<b class='flag-5'>功能</b>的<b class='flag-5'>CAN</b><b class='flag-5'>收发器</b>数据表

    基于AS32A601的高可靠MCU在电动汽车VCU系统中的应用策略

    摘要: 随着电动汽车产业的蓬勃发展,对VCU系统的性能、可靠性和功能安全提出了更高要求。国科安芯推出的AS32A601以其卓越的性能、丰富的功能模块以及出色的安全特性,为电动汽车VCU系统
    的头像 发表于 06-27 16:13 516次阅读

    国产CANFD芯片技术特性与应用前景综述:以ASM1042系列为例

    本文综述了国科安芯推出的国产CANFD芯片ASM1042系列的技术特性与应用前景。ASM1042系列作为一款高性能的CANFD收发器,支持5
    的头像 发表于 08-27 18:02 810次阅读

    基于ASM1042A系列芯片的CAN协议扩展方案在汽车座椅控制器中的应用探讨

    摘要: 本文基于国科安芯推出的ASM1042A系列芯片的CAN协议扩展方案在汽车座椅控制器中的应用,分析了ASM1042A系列芯片的特性、功能
    的头像 发表于 10-26 17:33 1313次阅读
    基于ASM<b class='flag-5'>1042A</b>系列芯片的<b class='flag-5'>CAN</b>协议扩展方案在汽车座椅<b class='flag-5'>控制器</b>中的应用探讨

    AS32A601车规级微控制器的应用探索

    AS32A601将180 MHz RISC-V内核、2 MB 嵌入式 Flash、4 路 CAN-FD以及完整的 ASIL-B 安全机制集成于单颗芯片,为国产车规MCU提供了可批量上车的工程样本。本文结合AEC-Q100、ISO 26262与主流主机厂的技术要求,系统梳
    的头像 发表于 11-18 14:42 952次阅读