关注分享主机优惠活动
国内外VPS云服务器

STM32--CAN通讯实验(stm32f103 can例程)

概述:And是一对使用差分信号的差分信号线。 End of Frame 表示数据帧结束的段。 控制段 控制段由表示数据段中字节数的单位位组成。 有效消息 如果消息根据协议正确接收并成功通过标识符过滤器,则消息被视为有效。

目录

CAN 协议概述

物理层

闭环总线网络

开环总线网络

通信节点

差分信号

协议层概述

CAN 波特率

位时序

框架类型、功能和格式

数据框

STM32CAN 外设

您可以发送电子邮件

可以接收 FIFO

有效消息

接收处理

溢出

标识符过滤器

CAN1和CAN2整体逻辑

HAL库函数

CAN 协议引入了物理层

CAN 通信是仅使用 CAN_High 和 CAN_Low 两条信号线的异步通信,这两个信号线不通过时钟信号同步 > CAN 的物理层有两种拓扑结构: 闭环总线。闭环总线网络和开环总线网络。

闭环总线网络的特点是速度高、距离短。

总线长度可达40m,通讯速率可达1Mbps,总线两端需接120Ω电阻。

闭环总线网络拓扑 开环总线网络

闭环网络的特点是低速、长距离。

最大传输距离1km,最大通信速度125kbps。 两条总线是独立的,不形成闭环。 每条总线需要串联一个 2.2 kΩ 电阻。

CAN闭环总线网络拓扑通信节点

CAN总线上可以挂载多个通信节点,通过总线在节点之间传输信号,实现节点间通信。

CAN通信协议不编码节点的地址,而是编码数据的内容,因此网络总线理论上其数量没有限制,只要负载足够即可,并且可以通过中继器增加负载。

CAN通信节点由CAN控制器和CAN收发器组成。 控制器和收发器通过 CAN_Tx 和 CAN_Rx 信号线连接。 收发器使用 CAN_High 和 CAN_Low 信号线连接到 CAN 总线。 。 CAN_High和CAN_Low是一对使用差分信号的差分信号线。

差分信号

与使用单个信号线电压表示逻辑的传统方法不同。 当使用差分信号传输时,需要两根信号线。 这两条信号线具有相等的幅度和相反的相位。 两条信号线之间的电压差代表逻辑0和逻辑1。

差分信号传输具有以下优点:

p> 抗干扰能力强。 当有外部噪声干扰时,噪声几乎总是同时混入两条信号线中。 因此,外部共模噪声可以被完全抵消。 可以有效抑制外部电磁干扰。 同样,由于两个信号的极性相反,因此向外辐射的电磁场可以相互抵消。 耦合越紧密,释放到外界的电磁能量就越少。 与依赖高低阈值电压做出决策的普通单端信号不同,差分信号的开关变化位于两个信号的交叉点,使得时序定位变得准确且不受工艺和温度影响。收到。 , 可以减少它具有较低的时序误差,适用于使用低幅度信号的电路。 CAN 信号 高速 CAN 低速 CAN 电平 显性 隐性 显性 隐性 CAN_H

3.50

2.504.001.75CAN_L1.502.501.003.25 电位差 2.0003.00 - 1.50

这是因为CAN总线仲裁机制采用“线与”的方式对总线上的信号进行仲裁。 因此,如果有两个CAN通信节点,并且一个输出隐性电平,另一个输出显性电平,则“线与”总线仲裁机制将导致显性电平状态。 因此,低电平“0”被称为显性电平。

物理层特性概述 协议层概述 CAN 波特率

由于 CAN 是异步通信,没有时钟信号线,因此连接到同一总线网络的各节点之间采用串口异步通信方式。 以约定的波特率进行通信

只要总线上的每个通信节点都同意 1 Tq 中的时间长度以及每个数据位占用多少个 Tq 即可确定 CAN 通信的波特率。

位时序

为了实现位同步,STM32数据手册中标称位时间分为三段:

同步段(SYNC_SEG):位变化必须发生在这个周期内。 。 它只有一个固定长度的时间片 (1 x tCAN)。 位段 1 (BS1):定义采样点的位置。 这包括 CAN 标准 PROP_SEG 和 PHASE_SEG1。 其持续时间可以在1到16个时间片之间调整,但也可以自动延长,以补偿不同网络节点频率差异引起的正相位漂移。 位段 2 (BS2):定义传输点的位置。 CAN 标准中 PHASE_SEG2 的缩写。 其持续时间可以在 1 到 8 个时间片之间调整,但也可以自动缩短以补偿负相位漂移。

说到同步,还有硬件同步、重新同步和其他操作。 有关位定时的更多信息,请参阅 ISO 11898 标准。

帧类型、功能和格式

为了更有效地控制通信,CAN 总共指定了五种类型的帧。

本文主要介绍数据框。

数据框

数据框由七个段组成。

帧开始:指示数据帧开始的段。 仲裁段:表示帧优先级的段。 控制段:表示数据字节数和保留位的段。 数据段:数据内容。 可以发送0到8字节的数据。 CRC 段:检查帧传输错误的段。 ACK段:表示确认接收成功的段。 帧结束:标记数据帧结束的段。

