1. STM32F103硬件SPI单线双向模式详解
作为一名嵌入式开发工程师,我经常需要在资源有限的STM32F103上实现各种外设驱动。最近在做一个需要驱动多个595数码管模块的项目时,发现GPIO资源紧张,于是研究起了硬件SPI的单线双向模式。这种模式不仅能节省宝贵的IO资源,还能简化PCB布线。下面我就详细分享一下这个技术的实现细节和注意事项。
1.1 单线双向模式的基本原理
单线双向模式是SPI通信的一种特殊工作方式。与标准SPI使用两根独立数据线(MOSI和MISO)不同,单线双向模式只使用一根数据线进行半双工通信。
在主机模式下:
- MOSI引脚负责数据的发送和接收
- MISO引脚可以释放作为普通GPIO使用
- SCK引脚仍然负责产生时钟信号
在从机模式下则相反:
- MISO引脚负责数据的发送和接收
- MOSI引脚可以释放作为普通GPIO使用
这种模式特别适合只需要单向通信或简单问答式通信的场景,比如驱动595数码管、SPI接口的LCD屏等。
重要提示:当两个STM32使用单线双向模式通信时,务必在主从机之间的数据线上串联一个1K电阻,防止双方同时发送时造成短路。
1.2 寄存器配置关键点
STM32F103的SPI外设通过两个关键寄存器位控制单线双向模式:
-
BIDIMODE位:启用/禁用单线双向模式
- 1:启用单线双向模式
- 0:标准全双工模式
-
BIDIOE位:数据传输方向控制(仅在BIDIMODE=1时有效)
- 1:发送模式
- 0:接收模式
在标准外设库中,已经定义好了对应的宏:
c复制#define SPI_Direction_1Line_Rx ((uint16_t)0x8000) // BIDIMODE=1, BIDIOE=0
#define SPI_Direction_1Line_Tx ((uint16_t)0xC000) // BIDIMODE=1, BIDIOE=1
2. 595数码管模块驱动实现
2.1 硬件连接与原理
常见的双595数码管模块使用两片74HC595芯片级联驱动4位数码管。一片负责段选(控制显示内容),另一片负责位选(控制哪一位显示)。
模块主要引脚:
- SER:串行数据输入
- SRCLK:移位寄存器时钟
- RCLK:存储寄存器时钟(锁存信号)
与STM32的连接:
- PA5(SCK) -> SRCLK
- PA7(MOSI) -> SER
- PA4(普通GPIO) -> RCLK
2.2 SPI初始化配置
c复制void SPI1_config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
// 配置SCK(PA5)和MOSI(PA7)为复用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置PA4为普通GPIO输出,用作
