ch376读取数据流程

  1. 概述

CH376 支持 USB 设备方式和 USB 主机方式,并且内置了 USB 通讯协议的基本固件,内置了处理Mass-Storage 海量存储设备的专用通讯协议的固件,内置了 SD 卡的通讯接口固件,内置了 FAT16 FAT32 以及 FAT12 文件系统的管理固件,支持常用的 USB 存储设备(包括 U 盘/USB 硬盘/USB 闪存盘/USB 读卡器)和 SD 卡(包括标准容量 SD 卡和高容量 HC-SD 卡以及协议兼容的 MMC 卡和 TF 卡)。

CH376评估板包含CH376S芯片和辅助器件,不含单片机,对外预留了8位并口、SPI接口、异步串口及电源端口等,用于连接其他单片机主板,并由单片机主板控制CH376进行数据的读取。

注:市场上普遍的U盘有三种格式,默认格式都为FAT32(其他两种分别为NTFS和exFAT),若用户在使用U盘作本地更新时无法读取数据,则可从用户U盘的格式入手查找原因。

 

  1. 硬件连接

 

项目代码中选择了异步串口读取数据的方式即选用串口1,电源供电为5V供电。 

 

  1. 软件程序

 

程序流程图请参考《usb读取数据流程图》,这里只介绍代码中用到的几个函数的作用,如下。

 

(1)CH376DiskConnect( ); /* 检查 U 盘是否连接,不支持 SD 卡 */
检查 U 盘是否连接,而 SD 卡必须由单片机直接查询 SD 卡座的插拔状态引脚(这里我们没用到SD卡)。示例:
      s=CH376DiskConnect( ); /* 查询 U 盘是否连接,返回 USB_INT_SUCCESS 则说明当前已连接 */
if ( s==USB_INT_SUCCESS ) /* 已经连接 */
else if ( s==ERR_DISK_DISCON ) /* 已经断开 */

(2)CH376DiskMount( ); /* 初始化磁盘并测试磁盘是否就绪 */
初始化并检查 U 盘是否准备好,准备好后才能对文件进行读取。示例:
     s=CH376DiskMount( ); /* 查询 U 盘是否准备好,有些 U 盘可能需多次调用才能成功 */
if ( s!=USB_INT_SUCCESS ) /* 还未准备好 */ else /* 准备好了,可以读数据 */

    (3)CH376GetDiskStatus();/* 获取磁盘和文件系统的工作状态*/,此函数调用之正确返回值为0x14,若返回值正确,则文件已经准备好可以进行下一步,打开文件。

(4)CH376FileOpenPath( name ); /* 在根目录下打开文件*/
调用前,应该在name 中提供文件名。例如:CH376FileOpenPath( "/GUIWU1.BIN" );

 

重要注释:BIN文件命名所有字符必须是大写,不能使用通配符,文件名长度不超过 11 个字符,其中主文件名不超过 8个字符(必须是大写字母开头,后面才可以跟数字),扩展名不超过 3个字符,如果有扩展名,则用小数点与主文件名隔开。且用户下载的更新文件必须放到U盘的根目录下。

 

(5)CH376GetFileSize( ); /* 获取文件总的字节大小*/

该函数返回值为文件字节大小,此返回值在代码中用于while循环,每次读取2k数据之后总长度就减去2k,直到总长度为0则结束while循环。

(6)CH376ByteRead( buf, ReqCount, RealCount ); /* 以字节为单位从当前文件读取数据块 */
从当前已打开文件中读取数据,每次读取后自动移动文件指针,第二次调用子程序时将从第一次读取数据的后面继续读取数据。输入参数应该在 ReqCount 中指定需要读取的字节数,子程序返回后,读出的数据块被存放在输入参数 buf 指向的缓冲区中。该子程序会自动检查文件是否结束,如果文件已经结束,那么返回时在 RealCount 中为实际读出的字节数,所以判断 RealCount 如果变小就说明文件已经结束。示例:
s=CH376ByteRead( MyBuf, 512, &RealCount ); /* 以字节为单位从文件读出数据,准备读 512 个字节 */
if ( s!=USB_INT_SUCCESS ) /* 出错 */ else /* 成功 */
if ( RealCount < 512 ) 已经到文件结尾,所以实际读出的长度变小了
/* 在 MyBuf 中为读出的数据块 */
CH376ByteRead( MyBuf, 2048, NULL ); /* 接着刚才的位置向后读数据,准备读 2048个字节 */

为了提高读操作的效率,尽量一次读写较大的数据块,最大为 65535,建议为 512 的倍数。在该项目中我们一次读取2k,即2048个字节。

 

猜你喜欢

转载自blog.csdn.net/guiwukejiBGG/article/details/81839717