帧开始

指示帧开始的段。 个位的高位。

仲裁段

代表数据优先级的段。

这里,标准格式和扩展格式的结构不同。

控制段

控制段由6位组成,表示数据的字节数马苏。 数据段。 标准格式和扩展格式的配置不同。

数据段

一个数据段可以包含0到8个字节的数据。 输出从 MSB(最高有效位)开始。

CRC 段

CRC 段是检查帧传输错误的帧。 它由一个 15 位 CRC 序列和一个 1 位 CRC 定界符组成。

ACK 段

ACK 段用于确认成功接收。 它由两个位组成:ACK 时隙和 ACK 定界符。

帧结束

帧结束是标记帧结束的段。 由 7 个隐性位组成。

STM32CAN 外设

从该图中我们可以看到 CAN 1 和 CAN 2 是主机。 我明白。 从机关系,CAN 1为主,CAN 2为从。 CAN 1 和 CAN 2 各有自己的 3 个发送邮箱、2 个 FIFO 缓冲区和 6 个接收邮箱。 然而,28 个过滤器是共享的。 您可以指定哪些过滤器用于哪些 CAN,还可以在程序执行期间控制过滤器。

● CAN1:bxCAN 主控,用于管理bxCAN 与512 字节SRAM 存储器之间的通信。

● CAN2:bxCAN 无法直接访问 SRAM 存储器。

● 两个bxCAN 单元共享512 字节的SRAM 存储器。

CAN 外发邮箱

CAN 1 和 CAN 2 有自己的 3 个外发邮箱,最多可以缓冲 3 个要发送的消息。 艺术。

要发送消息,程序必须选择一个空的发送邮箱,并在请求发送之前使邮箱脱离空状态并进入挂起状态。 此时,该软件将无法再访问已挂起的邮箱。 处于保留状态时,首先发送高优先级邮箱。 发送后,邮箱将恢复为空状态。

CAN 接收 FIFO

提供三个构成 FIFO 的邮箱来接收 CAN 报文。 为了节省 CPU 负载,FIFO 完全由硬件管理。原因。 应用程序通过 FIFO 输出邮箱访问存储在 FIFO 中的消息。

有效报文

如果根据 CAN 协议正确接收报文并成功通过标识符过滤器,则该报文为 It会看起来像这样。 视为有效。

接收处理

当接收到消息时,FIFO 消息计数器递增。 STM32内部读取FIFO数据后,消息计数器递减。 您可以通过状态寄存器了解消息计数器。 值

溢出

标识符过滤

在 CAN 协议中,报文的标识符与节点地址无关,而是与“内容相关”将会出现一条消息。 因此,发送者将消息广播给所有接收者。 当接收到消息时,接收节点根据标识符的值确定软件是否需要该消息。 STM32 CAN 外设在接收消息之前使用接受过滤器来检查消息,并且仅将所需的消息接收到 FIFO 中。

CAN1和CAN2的整体逻辑

CAN2外设的结构与CAN1外设相同。 它们共享过滤器,并且存储访问控制器由CAN1控制,因此如果要使用CAN2时钟,必须启用CAN1。

HAL库函数 HAL_StatusTypeDef HAL_CAN_ActivateNotification(CAN_HandleTypeDef *hcan, uint32_t ActiveITs); 参数 hcan:指向CAN配置结构体。 ActiveITs:指示哪些中断处于活动状态并打开更改中断的消息提示。 返回值 HAL_StatusTypeDef:如果激活成功,则返回 HAL_OK。 如果不成功,则返回 HAL_ERRORHAL_StatusTypeDef HAL_CAN_Start(CAN_HandleTypeDef *hcan)。 参数hcan:指向CAN配置结构体的返回值。HAL_StatusTypeDef:如果打开成功则返回HAL_OK。 如果不成功,则返回 HAL_ERRORHAL_StatusTypeDef HAL_CAN_ConfigFilter(CAN_HandleTypeDef *hcan, CAN_FilterTypeDef *sFilterConfig)。 参数 hcan:指向 CAN 配置结构。 sFilterConfig:Filter 指向过滤器配置结构。 返回值 HAL_StatusTypeDef:打开成功则返回HAL_OK。 如果不成功,则返回 HAL_ERRORHAL_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_ERRORuint32_t HAL_CAN_IsTxMessagePending(CAN_HandleTypeDef *hcan, uint32_t TxMailboxes)。 参数 hcan:指向 CAN 配置结构体 TxMailboxes:指向发送数据的发送邮箱 返回值 uint32_t:如果有发送数据等待发送则返回 1,否则返回 1。 否则,返回 0void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)。 编写代码时,使用 main. 在C中创建HAL_CAN_RxFifo0MsgPendingCallback 函数输入需要执行的代码,以便在 FIFO 0 中没有等待接收的数据时启用中断。 参数 hcan:指向 CAN 配置结构 RxFifo:指向 FIFOpHeader;失败时返回 HAL_ERROR

未经允许不得转载:主机频道 » STM32--CAN通讯实验(stm32f103 can例程)

评论 抢沙发

评论前必须登录!