熊家余 发表于 2021-7-11 11:09:32

【开源】T5L迪文屏驱动外部U盘和SD卡

本帖最后由 熊家余 于 2022-11-11 12:02 编辑

一.前言      今天有兴趣基于T5L迪文屏开源一个比较实用的功能,对于用户而言,我们大家都知道T5L屏默认情况下是不支持外部U盘和SD卡的,但你可以通过迪文厂家给你定制的方式来实现这样的功能,前提是你的产品得有量,否则不太划算,好,那我们今天就自己基于T5L迪文屏来实现一个这样的功能,程序是采用C51开发的。
       核心原理是采用了一颗ch376s或者ch376t的驱动芯片,这颗芯片是国内生产的,它内置了各种U盘,SD卡等协议栈,它支持UART串口, SPI, 并口等三种通信方式,而我们考虑到读写速度和IO引脚数量的影响,我们迪文屏就采用SPI接口来驱动这个颗芯片,大家可以直接从某宝上买到ch376的硬件模块,然后用飞线的方式连接到迪文屏的IO引脚上.
ch376t硬件模块如下图所示:

此模块可以同时驱动U盘和Micro SD卡,但是得注意U盘或者SD卡的文件系统要为FAT系列的.
然后此模式的硬件原理图如下图所示:

然后关于ch376芯片的数据手册和开发文档以及原理图我都给大家放在了资源文件夹下,如下图所示:

二.硬件连线

sbit IS_SD_NO_EXIST = P2^1;//检测SD卡是否插入的引脚
sbit SPI_INT      = P2^2;//中断通知引脚,也是用于检测U盘是否插入的引脚
sbit SPI_RST      = P2^3; //芯片的复位引脚
sbit SPI_MISO      = P2^4; //SPI的MISO引脚
sbit SPI_MOSI      = P2^5; //SPI的MOSI引脚
sbit SPI_SCK      = P2^6; //SPI的SCK引脚
sbit SPI_CS          = P2^7; //SPI的CS片选引脚


按照上述的引脚定义,用杜邦线连接ch376模块上的排针到迪文屏上,连接后的实物效果大致如下图所示:

上图中所用的迪文屏为EK043开发板

三.C51项目工程

   对于ch376芯片的核心驱动代码,已经被我高度封装,放在了HARDWARE/CH376文件夹下,驱动代码比较复杂的,没有特殊需求不要去改动,如下图所示:

其中spi.c和spi.h为通信接口驱动,而ch376.c和ch376.h为文件操作的驱动,在ch376文件中,总共有20个函数,如下图所示:


好,有了驱动代码之后,我们接着来做一个对U盘和SD卡进行读写文件的操作,大致功能如下:
1.支持实时监测U盘和SD卡的插拔识别动作,检测到插入动作之后,会在迪文屏上面显示相应的图标
2.支持对U盘进行创建文件并写入数据
3.支持对U盘进行读取文件内容,并显示到迪文屏上
4.支持对SD卡进行创建文件并写入数据
5.支持对SD卡进行读取文件内容,并显示到迪文屏上

检测插拔动作的代码如下:
      //USB插拔检测
      if(ch376s_int_sta==0)
      {
                res = ch376s_read_dat(READ_TIMEOUT);
                if(res==USB_INT_CONNECT||res==USB_INT_DISCONNECT)
                {
                        res = (res==USB_INT_CONNECT);
                        sys_write_vp(START_WIN_USB_VP,(u8*)&res,1);
                }
      }      
      //SD卡检测
      if(is_sd_check)
      {
                is_sd_check = 0;
                res = !IS_SD_NO_EXIST;
                sys_write_vp(START_WIN_SD_VP,(u8*)&res,1);               
      }



读取文件并显示到迪文屏上的代码如下:
               res = ch376s_init(mode);
                if(res==0)
                {
                        res = ch376s_open_path("\\DWIN\\XJY2.TXT",0xff);
                        if(res==0)
                        {
                              ch376s_read_file(common_buf,sizeof(common_buf)-2,&btn_val);
                              common_buf = 0;
                              common_buf = 0;
                        }
                        ch376s_close_file(1);
                }
                //显示读取的内容
                if(res==0)
                        sys_write_vp(START_WIN_READ_VP,common_buf,btn_val/2+2);

                res = (res==0?2:1);
                sys_write_vp(START_WIN_TIP_VP,(u8*)&res,1);



创建文件并写入数据的代码如下:
               sys_read_vp(START_WIN_WRITE_VP,common_buf,sizeof(common_buf));
                for(res=0;res<sizeof(common_buf);res++)
                {
                        if(common_buf==0xff)
                        {
                              common_buf = 0;
                              break;
                        }
                }
                res = ch376s_init(mode);
                if(res==0)
                {
                        res = ch376s_create_file("\\DWIN\\XJY1.TXT",1);
                        if(res==0)
                              res = ch376s_write_file(common_buf,strlen(common_buf),0);
                        ch376s_close_file(1);
                }
                res = (res==0?2:1);
                sys_write_vp(START_WIN_TIP_VP,(u8*)&res,1);


四.GUI项目工程
核心界面如下图所示:

左上角的那个X和√图标是用来提示写入和读取操作的,此操作是错误还是正确

五.效果截图演示

先准备好要用到的U盘和Micro SD卡(最好也要有一个读卡器)


然后代码下载完成后,迪文屏上电后的默认效果如下图所示:

接着我们插入U盘和SD卡后的界面如下图所示:

可以看到上图的右上角出出现了U盘和SD卡图标

再接着我们点击屏幕上的"读取"和"写入"按钮,读取到的U盘文件内容如下所示:

而我们把U盘插入到电脑后,发现在U盘的/DWIN目录下有一个XJY1.TXT文件,内容为"T5L For USB Or SD"

然后我们点击屏幕上的SD卡单选按钮,可以切换到对SD卡进行操作,效果是相同的,如下图所示:






dl202103 发表于 2021-7-12 08:31:17

哇,太优秀了,大神膜拜

熊家余 发表于 2021-7-15 09:42:09

dl202103 发表于 2021-7-12 08:31
哇,太优秀了,大神膜拜

:handshake:handshake

DWIN_123 发表于 2022-2-12 19:05:53

小白学习了 YYDDS

infojiufa 发表于 2022-3-2 13:49:27

学习了,论坛有你更精彩

Alsert 发表于 2022-4-24 14:56:49

不错不错!

tangcui0613 发表于 2022-11-4 19:25:17

这个方案读写U盘数据文件之类的 速度快吗?如果有大量的数据要写入的话。

YRD 发表于 2023-7-5 13:33:27

你好,我看了一下您的这个sd的读写,我想问一下关于对已有的文件进行写入的操作,是不是就不用创建了,直接写就好了是吧,但是我发现你的写入的文件没有文件名这个参数,所以该怎么向已有的文件写入数据呢,真心求教

DWIN-ARK 发表于 2023-7-5 16:49:40

YRD 发表于 2023-7-5 13:33
你好,我看了一下您的这个sd的读写,我想问一下关于对已有的文件进行写入的操作,是不是就不用创建了,直接 ...
您好,那个文件不会先创建的,如果存在的话,就直接打开。

YRD 发表于 2023-7-6 08:52:51

DWIN-ARK 发表于 2023-7-5 16:49
您好,那个文件不会先创建的,如果存在的话,就直接打开。
谢谢您,我明白了,如果存在就打开继续写入这样就太好了,非常感谢
页: [1] 2
查看完整版本: 【开源】T5L迪文屏驱动外部U盘和SD卡