本项目需求:
使用 UART 接口完成与上位机的串口通信(支持 RS-232 与 RS-485);
使用 CAN 总线 与其他控制节点通信;
使用 SPI 接口驱动 TF 卡,用于数据日志存储;
所有通信需独立运行,支持中断与缓冲管理,具备一定实时性。
二、硬件连接方案
1. UART 接口(RS-232 / RS-485)
RS-232:连接 MAX3232 芯片与 PC 串口;
RS-485:连接 SP485 或 MAX485 芯片,使用 GPIO 控制收发使能;
UART 引脚:如 USART1(PA9/PA10)或 USART2(PA2/PA3)。
2. CAN 接口
使用 TI 的 SN65HVD230DR CAN 收发器;
MCU CAN 引脚如 CAN_TX(PB9)、CAN_RX(PB8);
终端节点需加 120Ω 匹配电阻。
3. SPI 接口(TF 卡)
SPI1:PA5(SCK)、PA6(MISO)、PA7(MOSI)、PA4(CS);
TF 卡模块与 SPI 信号直接连接,CS 脚可用任意 GPIO;
加上必要的上拉电阻与信号保护措施。
三、软件开发要点
1. UART 初始化与 RS-485 控制
c
复制
编辑
void USART1_Init(void) {
// RCC 相关初始化
// GPIO 配置为复用推挽模式
// USART 配置:波特率、起止位、无校验
USART1->BRR = ...;
USART1->CR1 |= USART_CR1_TE | USART_CR1_RE | USART_CR1_UE;
}
void RS485_Send(uint8_t* data, uint16_t len) {
RS485_DIR_GPIO->BSRR = RS485_DIR_PIN; // 发送模式
for (int i = 0; i < len; i++) {
while (!(USART1->SR & USART_SR_TXE));
USART1->DR = data[i];
}
while (!(USART1->SR & USART_SR_TC)); // 等待发送完成
RS485_DIR_GPIO->BRR = RS485_DIR_PIN; // 回到接收模式
}
2. CAN 总线配置与发送
c
复制
编辑
void CAN_Config(void) {
// 时钟、GPIO 初始化
CAN1->MCR |= CAN_MCR_INRQ; // 初始化模式
// 设置波特率、滤波器
CAN1->BTR = ...;
CAN1->MCR &= ~CAN_MCR_INRQ; // 正常模式
}
void CAN_Send(uint32_t id, uint8_t* data, uint8_t len) {
CAN1->sTxMailBox[0].TIR = id << 21;
CAN1->sTxMailBox[0].TDLR = ...; // 数据填入
CAN1->sTxMailBox[0].TDTR = len;
CAN1->sTxMailBox[0].TIR |= CAN_TI0R_TXRQ; // 请求发送
}
3. SPI 接口操作(TF 卡读写)
配合 FATFS 文件系统或裸机 SD 初始化方式进行:
c
复制
编辑
uint8_t SPI1_Transfer(uint8_t data) {
SPI1->DR = data;
while (!(SPI1->SR & SPI_SR_RXNE));
return SPI1->DR;
}
SPI 通讯需注意时序、初始化顺序与 SPI 模式(CPOL/CPHA)配置。
四、整合与系统运行机制
各通信接口在独立中断服务程序中完成数据收发;
使用 循环缓冲区(ring buffer) 管理 UART 接收缓存;
主循环定期检查 SPI 写缓冲并将通信日志记录至 TF 卡;
可通过 UART 命令触发 CAN 报文发送,验证多协议协同能力。
|