
GD32F103模拟3线SPI通信问题
2025-03-05 10:30:02
晨欣小编
SPI(Serial Peripheral Interface,串行外设接口)是一种常见的全双工串行通信协议,广泛应用于 MCU 与外设(如 FLASH、ADC、LCD 等)之间的数据交互。然而,部分外设仅支持 3 线 SPI(即 SCK、MOSI 和 MISO 复用为单线),这对常规 SPI 通信模式带来了挑战。本文将探讨 GD32F103 模拟 3 线 SPI 通信的问题,并提供解决方案。
2. GD32F103 SPI 基础GD32F103 是兆易创新(GigaDevice)推出的一款 Cortex-M3 核心的高性能 MCU,支持硬件 SPI 控制器,具有以下特性:
支持标准 SPI 通信,提供 SPI0、SPI1 两个外设模块。
支持主从模式,最高通信速率可达 18 MHz。
支持 4 线 SPI(MOSI、MISO、SCK、NSS)及 3 线模式(仅限于硬件半双工)。
2.1 SPI 通信模式SPI 主要有以下几种通信模式:
模式线数说明4 线 SPISCK、MISO、MOSI、NSS最常见,全双工3 线 SPISCK、MOSI/MISO 复用、NSS半双工2 线 SPISCK、MOSI/MISO 复用无片选,半双工GD32F103 硬件支持 3 线模式,但对于某些特殊外设(如 OLED 显示屏、EEPROM),可能需要手动模拟 3 线 SPI 进行通信。
3. GD32F103 模拟 3 线 SPI 的实现由于 GD32F103 的 SPI 控制器在 3 线模式下不能灵活支持所有外设,用户可通过 GPIO 模拟(Bit-Banging) 方式实现 3 线 SPI。
3.1 硬件连接假设连接如下:
SCK → PA5
MOSI/MISO(复用) → PA7
NSS(片选) → PA4
3.2 软件实现使用 GPIO 直接控制时序,可按照以下方式实现 模拟 SPI。
3.2.1 GPIO 配置void SPI_GPIO_Init(void) {
rcu_periph_clock_enable(RCU_GPIOA);
gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_4);
gpio_init(GPIOA, GPIO_MODE_OUT_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_7); // 开漏模式,读写兼容
gpio_bit_set(GPIOA, GPIO_PIN_5); // SCK 默认高
gpio_bit_set(GPIOA, GPIO_PIN_4); // NSS 默认高
}3.2.2 发送数据void SPI_Write(uint8_t data) {
for (int i = 0; i < 8; i++) {
if (data & 0x80) {
gpio_bit_set(GPIOA, GPIO_PIN_7); // 置高 MOSI/MISO
} else {
gpio_bit_reset(GPIOA, GPIO_PIN_7); // 置低 MOSI/MISO
}
data <<= 1;
gpio_bit_reset(GPIOA, GPIO_PIN_5); // SCK 拉低
delay();
gpio_bit_set(GPIOA, GPIO_PIN_5); // SCK 拉高
}
}3.2.3 读取数据uint8_t SPI_Read(void) {
uint8_t data = 0;
for (int i = 0; i < 8; i++) {
data <<= 1;
gpio_bit_reset(GPIOA, GPIO_PIN_5); // SCK 低
delay();
if (gpio_input_bit_get(GPIOA, GPIO_PIN_7)) {
data |= 0x01;
}
gpio_bit_set(GPIOA, GPIO_PIN_5); // SCK 高
}
return data;
}3.2.4 片选控制void SPI_Select(void) {
gpio_bit_reset(GPIOA, GPIO_PIN_4);
}
void SPI_Deselect(void) {
gpio_bit_set(GPIOA, GPIO_PIN_4);
}4. 常见问题与优化4.1 读写冲突在 3 线 SPI 中,MOSI/MISO 复用,因此在写入数据后,需要将 GPIO 切换至输入模式进行读取。
void Set_SPI_MISO_Mode_Input(void) {
gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
}4.2 通信速率优化GD32F103 最高 72MHz,GPIO 操作速度受限,可用 DMA 或 定时器 优化时序,提高通信速率。
4.3 兼容性问题某些外设要求特定 时序(如 CPOL、CPHA),需调整 SCK 电平翻转逻辑。
5. 结论GD32F103 自带硬件 SPI,但在 3 线模式下存在一定局限性,可通过 GPIO 模拟 实现灵活通信。本文提供了 硬件连接、GPIO 配置、数据读写和优化方案,适用于 EEPROM、OLED 屏等设备。在实际应用中,可结合 DMA 或定时器 进一步优化,提高通信效率。