送货至:

 

 

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 或定时器 进一步优化,提高通信效率。


 

上一篇: 低电感、高电流SMD电感器上的脉冲电感测量
下一篇: 优化设计效率:在汽车和工业应用中缩小PSU

热点资讯 - 元器件应用

 

光耦继电器在医疗器械中的应用
DC/DC 电源全揭秘:原理、调制、芯片及硬件设计要点
n型热电偶和k型热电偶的区别是什么
半导体封装特点介绍
半导体封装特点介绍
2025-04-28 | 1220 阅读
物联网技术解析:组成、应用与发展趋势
关于多种电平电压源换流器解析方案
信号发生器的使用方法详解
信号发生器的使用方法详解
2025-04-23 | 1259 阅读
能否并联多个 LM1117 提高电流?
收起 展开
QQ客服
我的专属客服
工作时间

周一至周六:09:00-12:00

13:30-18:30

投诉电话:0755-82566015

微信客服

扫一扫,加我微信

0 优惠券 0 购物车 BOM配单 我的询价 TOP