摘要:而及是一对差分信号线,使用差分信号。帧结束表示数据帧结束的段。控制段控制段由个位构成,表示数据段的字节数。有效消息当消息依据协议正确接收并且成功通过标识符筛选后,该消息将视为有效。
目录
CAN 通讯并不是以时钟信号来进行同步的,它是一种异步通讯,只具有 CAN_High 和 CAN_Low 两条信号线,共同构成一组差分信号线,以差分信号的形式进行通讯。
CAN的物理层有两种拓扑结构,闭环总线网络和开环总线网络,我们将依次介绍他们。
闭环网络的特点是:高速、近距离。
它的总线最大长度为 40m,通信速度最高为1Mbps,总线的两端各要求有一个“120 欧”的电阻。
闭环网络的特点是:低速、远距离。
它的最大传输距离为1km,最高通讯速率为 125kbps,两根总线是独立的、不形成闭环,要求每根总线上各串联有一个“2.2 千欧”的电阻。
CAN 总线上可以挂载多个通讯节点,节点之间的信号 经过总线传输,实现节点间通讯。
由于 CAN 通讯协议不对节点进行地址编码,而是对数据内容进行编码的,所以网络中的节点个数理论上不受限制,只要总线的负载足够即可,可以通过中继器增强负载。
CAN 通讯节点由一个 CAN 控制器及 CAN 收发器组成,控制器与收发器之间通过 CAN_Tx 及 CAN_Rx 信号线相连,收发器与 CAN 总线之间使用 CAN_High 及 CAN_Low 信号线相连。而 CAN_High 及 CAN_Low 是一对差分信号线,使用差分信号。
与传统使用单根信号线电压表示逻辑的方式有区别,使用差分信号传输时,需要两根信号线,这两个信号线的振幅相等,相位相反,通过两根信号线 的电压差值来表示逻辑 0 和逻辑 1。
差分信号传输具有如下优点:
CAN信号 | 高速CAN | 低速CAN | ||
---|---|---|---|---|
电平 | 显性 | 隐性 | 显性 | 隐性 |
CAN_H | 3.50 | 2.50 | 4.00 | 1.75 |
CAN_L | 1.50 | 2.50 | 1.00 | 3.25 |
电位差 | 2.00 | 0 | 3.00 | -1.50 |
由于CAN总线的仲裁机制采取“线与”的方式对总线上的信号进行仲裁。因此,假如有两个 CAN 通讯节点,在同一时间,一个输出隐性电平,另一个输出显性电平,“线与”的总线仲裁机制将使它处于显性电平状态。因此低电平“0”被成为显性电平。
由于 CAN 属于异步通讯,没有时钟信号线,连接在同一个总线网络中的各个节点会像串口异步通讯那样,节点间使用约定好的波特率进行通讯
总线上的各个通讯节点只要约定好 1 个 Tq 的时间长度以及每一个数据位占据多少个Tq,就可以确定 CAN 通讯的波特率。
为了实现位同步,在STM32数据手册中通过将标称位时间划分为以下三段
关于同步,还有硬件同步、再同步等操作。更多关于位时序的内容可以参看 ISO 11898 标准。
为了更有效地控制通讯,CAN 一共规定了 5 种类型的帧:
我们在这里主要介绍一下数据帧
数据帧由 7 个段构成:
帧起始
表示帧开始的段。1 个位的显性位。
仲裁段
表示数据的优先级的段。
标准格式和扩展格式在此的构成有所不同。
控制段
控制段由 6 个位构成,表示数据段的字节数。标准格式和扩展格式的构成有所不同。
数据段
数据段可包含 0~8 个字节的数据。从 MSB(最高位)开始输出。
CRC段
CRC 段是检查帧传输错误的帧。由 15 个位的 CRC 顺序和 1 个位的 CRC 界定符(用于分隔的位)构成。
ACK段
ACK 段用来确认是否正常接收。由 ACK 槽(ACK Slot)和 ACK 界定符 2 个位构成。
帧结束
帧结束是表示该该帧的结束的段。由 7 个位的隐性位构成。
从图上我们可以看到,CAN 1与CAN 2为主从关系,CAN 1为Master ( 主 ) ,CAN 2为Slave ( 从 ) 。CAN 1和CAN 2有各自的3个发送邮箱,2个FIFO Buffer缓冲,6个接收邮箱。但是,28个Filter 过滤器却是共用的,我们可以规定,哪些Filter给那个CAN用,甚至可以在程序运行的时候调控。
● CAN1:主 bxCAN,用于管理 bxCAN 与 512 字节 SRAM 存储器之间的通信。
● CAN2:从 bxCAN,无法直接访问 SRAM 存储器。
● 两个 bxCAN 单元共享 512 字节 SRAM 存储器
CAN 1和CAN 2有各自的3个发送邮箱,最多可以缓存 3 个待发送的报文。
为了发送消息,程序必须在请求发送之前选择一个空的发送邮箱,使邮箱退出空的状态,进入挂起状态。此时,对于挂起的邮箱,软件无法再对其访问。进入挂起状态后,优先级高的邮箱将优先发送。发送后的邮箱将恢复到空的状态。
为了接收 CAN 消息,提供了构成 FIFO 的三个邮箱。为了节约 CPU 负载,FIFO 完全由硬件进行管理。应用程序通过 FIFO 输出邮箱访问 FIFO 中所存储的消息。
当消息依据 CAN 协议正确接收并且成功通过标识符筛选后,该消息将视为有效。
当接收到报文时,FIFO 的报文计数器会自增,而 STM32 内部读取 FIFO 数据之后,报文计数器会自减,我们通过状态寄存器可获知报文计数器的值
在 CAN 协议中,消息的标识符与节点地址无关,但与消息内容有关。因此,发送器将消息广播给所有接收器。在接收到消息时,接收器节点会根据标识符的值来确定软件是否需要该消息。STM32 的 CAN 外设接收报文前会先使用验收筛选器检查,只接收需要的报文到 FIFO 中。
CAN2 外设的结构与 CAN1 外设是一样的,他们共用筛选器且由于存储访问控制器由 CAN1 控制,所以要使用 CAN2 的时候必须要使能 CAN1 的时钟。
HAL_StatusTypeDef HAL_CAN_ActivateNotification(CAN_HandleTypeDef *hcan, uint32_t ActiveITs);
hcan
:指向CAN配置结构体ActiveITs
:表明哪个中断会被启动,开启改中断的消息提示HAL_StatusTypeDef
:如果开启成功,返回HAL_OK
;如果失败,返回HAL_ERROR
HAL_StatusTypeDef HAL_CAN_Start(CAN_HandleTypeDef *hcan);
hcan
:指向CAN配置结构体HAL_StatusTypeDef
:如果开启成功,返回HAL_OK
;如果失败,返回HAL_ERROR
HAL_StatusTypeDef HAL_CAN_ConfigFilter(CAN_HandleTypeDef *hcan, CAN_FilterTypeDef *sFilterConfig);
hcan
:指向CAN配置结构体sFilterConfig
:指向Filter过滤器配置结构体HAL_StatusTypeDef
:如果开启成功,返回HAL_OK
;如果失败,返回HAL_ERROR
HAL_StatusTypeDef HAL_CAN_AddTxMessage(CAN_HandleTypeDef *hcan, CAN_TxHeaderTypeDef *pHeader, uint8_t aData[], uint32_t *pTxMailbox);
hcan
:指向CAN配置结构体pHeader
:指向发送数据的配置结构体aData[]
:指向需要发送的数据pTxMailbox
:该函数会返回用于储存发送数据的发送邮箱编号到该变量HAL_StatusTypeDef
:如果添加成功,返回HAL_OK
;如果失败,返回HAL_ERROR
uint32_t HAL_CAN_IsTxMessagePending(CAN_HandleTypeDef *hcan, uint32_t TxMailboxes);
hcan
:指向CAN配置结构体TxMailboxes
:指向发送数据的发送邮箱uint32_t
:如果有发送数据正在等待发送,返回1
;如果没有,返回0
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan);
main.c
中创建HAL_CAN_RxFifo0MsgPendingCallback
函数HAL_StatusTypeDef HAL_CAN_GetRxMessage(CAN_HandleTypeDef *hcan, uint32_t RxFifo, CAN_RxHeaderTypeDef *pHeader, uint8_t aData[]);
hcan
:指向CAN配置结构体RxFifo
:指向负责接收的FIFOpHeader
:指向接收数据的配置结构体aData[]
:指向需要接收的数据HAL_StatusTypeDef
:如果接收成功,返回HAL_OK
;如果失败,返回HAL_ERROR
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/119237.html
摘要:为了可靠工作,在总线状态切换时需要做适当延时,再进行数据收发。 一、实现效果 基于ucosii实时操作系统的RS485通信,采用USART + DMA进行收发, 二、开发环境 开发工具:KEIL V5开发板: STM32f107RC采用方式:USART + DMA使用系统:...
摘要:使用库读写环境光照度传感器本文将教大家如何快速使用库读取光照度数据。五实验样机测试展示通过之前配置好的面板,通过涂鸦智能进行配网实时采集光照度传感器的数据。 使用STM32 HAL库读写环境光照度传感器(BH1750) 本文将教大家如何快速使用STM32HAL库读取光照度数据。 实现功能:通...
摘要:设置下面的项为和项为,用于设置支持的软硬件仿真。如有错误,请斧正。参考文献基于创建汇编语言工程并分析 文章目录 1新建工程2配置环境3测试代码4分析生成的H...
本文代码均来正点原子标准例程 声明:本文不是教学文章,可能也不适合初学者阅读 不知为什么,最近总蹦出有很多想法(可能是工作太闲了)一会想学这,一会想学那,这不,突然想复习一下STM32了。 我好久以前就学过正点原子的课程,还买过一些开发板,但现在手上只有一个核心板了,就暂且凑合着用吧。 我是个喜欢制定计划的人,既然有了想法,那就得制定一个学习计划,估摸了一下,明天要上班,现在已经中午了,所以我只...
阅读 3813·2021-09-06 15:00
阅读 2153·2019-08-30 15:53
阅读 3259·2019-08-23 16:44
阅读 928·2019-08-23 15:19
阅读 1368·2019-08-23 12:27
阅读 4105·2019-08-23 11:30
阅读 565·2019-08-23 10:33
阅读 321·2019-08-22 16:05