Renesas瑞萨A4M2和STM32 CAN通信

news2024/10/1 7:46:34

刚好拿到一块瑞萨开发板,捣鼓玩下CAN,顺便试下固件升级。

A4M2 工程创建

详细可以参考,我之前写的文章 Renesa 瑞萨 A4M2 移植文件系统FAT32
在这里插入图片描述
CAN0 配置信息,使能FIFO,接收标准帧 ID为0x50,数据帧。
在这里插入图片描述

代码

void can_Init(void)
{
    fsp_err_t err = R_CAN_Open(&g_can0_ctrl, &g_can0_cfg);
}

/* CAN 中断回调函数 */
void can_callback(can_callback_args_t * p_args)
{
    switch (p_args->event)
    {
        case CAN_EVENT_RX_COMPLETE: //接收完成中断
        {
            can_rx_complete_flag = true;    //can接收到数据

            /* 读取接收帧 */
            memcpy(&can_rx_frame, &(p_args->frame), sizeof(can_frame_t));

            break;
        }
        case CAN_EVENT_TX_COMPLETE: //传输完成中断
        {
            can_tx_complete_flag = true;    //can数据发送完成
            break;
        }
        case CAN_EVENT_ERR_BUS_OFF:          /* Bus error event. (bus off) */
        case CAN_EVENT_ERR_PASSIVE:          /* Bus error event. (error passive) */
        case CAN_EVENT_ERR_WARNING:          /* Bus error event. (error warning) */
        case CAN_EVENT_BUS_RECOVERY:         /* Bus error event. (bus recovery) */
        case CAN_EVENT_MAILBOX_MESSAGE_LOST: /* Overwrite/overrun error */
        {
            can_err_status_flag = true;     //设置标志位

            /* 获取错误状态 */
            can_err_status = (can_error_t) p_args->error;

            break;
        }
        default:
        {
            break;
        }
    }
}

发送数据

can_tx_frame.id               = 0x48;//发送ID
can_tx_frame.type             = CAN_FRAME_TYPE_DATA;
can_tx_frame.data_length_code = 8;  //一次最多发送8个字节
memcpy((uint8_t*)&can_tx_frame.data[0], (uint8_t*)"########", 8);
err = R_CAN_Write(&g_can0_ctrl, CAN_MAILBOX_NUMBER_0, &can_tx_frame);
/* Error trap */
if (FSP_SUCCESS != err)
{
		CAN_MSG_PRINTF("CAN Write API FAILED");
		//while(1);
}
/* 等待传输完成 */
while ((true != can_tx_complete_flag) && (--time_out));
can_tx_complete_flag = false;

//typedef struct st_can_frame
//{
//    uint32_t         id;                           ///< CAN ID.
//    can_id_mode_t    id_mode;                      ///< Standard or Extended ID (IDE).
//    can_frame_type_t type;                         ///< Frame type (RTR).
//    uint8_t          data_length_code;             ///< CAN Data Length Code (DLC).
//    uint32_t         options;                      ///< Implementation-specific options.
//    uint8_t          data[CAN_DATA_BUFFER_LENGTH]; ///< CAN data.
//} can_frame_t;

//接收数据
while (false == can_rx_complete_flag);
can_rx_complete_flag = false;
printf("%s",can_rx_frame.data)

STM32 CAN工程

CAN外设初始化

#define TX_CAN_UPDATE 0x50
#define RX_CAN_UPDATE 0x48

u8 CAN1_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)
{

  	GPIO_InitTypeDef GPIO_InitStructure; 
	  CAN_InitTypeDef        CAN_InitStructure;
  	CAN_FilterInitTypeDef  CAN_FilterInitStructure;
   	NVIC_InitTypeDef  NVIC_InitStructure;
	  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能PORTA时钟	                   											 

  	RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能CAN1时钟	
	
    //初始化GPIO
	  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11| GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
    GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化PA11,PA12
	
	  //引脚复用映射配置
	  GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_CAN1); //GPIOA11复用为CAN1
	  GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_CAN1); //GPIOA12复用为CAN1
	  
  	//CAN单元设置
   	CAN_InitStructure.CAN_TTCM=DISABLE;	//非时间触发通信模式   
  	CAN_InitStructure.CAN_ABOM=DISABLE;	//软件自动离线管理	  
  	CAN_InitStructure.CAN_AWUM=DISABLE;//睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)
  	CAN_InitStructure.CAN_NART=ENABLE;	//禁止报文自动传送 
  	CAN_InitStructure.CAN_RFLM=DISABLE;	//报文不锁定,新的覆盖旧的  
  	CAN_InitStructure.CAN_TXFP=DISABLE;	//优先级由报文标识符决定 
  	CAN_InitStructure.CAN_Mode= mode;	 //模式设置 
  	CAN_InitStructure.CAN_SJW=tsjw;	//重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1tq~CAN_SJW_4tq
  	CAN_InitStructure.CAN_BS1=tbs1; //Tbs1范围CAN_BS1_1tq ~CAN_BS1_16tq
  	CAN_InitStructure.CAN_BS2=tbs2;//Tbs2范围CAN_BS2_1tq ~	CAN_BS2_8tq
  	CAN_InitStructure.CAN_Prescaler=brp;  //分频系数(Fdiv)为brp+1	
  	CAN_Init(CAN1, &CAN_InitStructure);   // 初始化CAN1 
    
		//配置过滤器
 	  CAN_FilterInitStructure.CAN_FilterNumber=0;	  //过滤器0

	 u32 ID1 = RX_CAN_UPDATE;
	 u32 ID2 = TX_CAN_UPDATE;

    CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdList; 
    CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
    ID1 %= (1 << 11);
    ID2%= (1 << 11);
    //标准帧的帧ID长度是11位,帧ID的范围是000-7FF。
    //扩展帧的帧ID长度是29位,帧ID的范围是0000 0000-1FFF FFFF
    CAN_FilterInitStructure.CAN_FilterIdHigh = ID1  << 5; 
    CAN_FilterInitStructure.CAN_FilterIdLow = CAN_ID_STD | CAN_RTR_DATA;
    CAN_FilterInitStructure.CAN_FilterMaskIdHigh = ID2 << 5;
    CAN_FilterInitStructure.CAN_FilterMaskIdLow = CAN_ID_STD | CAN_RTR_DATA;
    CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0;
    CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; 
    CAN_FilterInit(&CAN_FilterInitStructure);
		

	 CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0消息挂号中断允许.		    
  
  	NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
  	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     // 主优先级为1
  	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            // 次优先级为0
  	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  	NVIC_Init(&NVIC_InitStructure);
	return 0;
}   

void CAN1_RX0_IRQHandler(void)
{
	u8 i =0;
	CanRxMsg msg;
	CAN_Receive(CAN1, CAN_FIFO0, &msg);

	if(msg.IDE == CAN_ID_STD && msg.StdId == RX_CAN_UPDATE)
	{
		for(i=0;i<msg.DLC;i++){
			Rx_Buffer[i] = msg.Data[i];
		}
	}

以上配置只会收到数据帧的ID为0x50和0x48,其他都会被过滤掉。
关于这部分,可以看我之前写 STM32 CAN通信理解(是半双工还是全双工?)

开发版间CAN通信发送和接收都正常。

在这里插入图片描述
OTA也正常。
在这里插入图片描述
使用CAN通信,主要是想为固件升级教程,使用CAN做通信升级做些准备。后面有空持续更新这个系列教程 MCU固件升级系列1(STM32)
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/485155.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

汇编语言学习笔记六

flag 寄存器 CF:进位标志位&#xff0c;产生进位CF1&#xff0c;否则为0 PF:奇偶位&#xff0c;如010101b&#xff0c;则该数的1有3个&#xff0c;则PF0,如果该数的1的个数为偶数&#xff0c;则PF1。0也是偶数 ZF:在相关指令执行后&#xff08;运算和逻辑指令&#xff0c;传送指…

yml、xml、json文件

目录 一、yml &#xff08;1&#xff09;注释 &#xff08;2&#xff09;内容语法 &#xff08;3&#xff09;取名规范 二、xml &#xff08;1&#xff09;注释 &#xff08;2&#xff09;内容语法 声明头 标签 关于cdata 三、json &#xff08;1&#xff09;注释 …

MySQL库和表

MySQL库操作 创建数据库 语法 CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [,create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name说明: 大写的表示关键字[ ]是可选项CHARACTER…

axios使用笔记

文章目录 基本语法其他语法defaults config作用案例 创建实例对象作用案例 拦截器 interceptor&#xff08;AOP&#xff09;请求取消&#xff08;节流&#xff09; 基本语法 <!doctype html> <html lang"en"> <head><meta charset"UTF-8&…

ADRC自抗扰算法优化(PLC梯形图篇)

ADRC自抗扰算法PLC梯形图完整源代码请参看下面博客文章: ADRC自抗扰控制算法(含梯形图完整源代码和算法公式)_adrc算法_RXXW_Dor的博客-CSDN博客PLC的自抗扰控制(ADRC)算法_RXXW_Dor的博客-CSDN博客_adrc算法1、自抗扰控制算法,网上很多文章有所讲解,大家也可以关注韩京清…

6WINDGate-overview

6WINDGate Overview Author&#xff1a;Once Day Date&#xff1a;2023年4月29日 本文是对6WIND官网文档的整理和翻译&#xff0c;仅供学习和研究之用&#xff0c;原始文章可参考下面文档&#xff1a; 6WINDGate Documentation - 6WIND6WINDGate Modules — 6WINDGate Modul…

武忠祥老师每日一题||定积分基础训练(三)

常用的基本不等式&#xff1a; sin ⁡ x < x < t a n x , x ∈ ( 0 , π 2 ) \sin x<x<\ tan x,x\in(0,\frac{\pi}{2}) sinx<x< tanx,x∈(0,2π​) e x ≥ 1 x , x ∈ ( − ∞ , ∞ ) e^x\ge1x,x\in(-\infty,\infty) ex≥1x,x∈(−∞,∞) x 1 x ≤ ln …

Ubuntu20.04 交叉编译Paddle-OCR

第一步&#xff1a;交叉编译Paddle-Lite 参考链接&#xff1a;https://blog.csdn.net/sz76211822/article/details/130466597?spm1001.2014.3001.5501 第二步&#xff1a;交叉编译opencv4.x 参考链接&#xff1a;https://blog.csdn.net/sz76211822/article/details/13046168…

浅聊AIOT

引言 IoT是(Internet of Things)的简称&#xff0c;也就是人们常说的物联网&#xff1b;随着智能硬件的发展和推广&#xff0c;制造成本也随之下降&#xff0c;很多的厂家也慢慢地拥抱网络互联&#xff0c;逐步实现设备互联&#xff0c;也就进入了人们常说的万物互联时代。虽然…

linux网络统计指令:netstat

这里写自定义目录标题 一 netstat的作用以及安装命令1.1 作用1.2 安装命令 二 基本语法1.1 netstat -a1.2 netstat -e1.3 netstat -anp 三 查看指定端口的使用状况 一 netstat的作用以及安装命令 1.1 作用 主要用于显示IP和TCP、UDP与ICMP相关的统计数据&#xff0c;一般用于…

C++笔记——第十五篇 C++11来了 (上)

目录 1. C11简介 2. 列表初始化 2.1 C98中{}的初始化问题 2.2 内置类型的列表初始化 2.3 自定义类型的列表初始化 1. 标准库支持单个对象的列表初始化 2. 多个对象的列表初始化 3. 变量类型推导 3.1 为什么需要类型推导 3.2 decltype类型推导 3.2.1 为什么需要dec…

微服务全链路追踪选型:Zipkin、Pinpoint、SkyWalking、CAT

基于微服务架构&#xff0c;由于服务拆分粒度比较细&#xff0c;并且服务复用范围增大&#xff0c;不太可能再通过人工登记的方式进行接口调用情况的管理&#xff0c;因此对于每个请求的调用情况追踪将成为不可忽视的问题。追踪请求的调用情况&#xff0c;主要有几个作用&#…

分布式一致性Hash算法原理及实现【负载均衡】

文章目录 一致性Hash原理提高容错性和和扩展性一致性Hash实现思路代码 一致性Hash原理 简单来说&#xff0c;一致性Hash算法将整个哈希值空间组织成一个虚拟的圆环&#xff0c; 如假设某哈希函数 H 的值空间为 0 ~ 2^32-1&#xff08;即哈希值是一个32位无符号整形&#xff09;…

什么是POTDR?POTDR在光缆线路维护中有哪些应用

1 引言 OTDR&#xff08;Optical Time Domain Reflectometer&#xff0c;光时域反射仪&#xff09;是光缆线路工程及维护中的常用仪表&#xff0c;是利用光信号在光纤中传输时的瑞利散射和菲涅尔反射&#xff0c;通过反射曲线来了解光纤沿长度的损耗分布情况&#xff0c;可测量…

基于C#编程建立泛型Matrix数据类型及对应处理方法

一、简介 上一篇文档中描述了如何写一个Vector<T>类&#xff0c;本次在上一篇文档基础上&#xff0c;撰写本文&#xff0c;介绍如何书写一个泛型Matrix&#xff0c;可以应用于int、double、float等C#数值型的matrix。 本文所描述的Matrix<T>是一个泛型&#xff0c;…

一个人在家怎么赚钱?普通人如何通过网络实现在家就能赚钱

近年来&#xff0c;随着互联网的飞速发展&#xff0c;嗅觉敏锐的人只要使用互联网就可以快乐地赚钱。一般来说&#xff0c;网上赚钱的投资较少&#xff0c;有时有一台能上网的电脑或手机就够了&#xff0c;所以大家有时称其为“无成本或低成本网赚”。今天就分享一个人在家如何…

23种设计模式第一章:单例模式

这里写自定义目录标题 一 单例模式1 静态常量饿汉式2 静态代码块饿汉式3 线程不安全懒汉式4 线程安全懒汉式线程安全&#xff0c;同步方法线程安全&#xff0c;同步代码块 5 doubleCheck&#xff08;双重检查&#xff0c;推荐使用&#xff09;6 静态内部类7 枚举 一 单例模式 …

K8s 安全是云安全的未来

导语 到 2025 年&#xff0c;保护 Kubernetes (K8s) 将被认为是云安全最重要的方面。 在最成功的组织中&#xff0c;CTO 和 CISO 已经意识到 Kubernetes 安全的重要性。 但是&#xff0c;虽然 Kubernetes 已经占 CTO 云支出的很大一部分&#xff0c;但 CISO 仍然有所落后。 大…

基于web的课程重难点掌握情况分析系统

1&#xff0e;系统登录&#xff1a;系统登录是用户访问系统的路口&#xff0c;设计了系统登录界面&#xff0c;包括用户名、密码和验证码&#xff0c;然后对登录进来的用户判断身份信息&#xff0c;判断是管理员用户还是普通用户。 2&#xff0e;系统用户管理&#xff1a;不管是…

19.考虑柔性负荷的综合能源系统日前优化调度模型

说明书 MATLAB代码&#xff1a;考虑柔性负荷的综合能源系统日前优化调度模型 关键词&#xff1a;柔性负荷 需求响应 综合需求响应 日前优化调度 综合能源系统 参考文档&#xff1a;《考虑用户侧柔性负荷的社区综合能源系统日前优化调度》参考柔性负荷和基础模型部分&#xf…