ARM学习(21)STM32 外设Can的认识与驱动编写

这篇具有很好参考价值的文章主要介绍了ARM学习(21)STM32 外设Can的认识与驱动编写。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

笔者来聊聊can的认识以及can接收数据的驱动编写

1、STM32 Can 外设的认识

Can的特性就不多说了,主要来聊聊can的一些标识符以及收发状态。can有一套收发机制,发送和接收都有硬件缓存,叫邮箱,通过下面的图可以看出,下面这张图很经典,被各大网站和博客上面引用。
ARM学习(21)STM32 外设Can的认识与驱动编写
发送时,有三个报文邮箱缓存,接收时有两个fifo缓存,每个fifo有三个邮箱。

从上面图还可以看出,can数据接收到fifo,是经过滤波器过滤才可以到fifo,总共有27个过滤器(互联型,其他只有13个)每个标识符经过一个滤波器后就可以到接收fifo。

1.1、发送过程

3个发送报文缓存邮箱,发送时如果有之前的报文没发送出去,会缓存在邮箱里面,等待发送。

之所以用邮箱,是因为邮箱不仅可以有优先级发送,也可以顺序发送(fifo)

发送时的几个状态:

  • 空状态(TME=1):邮箱空闲状态,此时肯定能请求成功,假如此时3个邮箱都不空闲,可能请求失败
  • 挂起状态(TME=0 RQCP=0 TXOK=0):TXRQ=1,请求发送数据,此时等待邮箱成为最高优先级然后发送数据(can标识符低的优先发送),因为可能存在多个邮箱数据等待发送;此时也有情况发生邮箱已满,此时就只能等待,后面发送数据,那前面状态则不变。
  • 已安排状态(TME=0 RQCP=0 TXOK=0):邮箱成为最高优先级,此时准备发送数据,准备把can数据扔到总线上面(可能此时can总线上面正在繁忙,所以要等待can总线空闲)
  • 发送状态(TME=0 RQCP=0 TXOK=0):此时can数据发送到总线上面;有自动重发选项,可以一直发送(等can总线空闲之后);也有终止请求, 可以终止发送,则会存在多种情况。
  • 发送成功(TME=1 RQCP=1 TXOK=1):数据发送成功
  • 发送失败(TME=1 RQCP=1 TXOK=0):数据发送失败,
    ARM学习(21)STM32 外设Can的认识与驱动编写

1.2、标识符过滤

can总线上面一般会有多个设备,那么总线上的数据,多个设备都会收到,那么就需要指明“地址”进行过滤掉其他数据。

can里面一般会用标识符规则来过滤数据,会根据此标识符确定是否接收该数据,一般不说标识符是can的节点,因为标识符可修改,或者该标识符可以过滤筛选一组can数据,

过滤通常有两种方法,标识符列表模式,标识符掩码模式

  • 标识符列表模式:接收的标识符和过滤器指定标识符必须完全匹配,则会被过滤出来,送到fifo邮箱。
  • 标识符掩码模式:接收的标识符和过滤器指定的标识符部分位匹配则就可以被过滤出来,送到fifo邮箱。

换句话说:筛选一组标识符,则选用掩码模式,筛选特定标识符,则选用标识符列表模式。

每个过滤器有两个寄存器可用,均是32位,可以拆分为2个16位的寄存器来使用,则相当于多了1过滤器来使用。

ARM学习(21)STM32 外设Can的认识与驱动编写
初步看上面这张表,笔者也看的不是很懂,后面仔细研究过后,其实这是一个过滤器的多种配置,

  • 32位模式下:
    • 掩码模式:标识符寄存器和掩码寄存器为一个过滤器,以标识符寄存器的值为准(笔者亲测),所以其过滤编号也是1个
    • 列表模式:两个寄存器分别代表一个ID,所以是两个过滤器,标识符寄存器在前,掩码在后(过滤器编号)。
  • 16位模式下:
    • 掩码模式:两个寄存器的低16位和高16位各组成一个32位,总共作为两个过滤器,
    • 列表模式:两个寄存器的高低16位都组成一个过滤器,总共作为四个过滤器。

然后接下来这张表就可以看懂了。多个过滤器的一种配置方式,以及编号,该编号可以再收到数据的时候打印出来,可以判断是哪个过滤器接收到的数据。

注意:

  • 只要一个过滤器满足条件就可以过滤到FIFO中,不是同时满足所有的过滤器的要求。
  • 如果同时满足多个筛选器,有优先级规则,
    • 32 位筛选器优先于 16 位筛选器。
    • 对于尺度相等的筛选器, 标识符列表模式优先于标识符掩码模式。
    • 对于尺度和模式均相等的筛选器,则按筛选器编号确定优先级(编号越低,优先级越高)

