收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
∘
\circ
∘ 规定总线两端各有一个120Ω电阻。
∘
\circ
∘ CAN控制器是各个连接到总线上的设备的控制器,一般需要配备一个CAN收发器(比如咱们战队码盘上的CAN收发器用的是TJA1050),用于将CAN控制器的二进制码流转换为CAN总线的差分电平,在两条有差分电压的总线电缆上传输数据
开环:最大传输距离1Km,最高速125Kbps
∘
\circ
∘ 规定每根线串联一个2.2kΩ的电阻
CAN协议差分信号
∘
\circ
∘ 显性电平对应“0”,隐性电平对应“1”。隐性电平(1)两条线电压都是2.5V,即压差为0;显性电平(0)CAN_High和CAN_Low分别为3.5V和1.5V,压差为2V。
∘
\circ
∘ 总线上,只要有一个节点输出显性,则总线上为显性电平;只有所有节点都是隐性电平,总线才为隐性电平
∘
\circ
∘ 由于CAN是半双工的,收发分开进行,且是总线通讯,所以一个时刻只能有一个节点发送,其他节点在此时只能接收
8.1.2 协议层
位时序
意义:为了实现正确的总线电平采样,确保通讯正常。最小单位是Tq(Time Quantum),一个完整位由8~25个Tq组成
组成:SS段、PTS 段、PBS1段、PBS2段
| 段名 | 意义 | 作用 |
|---|---|---|
| SS(1Tq) | 同步段 | 使总线各节点同步 |
| PTS(1~8Tq) | 传播时间段 | 补偿物理延时,是传播时间、收发器延时之和的两倍 |
| PBS1(1~8Tq) | 相位缓冲段1 | 补偿变压阶段误差 |
| PBS2(2~8Tq) | 相位缓冲段2 | 补偿边沿阶段误差 |
| SJW(1~4Tq) | 再同步补偿宽度 | 补偿时钟频率偏差、传输延迟等 |
例如
通讯波特率的计算:CAN使用的时钟线是APB1 peripheral clocks(假设是APC),即一般是SYSCLK的四分频。而CAN通讯还要对此进行预分频(假设是Prescaler),则一个Tq为 Prescaler / APC(单位s)。而一个数据位占(SS+PTS+PBS1+PBS2+SJW)个Tq。则一秒可以传输的位数就是
1
T
q
∗
一
个
位
得
T
q
数
\frac{1}{Tq*一个位得Tq数}
Tq∗一个位得Tq数1
例如:在时钟树查得APB1 peripheral clocks是45MHz,预分频为5,则一个Tq为
4
45
M
H
z
=
111.1111
…
(
n
s
)
\frac{4}{45MHz}=111.1111\dots(ns)
45MHz4=111.1111…(ns) ,上图中有19个Tq,则此时波特率为
1
19
∗
111.11
∗
1
0
−
9
≈
473689
(
b
p
s
)
\frac{1}{19*111.11*10^{-9}}\approx473689(bps)
19∗111.11∗10−91≈473689(bps)
报文
帧类型:
| 类型 | 用途 |
|---|---|
| 数据帧 | 发送单元向接收单元信息内容 |
| 遥控帧 | 接收单元发送单元请求数据 |
| 错误帧 | 通知其他单元检测到错误 |
| 过载帧 | 通知还没有准备好接收 |
| 间隔帧 | 将数据帧或遥控帧前面的帧隔开 |
数据帧结构:
以一个显性位(0)开始,以一个7个连续隐形位(1)结束。中间依次是仲裁段、控制段、数据段、CRC段、ACK段,一共7段
帧起始(SOF):一个显性电平。用于通知各个节点将有数据传输
仲裁段:用于表示优先级。标准格式和扩展格式得区别就是在这里,标准格式ID为11位,扩展格式为11+18=29位。RTR(远程传输请求位),用显隐性电平区别数据帧和遥控帧。
IDR(标识符扩展位),显性是标准形式,隐性是扩展形式。
SSR,即标准格式的RTR,是隐性位。
ID决定数据帧的优先级,当两个节点同时竞争总线,则先出现隐性电平的节点失去占有权,进入接收状态
控制段:r1和r0是保留位,默认显性。DLC,数据数组长度,0~8
数据段:08个字节(064位)
CRC段:共16位。15位的CRC校验码,1位的界定符,隐性
ACK段:共2位。一位是ACK槽位,发送端发送隐性,接收端发送显性表示应答;一位是与帧结束的界定符
帧结束(ROF):7个隐形位
8.1.3 过滤器
目的:过滤掉不感兴趣的消息,即与本节点无关的消息
两种模式:列表模式和掩码模式
过滤器个数:使用一个CAN时可选013号过滤器;使用两个CAN是,可选用037号过滤器
模式
列表模式:将关注的报文ID做成一张表,当收到的报文ID符合时则接收,否则不接收
优点,精确,能完全过滤掉不需要的报文
缺点,列表数量有限,当感兴趣的消息数量过多时则无法全部包含
掩码模式通过与操作,将部分ID符合的报文接收
优点,感兴趣的范围可以更大
缺点,并不一定能完全过滤掉不关注的报文,精确程度取决于屏蔽码
位宽
过滤器有32位和16位两种可选。其中16位只能过滤标准帧,不能过滤扩展帧。
8.2 STM32的CAN
STM32有两组CAN控制器,CAN1是主设备,负责管理bxCAN(基本扩展CAN,就是CAN)和512字节的SRAM。CAN2是从控制器,不能直接访问SRAM。使用CAN2必须使能CAN1外设时钟
STM32中,当CAN接收过滤器使用32位时,掩码和验证码分别拆分成两个寄存器,每个16位,分别代表高16位和低16位
8.3 CubeMX配置步骤
- 左侧目录>Connectivity>点CAN1/CAN2~> Mode勾选Master Mode / Slave Mode
- 配置参数,含义如下:
| 参数 | 意思 |
|---|---|
| Prescaler | 预分频,即位时序提到的APB1 peripheral clocks继续分一次频 |
| Time Quantum | 最小时间单位Tq,自动计算出来的,不需要填写 |
| Time Quanta in Bit Segment 1 | PBS1段长度 |
| Time Quanta in Bit Segment 2 | PBS2段长度 |
| ReSynchronization Jump Width | 重同步跳跃宽度,即位时序提到的SJW |
| Time Triggered Communication Mode | 是否使能时间触发 |
| Automatic Bus-Off Management | 是否使能自动离线管理 |
| Automatic Wake-Up Mode | 是否使能自动唤醒 |
| Qutomatic Retransmission | 是否使能自动重传 |
| Receive Fifo Locked Mode | 是否使能锁定FIFO |
| Transmit Fifo Priority | 配置报文优先级的判断方法 |
| Oprating Mode | 操作模式 |
这些参数也可以在can.c中自行修改 3. 中断(NVIC)设置,根据需要设置,一般勾上CAN1 RX0 Interrupt
8.4 编程
HAL库关于CAN的所有函数定义和结构体定义分别在 Drivers/STM32F4xx_HAL_Driver 文件夹下 stm32f4xx_hal_can.c 和 stm32f4xx_hal_spi.h 中
下面列举一些基本的和常用的
8.4.1 CAN基本结构体
发送报文定义结构体(CAN_TxHeaderTypeDef)
typedef struct
{
uint32_t StdId; /\*!标准ID。参数值只能是 0 到 0x7FF(二进制的11位1) \*/
uint32_t ExtId; /\*!扩展ID。参数值只能是 0 到 0x1FFFFFFF(二进制的29位1)\*/
uint32_t IDE; /\*!IDE。HAL库编程时,标准帧填写CAN\_ID\_STD,扩展帧填写CAN\_ID\_EXT \*/
uint32_t RTR; /\*!RTR。HAL库编程时,数据帧填写CAN\_RTR\_DATA,遥控帧填写CAN\_RTR\_REMOTE \*/
uint32_t DLC; /\*!DLC。数据长度,参数值只能是 0 到 8 \*/
FunctionalState TransmitGlobalTime; /\*!< Specifies whether the timestamp counter value captured on start
of frame transmission, is sent in DATA6 and DATA7 replacing pData[6] and pData[7].
@note: Time Triggered Communication Mode must be enabled.
@note: DLC must be programmed as 8 bytes, in order these 2 bytes are sent.
This parameter can be set to ENABLE or DISABLE. \*/
} CAN_TxHeaderTypeDef;
接收报文定义结构体(CAN_RxHeaderTypeDef)
typedef struct
{
uint32_t StdId;
uint32_t ExtId;
uint32_t IDE;
uint32_t RTR;
uint32_t DLC;
uint32_t Timestamp; /\*!< Specifies the timestamp counter value captured on start of frame reception.
@note: Time Triggered Communication Mode must be enabled.
This parameter must be a number between Min\_Data = 0 and Max\_Data = 0xFFFF. \*/
uint32_t FilterMatchIndex; /\*!< Specifies the index of matching acceptance filter element.
This parameter must be a number between Min\_Data = 0 and Max\_Data = 0xFF. \*/
} CAN_RxHeaderTypeDef;
接收过滤器类型定义结构体(CAN_FilterTypeDef)
typedef struct
{
uint32_t FilterIdHigh; /\*!过滤器验证码ID高16位,只能填0到0xFFFF 中间的数值 \*/
uint32_t FilterIdLow; /\*!过滤器ID低16位,只能填0到0xFFFF 中间的数值\*/
uint32_t FilterMaskIdHigh; /\*!过滤器掩码ID高16位,只能填0到0xFFFF中间的数值 \*/
uint32_t FilterMaskIdLow; /\*!过滤器掩码ID低16位,只能填0到0xFFFF中间的数值 \*/
uint32_t FilterFIF(x)Assignment; /\*!将通过的报文放入哪个FIFOx中,填写FIFO(x) \*/
uint32_t FilterBank; /\*!使用过滤器编号。使用一个CAN,则可选 0~13;使用两个CAN可选 0~27 \*/
uint32_t FilterMode; /\*!过滤器模式选择。掩码模式填写 CAN\_FILTERMODE\_IDMASK,列表模
式填写 CAN\_FILTERMODE\_IDLIST \*/
uint32_t FilterScale; /\*!过滤器位宽,32位是CAN\_FILTERSCALE\_32BIT,
16位是CAN\_FILTERSCALE\_16BIT \*/
uint32_t FilterActivation; /\*!是否使能过滤器,DISABLE 或 ENABLE \*/
uint32_t SlaveStartFilterBank; /\*!< Select the start filter bank for the slave CAN instance.
For single CAN instances, this parameter is meaningless.
For dual CAN instances, all filter banks with lower index are assigned to master
CAN instance, whereas all filter banks with greater index are assigned to slave
CAN instance.
This parameter must be a number between Min\_Data = 0 and Max\_Data = 27. \*/
} CAN_FilterTypeDef;
注意:FilterIdHigh、FilterIdLow、FilterMaskIdLow、FilterMaskIdLow这四个成员不是它的名字那么简单,
他们的功能取决于使用的过滤器模式。若为列表模式,则不管是FilterId还是FilterMaskId都表示的是列
表成员。
上述四个成员都是16位的,一定注意下面说的移位操作
在32位过滤器中,一组High和Low检验同一个CAN ID;16位过滤器,则可分别独立检验一个ID
过滤器寄存器如下:(使用HAL库可以不必深挖具体的寄存器,只需注意Mapping每一位的内容)
32位列表模式
16位列表模式
32位掩码模式
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新