深入STM32F103C8T6 CAN引脚配置:CAN总线通信精髓,打造可靠工业网络
发布时间: 2024-07-20 07:47:47 阅读量: 274 订阅数: 54
![深入STM32F103C8T6 CAN引脚配置:CAN总线通信精髓,打造可靠工业网络](https://img-blog.csdnimg.cn/b0885e8c3c2648d0999b5209afb6d084.png)
# 1. CAN总线概述
CAN(Controller Area Network)总线是一种广泛应用于工业自动化、汽车电子、医疗设备等领域的串行通信协议。其特点是高可靠性、高实时性、低成本,非常适合在恶劣的工业环境中进行数据传输。
CAN总线采用多主结构,每个节点都可以发送和接收数据。数据在总线上以帧的形式传输,每个帧包含帧头、数据段、帧尾和校验和。CAN总线采用非破坏性仲裁机制,优先级高的节点可以抢占总线,保证重要数据的及时传输。
# 2. STM32F103C8T6 CAN引脚配置
### 2.1 CAN引脚功能介绍
STM32F103C8T6微控制器提供两个CAN接口,分别为CAN1和CAN2。每个CAN接口都有两个引脚:CAN_RX和CAN_TX。
- **CAN_RX:**CAN接收引脚,用于接收CAN总线上的数据。
- **CAN_TX:**CAN发送引脚,用于发送数据到CAN总线上。
### 2.2 CAN引脚配置步骤
要配置STM32F103C8T6的CAN引脚,需要遵循以下步骤:
1. **使能CAN时钟:**在RCC寄存器中使能CAN时钟。
2. **配置GPIO引脚:**将CAN_RX和CAN_TX引脚配置为复用功能,并选择CAN功能。
3. **初始化CAN外设:**使用CAN外设寄存器初始化CAN外设。
### 2.3 CAN引脚配置实例
以下是一个配置STM32F103C8T6的CAN1引脚的示例代码:
```c
// 使能CAN1时钟
RCC->APB1ENR |= RCC_APB1ENR_CAN1EN;
// 配置GPIO引脚
GPIOA->CRL &= ~GPIO_CRL_CNF1;
GPIOA->CRL |= GPIO_CRL_CNF1_1; // 复用功能
GPIOA->CRL |= GPIO_CRL_MODE1; // 上拉输出
// 初始化CAN外设
CAN1->MCR |= CAN_MCR_INRQ; // 初始化请求
while ((CAN1->MSR & CAN_MSR_INAK) == 0); // 等待初始化完成
CAN1->MCR &= ~CAN_MCR_SLEEP; // 退出睡眠模式
CAN1->MCR |= CAN_MCR_TTCM; // 时间触发通信模式
CAN1->BTR = 0x00000003; // 设置波特率
```
**代码逻辑分析:**
- 第一行使能CAN1时钟。
- 第二行和第三行配置GPIOA的PA1引脚为CAN1_RX引脚。
- 第四行到第七行初始化CAN1外设,包括初始化请求、等待初始化完成、退出睡眠模式、设置时间触发通信模式和设置波特率。
**参数说明:**
- **RCC_APB1ENR_CAN1EN:**CAN1时钟使能位。
- **GPIO_CRL_CNF1_1:**复用功能选择位。
- **GPIO_CRL_MODE1:**上拉输出模式位。
- **CAN_MCR_INRQ:**初始化请求位。
- **CAN_MSR_INAK:**初始化未完成位。
- **CAN_MCR_SLEEP:**睡眠模式位。
- **CAN_MCR_TTCM:**时间触发通信模式位。
- **CAN_BTR:**波特率寄存器。
# 3.1 CAN帧格式
CAN帧由以下字段组成:
- **起始位 (SOF)**:单一的显性位,表示帧的开始。
- **仲裁字段 (AF)**:包含帧标识符和帧类型。帧标识符用于识别发送节点和消息优先级。
- **控制字段 (CF)**:包含帧长度和帧类型信息。
- **数据字段 (DF)**:包含要传输的数据,长度为 0-8 字节。
- **CRC字段 (CRC)**:包含循环冗余校验 (CRC) 值,用于检测数据传输中的错误。
- **确认字段 (ACK)**:由接收节点发送的显性位,表示帧已成功接收。
- **结束位 (EOF)**:由发送节点发送的 7 个连续隐性位,表示帧的结束。
**CAN帧格式示意图:**
```mermaid
graph LR
subgraph CAN帧
SOF --> AF
AF --> CF
CF --> DF
DF --> CRC
CRC --> ACK
ACK --> EOF
end
```
### 3.2 CAN总线通信流程
CAN总线通信遵循以下流程:
1. **发送节点**将数据帧发送到总线上。
2. **所有节点**同时接收帧并检查帧标识符。
3. **具有最高优先级的节点**(帧标识符最低)获得总线控制权。
4. **获胜节点**继续传输帧,而其他节点进入接收模式。
5. **所有节点**检查帧的 CRC 字段,以验证数据完整性。
6. **接收节点**在接收帧后发送 ACK 位,表示帧已成功接收。
7. **发送节点**在收到 ACK 后释放总线控制权。
### 3.3 CAN总线仲裁机制
CAN总线使用非破坏性仲裁机制来解决总线冲突。当多个节点同时尝试发送帧时,具有最高优先级的节点将获得总线控制权。仲裁机制如下:
1. **所有节点**同时发送仲裁字段。
2. **每个位**,节点比较自己的位和总线上的位。
3. **如果节点的位为显性位,而总线上的位为隐性位,则该节点失去仲裁
0
0