Skip to content

Latest commit

 

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

CH376T · ESP32-S3 SPI Driver (ESP-IDF)

CH376T / CH376S 驱动 · ESP32-S3 · 软件模拟 SPI · U盘读写 · FAT16/FAT32 · 纯 C

EN — A CH376T (WCH) driver for ESP32-S3 with ESP-IDF: bit-bang SPI, no external dependencies, full U-disk (USB host) + FAT file API, plus a ready-to-build demo project. 中文 — WCH CH376T 芯片的 ESP32-S3 驱动,用普通 GPIO 模拟 SPI,封装了 U 盘挂载与 FAT 文件读写的全部常用命令,附带可直接 idf.py build 的示例工程。


简介 / Introduction

CH376T 是 WCH(南京沁恒)的 U 盘 / SD 卡文件管理控制芯片。芯片内部已经集成了 USB 主机固件、Bulk-Only 传输协议和 FAT12/16/32 文件系统,单片机只要发文件级命令,就能读写 U 盘里的文件,不需要自己实现 USB 协议栈和文件系统。

本驱动把 CH376 手册里的命令逐条封装成 CH376T_xxx() 函数:成功返回 1、失败返回 0,失败时把芯片返回的中断状态码打到串口。每个函数都注明了对应的手册命令码、参数顺序和限制。仓库不含任何业务逻辑,可以直接拿去集成。

特性 / Features

  • 不依赖 IDF 的 SPI master 驱动(bit-bang,4 根线,引脚可在头文件里任意指定)
  • 只用 driver/gpio.h + esp_log.h + FreeRTOS,纯 C,无第三方库
  • 覆盖 CH376 手册 40 条命令中的 31 条:初始化、磁盘挂载、文件新建 / 打开 / 删除 / 关闭、读、写、追加、目录创建、文件枚举、目录信息、文件指针定位、磁盘容量与剩余空间查询
  • 可传参的文件名与数据:CH376T_FILE_OPEN_NAME("/LOG.TXT")、CH376T_BYTE_WRITE_DATA(buf, len)(自动分批,任意长度)
  • 追加写支持:CH376T_BYTE_LOCATE(0xFFFFFFFFUL, NULL) 定位到文件末尾,不覆盖旧数据
  • 头文件里带完整的中文注释与手册命令对照表
  • 附带 examples/esp32s3-demo 示例工程:连接 → 创建文件 → 写入 hello ch376 → 关闭,每一步都有编号日志

目录结构 / Layout

CH376T/
├── ch376_spi.c                    ← 驱动实现
├── ch376_spi.h                    ← 引脚配置、命令码/状态码宏、函数声明
├── docs/
│   ├── CH376T-driver-guide-zh.md  ← 驱动接口说明(含全部 API、状态码、使用流程)
│   └── CH376DS1-CH376T-datasheet-CN.pdf  ← 芯片手册
└── examples/
    └── esp32s3-demo/              ← 可直接编译的 ESP32-S3 示例工程
        ├── README.md
        ├── CMakeLists.txt
        ├── sdkconfig.defaults
        └── main/
            ├── CMakeLists.txt
            └── ch376_demo.c

硬件连接 / Wiring

引脚在 ch376_spi.h 顶部定义,换接线只改这里:

CH376T ESP32-S3 方向 说明
SCS GPIO2 输出 SPI 片选,低电平有效
SDI GPIO41 输出 ESP32 的 MOSI → CH376 的 SDI
SDO GPIO40 输入 CH376 的 SDO → ESP32 的 MISO
SCK GPIO42 输出 SPI 时钟
INT# GPIO1 输入 中断请求,低电平有效
VCC / GND 5V 或 3.3V 电源 按模块要求供电,注意共地

两个硬件前提:

  1. INT# 必须接到单片机。驱动靠轮询 INT 引脚判断命令是否执行完,不接会让每次命令都等到约 1 秒超时。
  2. CH376T 的 SPI# 引脚在复位期间必须为低电平(芯片靠它选择 SPI 接口而不是异步串口),这是硬件决定的。

快速开始 / Quick Start

git clone https://github.com/TELE-nwj/CH376T.git
cd CH376T/examples/esp32s3-demo
idf.py set-target esp32s3
idf.py build
idf.py -p COMx flash monitor      # COM 口按实际修改

在串口里看到 [1/8] ~ [8/8] 全部成功,U 盘根目录就会出现 ASD.TXT,内容为 hello ch376。

用法示例 / Usage

#include "ch376_spi.h"

CH376_PORT_INIT();                 /* ① 配置 GPIO                        */
CH376T_CheckExist();               /* ② 芯片在线检测(0x06)              */
CH376T_SetUsbMode();               /* ③ 进入 USB 主机模式(0x15)         */