ARM学习(21)STM32 外设Can的认识与驱动编写

typedef struct 
{
	uint32 t stdid;
	uint32 t ExtId;
	uint8 t IDE;
	uint8 t RTR;
	uint8 t DLC;
	uint8 t Data[8];
	uint8 t FMI;
}CanRxMsg;
/* CanRxMsg.FMI  就是指示了哪个过滤器的过滤出来的该数据,

1.3、接收过程

接收时上述已经提过,有两个fifo,每个fifo有3个邮箱,那么总共可以存储6个报文(硬件存储)。

ARM学习(21)STM32 外设Can的认识与驱动编写
共有三个状态:有报文,报文满,报文溢出。
FMP:指示了当前有多少报文
FOVR:指示是否溢出,
需要注意的是:

  • 两个fifo是独立的,不会说是FIFO0满了,放到FIFO1,这是由过滤器决定的,满足哪个过滤器,就会放到该fifo,即使是溢出了。
  • 所以接收报文的时候,每次缓存最多就是3个报文,再多就溢出了,如果需要更大缓存, 可以软件上面加缓存,下文介绍。
  • 两个fifo,对应的是两个接收中断。

2、STM32 Can驱动函数的编写

can中断接收数据

CanRxMsg Can1RxMessage;
u8 can1_data_flag;
u8 can1_data_len;
u8 can1_broadcast_flag;
void CAN1_RX0_IROHandler(void)
{
	/*receive a can messaae*/
	CAN_Receive(CAN1,CAN FIFO,&Can1RxMessage);
	can1_data_flag = TRUE;
	can1_data_len = Can1RxMessage.DLC;
	/*check if is broadcast data */
	if(CAN_BROADCAST_CMD== Can1RxMessage.ExtId )
		can1_broadcast_flag = TRUE;
	else
		can1_broadcast_flag = FALSE:
	}
	CAN_EIFORelease(CAN1, CAN_FIFO):
	CAN_IT_Config(CAN1, CAN_IT_FMP0, DISABLE);
}

上面驱动程序只是一个简单的示例来接收can的程序,其有以下缺点:

  • 接收一个8字节,然后处理一次,然后才再可以接收,效率低,没有发挥中断的优势,将中断和处理串起来。
  • 没有发挥硬件fifo的作用(3个)
  • 超过3个fifo的数据来临时,没有缓存能力

软件fifo接收数据。

CanRxMsg Can1RxMessage;
u8 can_fifo_index ;
u8 can_rx_fifo[1024];
u8 can1_data_flag ;
u8 can1_broadcast_flag  ;
void CAN1_RX0_IRQHandler(void)
{
	if(CAN_GetFlagstatus(CAN1,CAN_FLAG_FOV0))
		printf("OVER CAN\r\n");
	u8 fifo_count;/* 3 hardware fifo for can rx */
	for(fifo_count=0; fifo_count<3; fifo_count++)
	{
		if(CAN_GetFlagstatus(CAN1,CAN_FLAG_FMPO))
		{
			/*receive a can data*/
			if(can_fifo_index >= CAN_RX_FIFO_MAX_SIZE) /*1024*/
			{
				printf("over 1k \r\n");
				CAN_ITConfig(CAN1, CAN_IT_FMPO, DISABLE);
				break;
			}
			else
			{
				CAN Receive(CAN1, CAN FIFO, &Can1RxMessage);
				memcpy(&can_rx_fifo[can_fifo_index], (u8 *)8Can1RxMessage.Data[0], Can1RxMessage.DLC);
				can_fifo_index += Can1RxMessage.DLC;
				CAN_FIFORelease(CAN1,CAN_FIFOO);
			}
			can1_data_flag = TRUE;
			/*check if is broadcast data */
			if(CAN_BROADCAST_CMD == Can1RxMessage.ExtId)
				can1_broadcast_flag  = TRUE;
			else
				can1_broadcast_flag  = FALSE:
		}
		else
			break;
	}
}

以上代码也只是demo,相应的错误处理没有增加,在溢出时,只是增加了打印,比如可以增加标志位,然后将其传递出去。文章来源地址https://www.toymoban.com/news/detail-436227.html

3、参考

到了这里,关于ARM学习(21)STM32 外设Can的认识与驱动编写的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记7 - STM32的CAN学习与测试2

    根据《KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记6 - STM32的CAN学习与测试1》的讨论,我实现了单机的回环模式的CAN测试。后来在测试中又有下面的积累。 在回环模式下,不会有ACK检定,也不会有ACK不应答的报警。 由于CANTX实际上并不把数据发给CAN收发器,只是在芯片里面转一圈就

    2024年02月22日
    浏览(50)
  • ARM学习(24)Can的高阶认识和错误处理

    笔者来聊一下CAN协议帧的认识和错误处理。 CAN 差分信号,是经过CAN收发器转成差分信号的,CAN RX和TX是逻辑电平。CAN的基础知识,可参考笔者这边文章:ARM学习(21)STM32 外设Can的认识与驱动编写。 CAN总线拓扑结构。 CAN总线上面要接120欧姆的电阻,形成闭环。 CAN的总线电平

    2024年02月03日
    浏览(53)
  • 21、stm32使用LTDC驱动LCD

    注:本文基于stm32使用FMC驱动SDRAM(IS42S32800G-6BLI)工程继续开发 本例使用安富莱的H743XIH板子驱动LTDC点亮7寸LCD 硬件接线:RGB888 1、LTDC配置 注意此引脚应于上面的硬件接线图一致 2、配置DMA2D 3、背光引脚和触摸引脚 4、时钟配置 5、定时器配置 定时器6用来做精确延时 TIM7配置成

    2024年02月13日
    浏览(32)
  • STM32外设GPIO(学习笔记)

    在编写stm32程序时,对寄存器进行操着需要知道每个外设的基地址,标准库的stm32f10x.h文件里也有各种外设的基地址。 比如GPIO:在定义输出数据寄存器地址GPIOA_ODR_Addr时,在GPIOA_BASE(GPIO端口A的基址地址)地址基础上偏移 在stm32f10x.h文件里面有定义GPIOA_BASE,是APB2PERIPH_BASE(

    2024年04月12日
    浏览(39)
  • 【STM32】STM32学习笔记-I2C通信外设(34)

    I2C(Inter-Integrated Circuit)总线 是一种由NXP(原PHILIPS)公司开发的两线式串行总线,用于连接微控制器及其外围设备。多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。 串行的 8 位双向数据传输位速率在标准模式下可

    2024年01月17日
    浏览(61)
  • 【零基础 STM32通过CAN通信驱动Maxon电机】第三章 STM32 CAN通信回环模式测试及Maxon电机通信

    第三章 STM32 CAN通信回环模式测试及Maxon电机通信 正点原子官方给的CAN通信例程需要lcd显示屏和两块板子,本章修改代码,仅用一块STM32进行回环模式的测试。 首先下载修改后的程序,运行并烧录(接线方式和运行方式与上一章完全相同)。注意板子右侧的接线帽要接正确,

    2024年01月21日
    浏览(41)
  • 21.1 stm32使用LTDC驱动LCD--配置说明

    本文讲解如何配置LTDC驱动LCD的参数配置,以及CubeMx参数配置说明 本文使用的是淘宝买的一块带电容触摸的液晶显示屏:5寸TFT液晶显示屏高清800*480免驱40P通用RGBIPS全视角彩屏GT911 说实话,价格还是相对挺便宜的,值得入手,哈哈哈 这款屏幕采用的是RGB888格式 这里面也就是常

    2024年02月05日
    浏览(48)
  • 基于STM32 ARM+ FPGA 的软体机器人的 CAN总线运动控制器的设计

    针对在软体机器人控制时 , 多电机协同控制过程中难度大 、 通用性差 、 协同性差等缺点 , 设计了基于 ARM 和 FPGA 的软体机器人的控制器局域网络 ( controller area network , CAN ) 总线运动控制器 , 采用 ARMCortex-M4 为内核的 STM32F407 开发板和 AX7102 FPGA 开发板设计一种基于 C

    2024年02月13日
    浏览(56)
  • 【STM32学习】——STM32-I2C外设&硬件读写MPU6050&软硬件读写波形对比

    目录 前言 一、I2C外设 二、硬件I2C操作流程 1.主机发送时序 3.其他时序

    2024年02月10日
    浏览(45)
  • STM32F4 CAN驱动配置,以及SEG1,SEG2的最佳配置

    平台:MDK5 单片机型号:STM32F407VG HAL库版本:V1.8.1 该程序在APB1时钟为42M速率的情况下,将CAN配置为500KBps. 通过SystemClock_Config函数,将主频配置为168M(最大),APB1为42M(最大)。CAN的波特率=42M/(1 + TimeSeg1 + TimeSeg2) = 42M/(1+12+8)=500Kbps。 先附上参考链接 https://blog.csdn.net/qfmzhu/article/det

    2024年02月09日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包