1. 选型

型号

接口

功能

备注

电源

CH372

并口

USB_Device

全速 USB 设备接口,兼容 USB V2.0

3.1-3.6

4.2-5.4

CH374

SPI/并口

Host/Device都可以,F/U封装可以扩3个USB口

支持 1.5Mbps 低速和 12Mbps 全速 USB 通讯,兼容 USB V2.0

3.0-3.6

4.4-5.3

CH375

并口/串口(只能在USB_HOST下使用)

Host/Device

支持 1.5Mbps 低速和 12Mbps 全速 USB 通讯,兼容 USB V2.0。作为设备兼容CH372

3.1-3.6

4.2-5.4

CH376

SPI/串口/并口

主要做U盘、SD卡读写。USB为低速/全速

支持 1.5Mbps 低速和 12Mbps 全速 USB 通讯,兼容 USB V2.0

3.0-3.6

4.3-5.3

CH378

SPI/串口/并口

主要做U盘、SD卡读写。USB为全速/高速

支持USB2.0全速以及USB2.0高速。

V33:2.7-3.6

V18:1.65-1.95

CH370

SPI/并口

USB_Host

支持 1.5Mbps 低速和 12Mbps 全速 USB 通讯,兼容 USB V2.0

支持 5V 电源电压和 3.3V 电源电压,内置电源上电复位。CH370V 只支持 3.3V 电源电压。

3.0-3.6

4.5-5.3

注释:CH37x电源有两个范围(除了CH378为两个电源供电),电源典型值分别为3.3V和5V。不同的供电电压,芯片的最小系统原理图是不一样的。最明显的区别在于V3脚的链接处理。在5V供电的时候,V3脚连接0.01uF的退耦电容到地即可;在3.3V供电的时候,V3脚需要连接到VCC。具体可以看下面两个原理图。红框部分很明显的区别。

2. CH37x系列的芯片很多,上面的表格分类也是只把一些基础的信息放在了上面。但是具体项目的时候该怎么选择。

  1. CH370

   这个芯片只有主机功能

  2. CH372

  这个是WCH一颗比较经典的芯片,主要功能就是作为一个USB_Device与电脑或者USB_Host链接实现USB数据的传输的,因为接口是使用的并口,所以占用的IO数量比较多,可以使用STM32的FSMC去控制。使用CH372作为USB_Device拓展,电脑装上CH372驱动后,可再PC端识别为CH372设备,简单实现数据上下传。

  3.CH374

  CH374这个芯片有两个版本,一个是普通的CH374T等封装,这个就是一个SPI、串口、并口去扩展一个USB2.0全速Host/Device的USB接口芯片。而CH374F,CH374U是有Hub根集线器的一个USB扩展芯片。即实现SPI/并口去扩展出3个USB口,类似于HUB扩展的功能,不过是接口扩展USB。可以实现单片机通过374扩展出USB_Host,然后去识别键鼠、打印机、CDC设备、游戏手柄等等。这边从枚举到数据传输,都需要用户根据电脑枚举这些设备的步骤去模拟。CH374也可以作为Device使用,芯片作为设备有两个模式选择,一个是内置固件模式,再USB_Mode设置这边选择这个内置固件模式后,芯片即可自动完成CH372设备的枚举过程。如果需要做其它的设备,则需要用户选择外置固件模式,自己去做设备的枚举以及后续数据的传输。

  4.CH376/CH378

  目前CH376的版本号为:0x45;

  目前CH378的版本号为:0x42;

  这两个芯片主要是被用作U盘或者SD卡的读写。对于不想在自己MCU代码里面加入FATFS以及USB开发的工程师而言,是一个不错的选择。

  两颗芯片的主要功能基本都是一样的。区别就在于速度以及模式上的区别。CH376的USB为低、全速,而CH378的USB接口为高速。与主控芯片连接的接口方面CH378的接口速度大于CH376,所以实际文件传输方面,速度会略快于CH376。

  USB模式方面,两颗芯片都可以做USB_Device以及USB_Host。USB_Device也拥有内置固件模式(及无需用户做USB设备枚举阶段的代码,PC安装372驱动),PC端的设备管理器就能识别出一个372设备没用于USB数据的批量上下传。外置固件模式,就是使用者自己做好枚举的过程(使用者自己将CH37x系列的USB在电脑端识别为HID、CDC、大容量设备等)。主机模式都是一样的,实现对U盘或者SD卡的读写(比较简单)。也可以实现对对键鼠的识别等。最大的区别在于,0x43固件版本的CH378加入了读卡器模式(08H),设置完模式之后,就可以实现读卡器功能,在PC上识别出存储设备,并进行读写操作。