/* ④ 检测 U 盘 + ⑤ 挂载磁盘(两者都成功才能进行文件操作) */
if (CH376T_CMD_DISK_CONNECT() && CH376T_DISK_MOUNT())
{
    CH376T_FILE_CREATE_NAME("/HELLO.TXT");                       /* ⑥ 新建文件   */
    CH376T_BYTE_WRITE_DATA((const uint8_t *)"hello ch376", 11);  /* ⑦ 写入数据   */
    CH376T_FILE_CLOSE();                                         /* ⑧ 关闭并刷新 */
}

追加写(保留原内容):

if (CH376T_FILE_OPEN_NAME("/LOG.TXT"))
{
    CH376T_BYTE_LOCATE(0xFFFFFFFFUL, NULL);   /* 把指针移到文件末尾,否则从头覆盖 */
    CH376T_BYTE_WRITE_DATA((const uint8_t *)line, (uint16_t)strlen(line));
    CH376T_FILE_CLOSE();
}

主要接口 / API

分类 函数 说明
初始化 CH376_PORT_INIT CH376T_CheckExist CH376T_SetUsbMode CH376T_ResetAll CH376T_EnterSleep CH376T_Get_IC_Ver GPIO 配置、在线检测、USB 模式、复位、睡眠
磁盘 CH376T_CMD_DISK_CONNECT CH376T_DISK_MOUNT CH376T_DISK_CAPACITY CH376T_DISK_QUERY 检测连接、挂载、物理容量、剩余空间
文件 CH376T_FILE_OPEN_NAME CH376T_FILE_CREATE_NAME CH376T_FILE_ERASE CH376T_FILE_CLOSE CH376T_GetFileSize 打开(按名字)、新建(按名字)、删除、关闭、长度
读 / 写 CH376T_BYTE_WRITE_DATA CH376T_BYTE_READ CH376T_BYTE_WRITE CH376T_BYTE_LOCATE CH376T_SEC_LOCATE 写任意数据、读、定位(追加写)
目录 / 枚举 CH376T_DIR_CREATE CH376T_DIR_INFO_READ CH376T_DIR_INFO_SAVE CH376T_FILE_ENUM_START CH376T_FILE_ENUM_GO 建目录、目录信息、通配符枚举文件
缓冲区 CH376T_WR_OFS_DATA 写芯片内部缓冲区(配合修改目录信息)

完整接口说明(参数、返回值、对应手册命令码、状态码表)见 docs/CH376T-driver-guide-zh.md。

适用芯片 / Supported Chips

CH376T(SSOP20)、CH376S(SOP28)、CH376F(QFN28)——只要是走 SPI 接口的都适用;CH376S 的 8 位并口模式不适用(本驱动是 SPI 版)。

状态与限制 / Status & Limits

已验证:驱动已随示例工程在 ESP-IDF v5.5.5 + ESP32-S3 上完整编译通过(idf.py build 退出码 0);语法检查在 -Wall -Wextra -Werror 下零告警。

尚未验证(重要):所有需要实际连接 U 盘收发的行为还没有上机测试——包括挂载、建文件、写入、关闭、枚举、删文件、建目录、文件指针定位、磁盘容量查询。这批较新的函数在头文件里都标了 //未验证,请以实测为准。

已知特性与限制:

  • 阻塞式、不可重入:所有命令同步阻塞,wait() 忙等最长约 1 秒且不让出 CPU;驱动内部无锁,多任务共用需自行加锁串行化。
  • 速度:软件模拟 SPI 约 250kHz(芯片本身支持 24MHz)。写 1KB 数据约 20ms。
  • CH376T_FILE_CREATE() / CH376T_FILE_CREATE_NAME() 是“先删后建”,不要用它们打开已有文件。
  • wait() 会打日志:轮询过程中有 ESP_LOGI,高频写盘时串口输出较多。
  • 未实现的 9 条命令:CMD_SET_FILE_SIZE(0x0D,手册未给命令码)、CMD_WR_HOST_DATA(0x2C)、CMD_SEC_READ/WRITE(0x4B/0x4C)、CMD_DISK_BOC_CMD(0x50)、CMD_DISK_READ/WRITE/RD_GO/WR_GO(0x54~0x57,物理扇区读写)。

许可 / License

MIT


关键词 / Keywords:CH376T CH376S CH376 WCH 沁恒 ESP32-S3 ESP32S3 ESP-IDF U盘 U-disk USB-flash USB-Host FAT32 FAT16 SPI bit-bang 软件SPI 驱动 driver 嵌入式 embedded

About

CH376T/CH376S(WCH)U盘读写驱动 for ESP32-S3 / ESP-IDF:软件模拟 SPI、FAT16/32 文件读写与追加、纯 C,含可直接编译的示例工程。CH376T USB flash disk (FAT) SPI driver for ESP32-S3 with ESP-IDF, bit-bang SPI, no external dependencies.

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages