STM32 SPI总线驱动CH376T实现U盘/TF卡读写详解(入门篇)
主题 | 内容 | 教学目的/扩展视频 |
---|---|---|
TF卡直连 USB接口直连 |
电路原理,跳线设置,TF卡协议分析,读写数据。 跳线设置,固件库分析,USB协议简介,函数序调用。 |
了解TF卡协议,能读写数据。 能调用现有函数即可。 |
师从洋桃电子,杜洋老师
📑文章目录
(图1:开发板与CH376+U盘接口部分连接示意图)
一、SPI总线核心原理
1.1 SPI通信机制
SCK
MOSI
MISO
NSS
主设备 STM32
从设备 CH376T
1.2 关键参数配置
参数 | 说明 | 典型值 |
---|---|---|
波特率分频器 | 通过预分频设置时钟频率 | FPCLK/2 ~ /256 |
数据帧格式 | 8位/16位数据帧 | 8位 |
主从模式 | 仅支持一主多从(需独立NSS) | 主模式 |
二、硬件连接设计
2.1 CH376T芯片特性
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) |
功耗 | 较高(时钟持续工作) | 较低(异步模式下无时钟信号) |
开发复杂度 | 简单(硬件直连) | 需配置波特率、数据格式等 |
总结
根据实际需求选择:
💬 技术讨论(请在评论区留言~)
📌 下期预告:下一期将探讨CH376数据手册分析
重点课程
,欢迎持续关注!点击查阅🔍往期【STM32专栏】文章
版权声明:本文采用[CC BY-NC-SA 4.0]协议,转载请注明来源
实测开发版:洋桃1号开发版(基于STM32F103C8T6)
更新日志:v1.0 初始版本(2025-03-16)
作者:触角01010001