3. 常见问题

  CH376/CH378

  1. 接口通讯不正常,无法对芯片进行操作

  答:遇到这个问题,首先需要判断硬件上是否正确。检查芯片的电源脚是否在手册需求范围之内,CH376的V3脚硬件设计区别(根据芯片供电电压有区别,在文章上面有详细说明)。看晶振是否起振,芯片的复位引脚电平是否正确,以及接口选择相关的引脚电平是否正确。其次看一下接口通讯的时序是否满足手册的需求。例如SPI时序,CS片选信号需要按照手册需求来。如下图:在一个CS拉低的边沿里面完成了命令,数据的发送,以及读取。

  2. 磁盘初始化过不去,U盘无法实现读写

  答:检查以下几点:(1)接口通讯是否正常,不正常就看上面第一条。(2)看一下U盘,U盘的文件格式是否满足FAT12/FAT16/FAT32;存储容量大小满足小于等于32GB的需求。如果是USB3.0的U盘,需要确认那个U盘可以插入2.0的接口。然后还有一个比较重要的是,如果用户使用的U盘是做过系统盘的,那么需要使用第三方的格式化工具把U盘格式化后,在把文件系统改为CH37x要求的配置。

  3. 有关于CH376/CH378串口通讯,波特率修改的相关问题。

  答:两颗芯片如果是使用串口接口进行通讯的话,会涉及到波特率的设置。设置有两种方式:

  (1)上电时,芯片部分引脚的高低电平设置。

    对于CH376,会在上电的时候检测SDI/D6,SCK/D5,以及BZ/D4三个引脚的电平状态,从而修改默认的串行通讯波特率。

    

       对于CH378,会在上电的时候检测SDI,SDO,以及SCK三个引脚的电平状态,从而修改默认的串行通讯波特率。

  (2)串口命令修改波特率

    两颗芯片都是支持以硬件默认波特率上电,通过CMD_SET_BAUDRATE命令去设置后续的串口通讯波特率,在设置完串口波特率之后,需要尽快在1ms以内将对应通讯主控芯片的串口波特率也设置到相同。

        以下为CH376设置的值

      CH378相对复杂一点,不过总体的流程都是类似的。

  

  在代码方面,以STM32的程序为例,大概流程如下:

  

  首先发送设置波特率的命令,然后发送对应的波特率的值,03 cc按照CH376的手册对应给的就是115200波特率。再修改完CH376的波特率之后,立刻修改STM32F103的串口波特率,最后读取返回值是否正确,正确则表示双方波特率修改成功。

  

  4. CH376/CH378初始化都没有问题,但是创建文件出错,或者创建文件,写入数据后,实际里面没有内容。

  答:这个问题,一般是使用者没有按照手册需求创建短文件名,或者创建函数写的有一些问题导致的。

    需求:路径名首字符必须是斜杠/或者\,所有字符必须是大写字母、数字或者中文汉字以及某些特殊字符,文件名长度不超过11个字符:8字符长度主文件名 . 扩展名不超过3字符。长文件名另外考虑。可以参考沁恒官方例程EXAM11。或者在个人Gitee上下载STM32F103创建长文件名的驱动代码(暂时还未上传)。

    下面是SPI时序下,控制CH378与STM32芯片通讯创建文件的时序,提供参考。

  

5. 相关测试工具

  答:在WCH官网下载CH376EVT。里面有一个检测CH376是否正常工作的软件

4. 眼图测试

USB的眼图测试是由一套详细的规范要求的。测试框图如下:

测试框图如上图。

  5. CH376磁盘容量获取U盘容量大小运算

  

使用函数CH376DiskCapacity();实现读取U盘容量,读出的数值为扇区的数量,例如读取一个28.8GB的U盘,读出的扇区数为60620799

  

60620799*扇区字节512/10241024/1024=28.8GB

