STM32 SPI总线驱动CH376T实现U盘/TF卡读写详解(入门篇)

主题 内容 教学目的/扩展视频
TF卡直连
USB接口直连
电路原理,跳线设置,TF卡协议分析,读写数据。
跳线设置,固件库分析,USB协议简介,函数序调用。
了解TF卡协议,能读写数据。
能调用现有函数即可。

师从洋桃电子,杜洋老师


📑文章目录

  • 一、SPI总线核心原理
  • 1.1 SPI通信机制
  • 1.2 关键参数配置
  • 二、硬件连接设计
  • 2.1 CH376T芯片特性
  • 2.2 连接示意图
  • 三、驱动开发关键步骤
  • 3.1 SPI初始化配置(示例)
  • 3.2 CH376T指令操作
  • 四、文件操作实战
  • 4.1 U盘识别流程
  • 4.2 文件读取示例
  • 五、扩展应用与调试
  • 5.1 DMA加速传输
  • 5.2 常见问题排查
  • 六、相关资源
  • 附录一
  • SPI与USART对比区别

  • (图1:开发板与CH376+U盘接口部分连接示意图)


    一、SPI总线核心原理

    1.1 SPI通信机制

    SCK

    MOSI

    MISO

    NSS

    主设备 STM32

    从设备 CH376T

  • 四线制:SCK(时钟)、MOSI(主出从入)、MISO(主入从出)、NSS(片选)
  • 工作模式:支持全双工/半双工通信,最大速率18Mbps
  • 时钟极性:CPOL=0/1(空闲时低/高电平)
  • 时钟相位:CPHA=0/1(数据在第一个/第二个时钟沿采样)
  • 1.2 关键参数配置

    参数 说明 典型值
    波特率分频器 通过预分频设置时钟频率 FPCLK/2 ~ /256
    数据帧格式 8位/16位数据帧 8位
    主从模式 仅支持一主多从(需独立NSS) 主模式

    二、硬件连接设计

    2.1 CH376T芯片特性

  • 支持设备:U盘(FAT/FAT32)、SD/TF卡
  • 接口类型:SPI/UART双模式(跳线选择)
  • 供电范围:3.3V-5V(需与STM32电平匹配)
  • 2.2 连接示意图

    存储模块

    主控模块

    PA4(NSS)

    PA5(SCK)

    PA7(MOSI)

    PA6(MISO)

    USB接口

    TF卡槽

    U盘

    TF卡

    CH376T\n(USB/TF卡控制器)

    STM32F103\n(SPI主机)


    三、驱动开发关键步骤

    3.1 SPI初始化配置(示例)

    void SPI1_Init(void){
        SPI_InitTypeDef SPI_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
        
        // 时钟使能
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_SPI1, ENABLE);
        
        // 引脚配置
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7; // SCK/MOSI
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        // 复用推挽
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; // MISO
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  // 浮空输入
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        
        // SPI参数设置
        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;          // 主模式
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;      // 8位数据
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;             // 时钟极性
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;           // 时钟相位
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;              // 软件NSS控制
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; // 9MHz
        SPI_Init(SPI1, &SPI_InitStructure);
        SPI_Cmd(SPI1, ENABLE); // 使能SPI
    }
    

    3.2 CH376T指令操作

    指令类型 操作码 功能说明
    初始化 0x06 芯片复位与模式设置
    检测设备 0x0F 查询U盘/TF卡连接状态
    文件打开 0x32 指定路径打开文件
    数据读取 0x52 从当前文件读取数据

    四、文件操作实战

    4.1 U盘识别流程

    STM32

    CH376T

    发送0x06(复位指令)

    返回0x51(就绪)

    发送0x0F(检测设备)

    返回0x15(就绪)

    发送0x22(初始化存储)

    返回0x1F(错误)

    alt

    [设备已连接]

    [设备未连接]

    STM32

    CH376T

    4.2 文件读取示例

    void ReadFile(char *filename){
        CH376_SendCmd(0x32); // 打开文件
        CH376_SendStr(filename); // 发送文件名
        if(CH376_GetStatus()==0x14){ // 成功打开
            CH376_SendCmd(0x52); // 读取数据
            while(!CH376_DataReady()); // 等待数据就绪
            uint8_t buffer[64];
            CH376_ReadData(buffer, 64); // 读取数据
        }
        CH376_SendCmd(0x36); // 关闭文件
    }
    

    五、扩展应用与调试

    5.1 DMA加速传输

    void SPI1_DMA_Init(){
        DMA_InitTypeDef DMA_InitStructure;
        // 发送DMA配置(SPI1_TX→DMA1_Channel3)
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI1->DR);
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)tx_buffer;
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; // 内存到外设
        DMA_InitStructure.DMA_BufferSize = 256;
        DMA_Init(DMA1_Channel3, &DMA_InitStructure);
        DMA_Cmd(DMA1_Channel3, ENABLE);
        SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Tx, ENABLE); 
    }
    

    5.2 常见问题排查

    现象 可能原因 解决方案
    无法检测到设备 NSS信号未正确拉低 检查GPIO初始化配置
    数据传输错误 SPI相位/极性配置错误 调整CPOL/CPHA参数
    文件读取失败 文件名不符合8.3格式 重命名为短文件名

    六、相关资源

    [1] 洋桃电子B站课程-STM32入门100步
    [2] STM32官方文档手册
    [3] STM32F103固件函数库用户手册(中文)
    [4] U盘插拔测试程序
    [5] SPI总线原理与驱动.pptx


    附录一

    SPI与USART对比区别

    以下是SPI(Serial Peripheral Interface)和USART(Universal Synchronous/Asynchronous Receiver/Transmitter)在通信协议、应用场景及技术特性方面的主要区别:

    1. 通信模式

    特性 SPI USART
    同步/异步 同步通信(必须有时钟信号SCK) 同步或异步(异步模式无需时钟信号)
    全双工 支持全双工(同时发送和接收) 异步模式下支持全双工,同步模式可配置
    主从模式 严格区分主从(主设备控制通信) 异步模式通常为点对点(无主从)

    2. 硬件接口

    特性 SPI USART
    线数 至少4根线:
    SCK、MOSI、MISO、SS
    异步模式2根线:TX、RX
    同步模式3根线:TX、RX、SCK
    拓扑结构 主从结构,多从机需多个SS片选信号 点对点或多点(需协议支持,如RS485)
    信号电平 逻辑电平(3.3V/5V),短距离 支持TTL/RS232/RS485,可长距离通信

    3. 速度与性能

    特性 SPI USART
    传输速率 高速(可达几十MHz) 中低速(通常几十kbps到几Mbps)
    时钟依赖 依赖主设备时钟(SCK) 异步模式依赖预定义波特率
    实时性 实时性高(时钟同步) 异步模式实时性较低,需波特率匹配

    4. 配置与协议

    特性 SPI USART
    协议复杂度 简单(无固定协议,需自定义数据帧) 支持固定数据格式(数据位、停止位、校验位)
    错误检测 无内置错误检测机制 支持奇偶校验、帧错误检测
    灵活性 灵活性高(可自定义时序) 配置灵活(波特率、数据格式可调)

    5. 典型应用场景

    特性 SPI USART
    适用场景 板级短距离通信:
    传感器(如陀螺仪)、存储器(如Flash)、显示屏
    设备间中长距离通信:
    调试串口、模块通信(GPS、蓝牙)、工业总线(如Modbus)
    典型设备 SD卡、EEPROM、TFT屏幕 计算机串口、WiFi模块、RS485设备

    6. 其他关键区别

    特性 SPI USART
    多设备支持 需要为每个从设备分配独立的SS片选信号 异步模式点对点,多点需协议扩展(如RS485)
    功耗 较高(时钟持续工作) 较低(异步模式下无时钟信号)
    开发复杂度 简单(硬件直连) 需配置波特率、数据格式等

    总结

  • SPI:适合高速、短距离、主从架构的通信,如芯片间数据传输,但需要更多硬件线路。
  • USART/UART:适合中低速、长距离、点对点通信,配置灵活,广泛用于调试和模块间交互。
  • 根据实际需求选择:

  • 需要高速、实时通信:选SPI。
  • 需要长距离、简单配置:选USART(异步模式)。

  • 💬 技术讨论(请在评论区留言~)


    📌 下期预告:下一期将探讨CH376数据手册分析重点课程,欢迎持续关注!

    点击查阅🔍往期【STM32专栏】文章

    版权声明:本文采用[CC BY-NC-SA 4.0]协议,转载请注明来源
    实测开发版:洋桃1号开发版(基于STM32F103C8T6)
    更新日志

  • v1.0 初始版本(2025-03-16)
  • 作者:触角01010001

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32 SPI总线驱动CH376T实现U盘/TF卡读写详解(入门篇)

    发表回复