WCH沁恒 CH37系列芯片选型以及常见问题的处理(CH376/CH378)的更多相关文章

  1. 沁恒CH32F103C8T6的开发和烧录配置说明

    概述 CH32F1系列是沁恒生产的32位Cortex-M3 MCU, 片上集成了时钟安全机制.多级电源管理. 通用DMA控制器等. 此系列具有 2 路 USB2.0接口.多通道 TouchKey. 1 ...

  2. 沁恒CH32F103C8T6(三): PlatformIO DAPLink和WCHLink下载配置

    目录 沁恒CH32F103C8T6(一): Keil5环境配置,示例运行和烧录 沁恒CH32F103C8T6(二): Linux PlatformIO环境配置, 示例运行和烧录 沁恒CH32F103C ...

  3. 沁恒CH32V003F4P6 开发板上手报告和Win10环境配置

    CH32V003 沁恒最近推出的低价CH32V003系列, 基于青稞RISC-V2A内核, 48MHz主频, 2KB SRAM, 16KB Flash, 工作电压兼容3.3V和5V. 主要参数如下 S ...

  4. 沁恒CH32F103C8T6(二): Linux PlatformIO环境配置, 示例运行和烧录

    目录 沁恒CH32F103C8T6(一): Keil5环境配置,示例运行和烧录 沁恒CH32F103C8T6(二): Linux PlatformIO环境配置, 示例运行和烧录 StdPeriphLi ...

  5. 沁恒CH32V103C8T6开发环境笔记

    CH32V103C8T6 CH32V103C8T6是沁恒的RISC-V内核MCU, 基于RISC-V3A处理器, 内核采用2级流水线处理,设置了静态分支预测.指令预取机制,支持DMA. 主要参数如下 ...

  6. 沁恒CH32V003(二): Ubuntu20.04 MRS和Makefile开发环境配置

    目录 沁恒CH32V003(一): CH32V003F4P6开发板上手报告和Win10环境配置 沁恒CH32V003(二): Ubuntu20.04 MRS和Makefile开发环境配置 硬件准备 沁 ...

  7. NFC芯片选型及基本电路框架

    RFID作为一项专业度较高的技术,在一些公司,可能还会专门招聘专业的RFID工程师.本篇阐述的涉及到的只是基本选型设计.电路框架,关于RFID天线调试.低功耗检卡调试等,后续再其他篇章会继续更新! N ...

  8. 沁恒CH32V103C8T6(二): Linux RISC-V编译和烧录环境配置

    目录 沁恒CH32V103C8T6(一): 核心板焊接和Windows开发环境配置 沁恒CH32V103C8T6(二): Linux RISC-V编译和烧录环境配置 硬件准备 CH32V103 开发板 ...

  9. 爱特梅尔ATMEL全系列芯片解密单片机破解

    爱特梅尔ATMEL全系列芯片解密单片机破解 ATMEL芯片介绍: ATMEL公司为全球性的业界领先企业,致力于设计和制造各类微控制器.电容式触摸解决方案.先进逻辑.混合信号.非易失性存储器和射频 (R ...

  10. 在keil 4中添加stc系列芯片的方法--【sky原创】

    在keil 4中添加stc系列芯片的方法: 1.从官网下载uv3.cdb的文件网址是:http://www.stcmcu.com/ 2.下载好后把uv3.cdb文件改成STC.cdb:3. 然后将[S ...

随机推荐

  1. Struts中action访问不到的原因。

    因为需要在项目中构造restful的链接,action通配符使用/进行分割.但是struts默认不支持反斜杠. 所以需要在Struts.xml配置 <constant name="st ...

  2. Go素数筛选分析

    Go素数筛选分析 1. 素数筛选介绍 学习Go语言的过程中,遇到素数筛选的问题.这是一个经典的并发编程问题,是某大佬的代码,短短几行代码就实现了素数筛选.但是自己看完原理和代码后一脸懵逼(仅此几行能实 ...

  3. git clone开启云上AI开发

    摘要:相比于传统的软件开发,AI开发存在以下4个痛点:算法繁多:训练时间长:算力需求大:模型需手动管理,我们可以使用云上AI开发的方式来缓解以上4个痛点. 本文分享自华为云社区<git clon ...

  4. LeetCode------斐波那契数列(2)

    来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/fei-bo-na-qi-shu-lie-lcof 写一个函数,输入 n ,求斐波那契(Fibo ...

  5. 【MySQL】03_数据类型

    MySQL 中的数据类型 类型 类型举例 整数类型 TINYINT.SMALLINT.MEDIUMINT.INT(或INTEGER).BIGINT 浮点类型 FLOAT.DOUBLE 定点数类型 DE ...

  6. MongoDB数据库新手入门

    windows安装mongodb 5.0.2 官网下载msi文件 自定义安装到 d:/apptoools/mongodb/ 不要勾选mongodb compass 报错:verify that you ...

  7. Vue router简单配置入门案例

    { 注意驼峰命名法,不然会报错 } 1.在Views文件夹下创建Vue路由文件,例如: <template> </template>  <script> </ ...

  8. JS 学习笔记(一)常用的字符串去重方法

    要求:从输入框中输入一串字符,按回车后输出去重后的字符串 方法一: <body> <input type="text" id="input" ...

  9. C语言嵌套for循环实现冒泡排序

    使用嵌套for循环实现冒泡排序的一个函数. #include<stdio.h> /** * 介绍: * 使用嵌套for循环实现冒泡排序,由小到大(上小下大). * 参数: * sum[]: ...

  10. php 高并发

    1 swoole的博客 http://rango.swoole.com/archives/508 2 消息队列 3 接口并发请求