精华内容
下载资源
问答
  • C语言下STM32F103RCT6通过CH376S读写CSV文件
  •  CH376 是文件管理控制芯片,用于单片机系统读写U 盘或者SD 卡中的文件。  CH376 支持USB 设备方式和USB 主机方式,并且内置了USB 通讯协议的基本固件,内置了处理Mass-Storage海量存储设备的专用通讯协议的固件...
  • 使用STM32F103C8T6主控芯片通过CH376芯片实现对U盘文件读取操作,扩展功能可以利用提供的中文数据手册进行添加,比如创建文件,将内容写入文件,删除文件等,数据手册内容详细
  • STM32挂载CH376读写U盘例程,SPI模式,速度比FSMC要慢 STM32挂载CH376读写U盘例程,SPI模式,速度比FSMC要慢
  • CH376CH376资料

    2020-08-13 15:45:24
    CH376CH376资料
  • CH376原理图、封装库,Protel、Altium 可用,可用连接单片机读写U盘,存储数据 测试可用的,有需要的来
  • CH376_串口收发测试.zip

    2019-11-01 16:00:19
    STM32F103ZET6通过CH376实现对U盘文件的读写,实现平台keil5.
  • CH376_ch376_源码

    2021-09-30 16:46:23
    单片机u盘读写代码 CH376核心芯片 读写时序 生成TXT文件
  • 基于STM32F407的CH376 U盘模块串口实现。采用USART6,可以自行更改串口
  • CH376 是文件管理控制芯片,用于单片机系统读写U 盘或者SD 卡中的文件。CH376 支持USB 设备方式和USB 主机方式,并且内置了USB 通讯协议的基本固件,内置了处理Mass-Storage海量存储设备的专用通讯协议的固件,内置...
  • stm32控制ch376s例程

    2018-11-16 09:06:05
    stm32以串口方式控制ch376s程序例程。ch376s官方程序文档
  • CH376EVT.PDF

    2020-07-27 15:50:42
    CH376支持USB设备方式和USB主机方式,并且内置了USB通讯协议的基本固件,内置了处理Mass-Storage海量存储设备的专用通讯协议的固件,内置了SD卡的通讯接口固件,内置了FAT16和FAT32以及FAT12文件系统的管理固件,...
  • CH376 的开发程序,采用串口开发。能够对优盘进行操作
  • 完整的工程代码。利用CH376芯片电路,升级stm32程序,代码已通过验证。
  • CH376MSC:用于CH376大容量存储控制器的Arduino库
  • 基于STM32F103ZET的U盘读写,使用CH376模块,通过SPI2进行通信
  • STM32F103V CH376实现 SD卡、U盘、鼠标键盘操作,源码有详细描述。
  • CH376S读写USB的C51代码

    2019-02-02 17:11:09
    CH376S读写USB的C51代码,包含文档的代码,有详细的注释
  • 基于STM32F103进行TF卡读写操作,通过SPI与CH376 TF卡读写模块进行通信
  • CH376评估板说明及单片机使用U盘和SD卡移动存储的应用参考 单片机通过CH376读写U盘和SD卡中的文件或控制其它USB设备
  • 关于CH376的一些使用总结 一、背景简介: CH376是一款USB接口芯片,可以使用SPI接口或串口或并口扩展一个通用USB接口出来。 二、芯片特点: 1.该芯片内置了一个文件管理系统,可以方便操作FAT12、FAT16、FAT...

    关于CH376的一些使用总结

    一、背景简介:

           CH376是一款USB接口芯片,可以使用SPI接口或串口或并口扩展一个通用USB接口出来。

    二、芯片特点:

          1.该芯片内置了一个文件管理系统,可以方便操作FAT12、FAT16、FAT32文件系统的存储设备、比如大部分的U盘和SD卡。

          2.提供了SPI、串口、并口等常用接口,方便大部分情况下的使用。

          3.提供了USB接口和SPI主机口,可以操作U盘或者SD卡。

    三、电路设计:

          在进行电路设计之前需要确定两件事,芯片的供电电压、芯片使用的接口。供电不同、接口不同电路就不同。

          1.供电,VCC=5V供电时,V3引脚需要连接一个0.01uF的电容接到GND。

                        VCC=3.3V供电时,V3引脚要和VCC引脚连接在一起。

          2.接口,芯片的接口选择是根据上电时WR#、RD#、PCS#、A0、RXT、TXD的引脚状态决定。

          3.USB接口,USB接口部分需要连接一个大点的电容(几十uF)接到GND。

          4.晶振部分,在XI引脚内部内置了一个电容,所以只需要在XO引脚添加电容即可。

     

    四、程序设计:

         官方有提供很多基于51单片机的例程,包括U盘,做各种常用设备和主机的参考代码,可以在提供的例程基础上做一个移植。参考例程大都是基于这四个函数使用的,xWriteCH376Cmd(),xWriteCH376Data(),xReadCH376Data(),Query376Interrupt(  ),所以只要把自己的硬件接口与这些函数对应即可。

          1.接口函数调试方法:

             接口函数调试的核心思想就是,将输出的波形调成满足手册需求的波形。

             测试的方式也很简单,CH376有一个取反命令,可以将输入的数据按位取反再返回,如果返回的数据正确取反,那么就可以确认接口三个接口函数是正确的(无法测试中断函数是否正确)。

          2.接口函数举例:使用STM32单片机IO口模拟SPI接口,控制CH376。

    /*======CH376T  IO定义======*/
    #define		CH376T_SDI_HIGH				GPIO_SetBits(GPIOB, GPIO_Pin_15)	//CH376T SDI
    #define		CH376T_SDI_LOW				GPIO_ResetBits(GPIOB, GPIO_Pin_15)
    #define		CH376T_SDO_HIGH				GPIO_SetBits(GPIOB, GPIO_Pin_14)	//CH376T SDO
    #define		CH376T_SDO_LOW				GPIO_ResetBits(GPIOB, GPIO_Pin_14)
    #define		CH376T_SCK_HIGH				GPIO_SetBits(GPIOB, GPIO_Pin_13)	//CH376T 时钟SCK
    #define		CH376T_SCK_LOW				GPIO_ResetBits(GPIOB, GPIO_Pin_13)
    #define		CH376T_CS_HIGH				GPIO_SetBits(GPIOB, GPIO_Pin_12)	//CH376T 片选CS
    #define		CH376T_CS_LOW				GPIO_ResetBits(GPIOB, GPIO_Pin_12)	
    #define		CH376T_RST_HIGH				GPIO_SetBits(GPIOB, GPIO_Pin_11)	//CH376T 复位RST
    #define		CH376T_RST_LOW				GPIO_ResetBits(GPIOB, GPIO_Pin_11)	
    #define		CH376_INT_WIRE		     	GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_10) //中断 INT
    
    /**************************************************************************************************
    ** 函数名称: Spi376OutByte
    ** 功能描述: 模拟SPI输出8位数据
    ** 输   入: d-SPI发送的数据
    ** 输   出: 无
    *******************************************************************************************************/
    void	Spi376OutByte( UINT8 d ) 
    {
    	UINT8	i;
    	for ( i = 0; i < 8; i ++ ) {
    		CH376T_SCK_LOW;        //CH376_SPI_SCK = 0;
    		if ( d & 0x80 ) 
    		{
    			CH376T_SDI_HIGH;   //CH376_SPI_SDI = 1;
    		}	
    		else CH376T_SDI_LOW;   //CH376_SPI_SDI = 0;
    		d <<= 1;               /* 数据位是高位在前 */
    		CH376T_SCK_HIGH;       //CH376_SPI_SCK = 1;  /* CH376在时钟上升沿采样输入 */
    	}
    }
    
    /**************************************************************************************************
    ** 函数名称: Spi376InByte
    ** 功能描述: 模拟SPI输入8位数据
    ** 输   入: 无
    ** 输   出: SPI接收的数据
    *******************************************************************************************************/
    UINT8	Spi376InByte( void )
    {
    	UINT8	i, d;
    	d = 0;
    	for ( i = 0; i < 8; i ++ ) {
    		CH376T_SCK_LOW;          //CH376_SPI_SCK = 0;  /* CH376在时钟下降沿输出 */
    		d <<= 1;                 /* 数据位是高位在前 */
    		if ( GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14) ) d ++;
    		CH376T_SCK_HIGH;         //CH376_SPI_SCK = 1;
    	}
    	return( d );
    }
    
    /* SPI片选无效,结束CH376命令,仅用于SPI接口方式 */
    void	xEndCH376Cmd( void )	
    { 
        CH376T_CS_HIGH; 
    }
    
    /**************************************************************************************************
    ** 函数名称: xWriteCH376Cmd
    ** 功能描述: 向CH376写命令操作
    ** 输   入: mCmd-发送的命令
    ** 输   出: 无
    *******************************************************************************************************/
    void	xWriteCH376Cmd( UINT8 mCmd )  /*  */
    {
    	mDelay0_5uS( );
    	CH376T_CS_LOW;           //CH376_SPI_SCS = 0;  /* SPI片选有效 */
    	Spi376OutByte( mCmd );   /* 发出命令码 */
    	mDelay0_5uS( ); mDelay0_5uS( ); mDelay0_5uS( );  /* 延时1.5uS确保读写周期大于1.5uS,或者用上面一行的状态查询代替 */
    }
    
    /**************************************************************************************************
    ** 函数名称: xWriteCH376Data
    ** 功能描述: 向CH376写数据操作
    ** 输   入: mData-发送的数据
    ** 输   出: 无
    *******************************************************************************************************/
    void	xWriteCH376Data( UINT8 mData )  /* 向CH376写数据 */
    {
    	Spi376OutByte( mData );
    	mDelay0_5uS( );  /* 确保读写周期大于0.6uS */
    }
    
    /**************************************************************************************************
    ** 函数名称: xReadCH376Data
    ** 功能描述: 读取CH376的数据
    ** 输   入: 无
    ** 输   出: CH376返回的数据
    *******************************************************************************************************/
    UINT8	xReadCH376Data( void )  /* 从CH376读数据 */
    {
    	UINT8 s;
    	mDelay0_5uS( );  /* 确保读写周期大于0.6uS */
    	CH376T_CS_LOW;
    	s  = Spi376InByte();
    	mDelay0_5uS();
    	return( s );
    }
    
    /* 查询CH376中断(INT#低电平) */
    UINT8	Query376Interrupt( void )
    {
    #ifdef	CH376_INT_WIRE
    	return( CH376_INT_WIRE ? FALSE : TRUE );  /* 如果连接了CH376的中断引脚则直接查询中断引脚 */
    #else
    	return( CH376_SPI_SDO ? FALSE : TRUE );  /* 如果未连接CH376的中断引脚则查询兼做中断输出的SDO引脚状态 */
    #endif
    }

      

     

    展开全文
  • 使用Stm32f103系列芯片,为了做一个USB采集设备,使用了CH376S为host接入从设备,入键盘,鼠标,扫描枪等...
  • C21282_CH376T_2014-02-28.PDF

    2020-05-11 15:46:37
    驱动器/接收器数:- 协议类别:USB 2.0 类型 Transceiver 电源电压 3.3V, 5V 数据速率 12Mbps
  • 适合学习 FPGA 并口 CH376 Verilog中文注释 以及中文数据手册
  • 该项目通过STM32芯片的SPI接口操作CH376芯片制作一个鼠标 一、硬件准备: 一个正点原子的STM32F103的评估板:作为一个主控芯片使用。 一个CH376评估板:USB接口芯片,用来连接电脑作为鼠标。 一个CH340串口调试...

    该项目通过STM32芯片的IO口模拟SPI接口操作CH376芯片完成对U盘的读写操作。

    CH376芯片内置了文件管理系统,可以通过简洁的命令操作U盘,完成读写文件等各种常规的U盘操作,用户不需要考虑FAT文件系统的底层知识,只需要使用基本的命令就行。官方提供了大量的函数,如果只是对U盘进行基本的操作的话,可以直接使用各种函数,不需要详细解读手册。

    目录

    一、硬件准备:

    二、资料准备:

    三、code

    四、硬件连接


    一、硬件准备:

    STM32F103:作为一个主控芯片使用。

    CH376:接口芯片,用来控制U盘完成文件读写操作。

    CH340:监控鼠标的传输过程。

    若干杜邦线,以及U盘等等基本

    二、资料准备:

    软件参考沁恒提供的例程:http://www.wch.cn/downloads/CH376EVT_ZIP.html

    手册参考:http://www.wch.cn/downloads/CH376DS1_PDF.html

                      http://www.wch.cn/downloads/CH376DS2_PDF.html

    三、code

    1.进入官网,下载好EVT压缩包并且解压。

    文件从上到下依次是:

    .EXAM:操作U盘的各种例程。

    .CH376DBG.EXE:上位机的串口操作CH376的软件,可以通过串口调试工具,通过该软件读写文件。可以用来检查使用CH376串口接口时的硬件是否完整。

    .CH376EVT.PDF:CH376资料的一个说明。包括对EXAM里面资料的一个简要说明。

    .CH376SCH.PDF:CH376评估板的一个原理图。

    .CH376编程指南.PDF:讲解如何移植代码等等。

    2.找一个STM32的基本工程,随便一个都可以。

    如下图,这里我们找一个UART的例程。创建好CH376的文件夹,将相应的文件放进去。

    为什么是上面这些文件,是因为在后面移植代码时,发现都需要包含这些文件。例如打开一个EXAM7例程的参考文件“CH376HFT.C”。发现这个例程中会包含这些文件。

    /* C51   CH376HFT.C */
    /* LX51  CH376HFT.OBJ */
    /* OHX51 CH376HFT */
    
    #include <reg52.h>
    #include <stdio.h>
    #include <string.h>
    
    #include "..\HAL.H"
    #include "..\HAL_BASE.C"
    #include "..\DEBUG.H"
    #include "..\DEBUG.C"
    #include "..\PARA_HW.C"		/* 硬件总线并口连接方式 */
    //#include "..\PARA_SW.C"		/* 软件模拟并口连接方式 */
    //#include "..\SPI_HW.C"		/* 硬件SPI连接方式 */
    //#include "..\SPI_SW.C"		/* 软件模拟SPI方式 */
    //#include "..\UART_HW.C"		/* 硬件异步串口连接方式 */
    #define		EN_DISK_QUERY		1	/* 启用磁盘查询 */
    #include "..\FILE_SYS.H"
    #include "..\FILE_SYS.C"
    
    UINT8		idata	buf[64];
    
    main( ) {
    }
    

    打开工程,将这些文件添加至工程里面,加好文件路径。

    然后在主函数里面添加例程例程里面的代码。

    主要是移植好接口函数,以及中断函数,所有的函数都是基于“xWriteCH376Cmd” “xWriteCH376Data” “xReadCH376Data” “Query376Interrupt”这几个函数实现的。所以在移植代码时,理论上只需要调通这几个代码即可
     

    /* SPI片选无效,结束CH376命令,仅用于SPI接口方式 */
    void	xEndCH376Cmd( void )	
    { 
        CH376T_CS_HIGH; 
    }
    
    /**************************************************************************************************
    ** 函数名称: xWriteCH376Cmd
    ** 功能描述: 向CH376写命令操作
    ** 输   入: mCmd-发送的命令
    ** 输   出: 无
    *******************************************************************************************************/
    void	xWriteCH376Cmd( UINT8 mCmd )  /*  */
    {
    //	CH376T_CS_HIGH;
    	mDelay0_5uS( );
    	CH376T_CS_LOW;           //CH376_SPI_SCS = 0;  /* SPI片选有效 */
    	Spi376OutByte( mCmd );   /* 发出命令码 */
    	mDelay0_5uS( ); mDelay0_5uS( ); mDelay0_5uS( );  /* 延时1.5uS确保读写周期大于1.5uS,或者用上面一行的状态查询代替 */
    }
    
    /**************************************************************************************************
    ** 函数名称: xWriteCH376Data
    ** 功能描述: 向CH376写数据操作
    ** 输   入: mData-发送的数据
    ** 输   出: 无
    *******************************************************************************************************/
    void	xWriteCH376Data( UINT8 mData )  /* 向CH376写数据 */
    {
    	Spi376OutByte( mData );
    	mDelay0_5uS( );  /* 确保读写周期大于0.6uS */
    }
    
    /**************************************************************************************************
    ** 函数名称: xReadCH376Data
    ** 功能描述: 读取CH376的数据
    ** 输   入: 无
    ** 输   出: CH376返回的数据
    *******************************************************************************************************/
    UINT8	xReadCH376Data( void )  /* 从CH376读数据 */
    {
    	UINT8 s;
    	mDelay0_5uS( );  /* 确保读写周期大于0.6uS */
    	CH376T_CS_LOW;
    	s  = Spi376InByte();
    	mDelay0_5uS();
    	return( s );
    }
    
    /* 查询CH376中断(INT#低电平) */
    UINT8	Query376Interrupt( void )
    {
    #ifdef	CH376_INT_WIRE
    	return( CH376_INT_WIRE ? FALSE : TRUE );  /* 如果连接了CH376的中断引脚则直接查询中断引脚 */
    #else
    	return( CH376_SPI_SDO ? FALSE : TRUE );  /* 如果未连接CH376的中断引脚则查询兼做中断输出的SDO引脚状态 */
    #endif
    }

    Spi376OutByte函数是使用SPI输出一个字节的数据。

    Spi376InByte函数是使用SPI读取一个字节的数据。

    因为是模拟的SPI主机所以就是IO口直接拉的电平。

    /**************************************************************************************************
    ** 函数名称: Spi376OutByte
    ** 功能描述: 模拟SPI输出8位数据
    ** 输   入: d-SPI发送的数据
    ** 输   出: 无
    *******************************************************************************************************/
    void	Spi376OutByte( UINT8 d ) 
    {
    	UINT8	i;
    	for ( i = 0; i < 8; i ++ ) {
    		CH376T_SCK_LOW;        //CH376_SPI_SCK = 0;
    		if ( d & 0x80 ) 
    		{
    			CH376T_SDI_HIGH;   //CH376_SPI_SDI = 1;
    		}	
    		else CH376T_SDI_LOW;   //CH376_SPI_SDI = 0;
    		d <<= 1;               /* 数据位是高位在前 */
    		CH376T_SCK_HIGH;       //CH376_SPI_SCK = 1;  /* CH376在时钟上升沿采样输入 */
    	
    	}
    }
    
    /**************************************************************************************************
    ** 函数名称: Spi376InByte
    ** 功能描述: 模拟SPI输入8位数据
    ** 输   入: 无
    ** 输   出: SPI接收的数据
    *******************************************************************************************************/
    UINT8	Spi376InByte( void )
    {
    	UINT8	i, d;
    	d = 0;
    	for ( i = 0; i < 8; i ++ ) {
    		CH376T_SCK_LOW;          //CH376_SPI_SCK = 0;  /* CH376在时钟下降沿输出 */
    		d <<= 1;                 /* 数据位是高位在前 */
    		if ( GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14) ) d ++;
    //		delay_us(2);
    		CH376T_SCK_HIGH;         //CH376_SPI_SCK = 1;
    //		delay_us(2);
    	}
    	return( d );
    }

     

    主函数里面的代码如下,功能是,向U盘创建一个“ABC.TXT”的文件,并写入“hello world!!”。

    #include "delay.h"
    #include "sys.h"
    #include "usart.h"
    #include "HAL.H"
    #include "FILE_SYS.H"
    
    UINT8	TEST_BUFF[] =
    {
    	"hello world!!"
    };
    /**************************************************************************************************
    ** 函数名称: mStopIfError
    ** 功能描述: 检查函数是否操作成功,返回值为USB_INT_SUCCESS则操作成功,其他值则操作失败
    ** 输   入: iError-需要检查的参数
    ** 输   出: 无
    *******************************************************************************************************/
    void	mStopIfError( UINT8 iError )
    {
        if ( iError == USB_INT_SUCCESS ) return;  /* 操作成功 */
        printf( "Error: %02X\n", (UINT16)iError );  /* 显示错误 */
        while ( 1 ) {
            ;
        }
    }
    int main(void)
    {		
    	UINT8 s;
    	delay_init();	    	 //延时函数初始化
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    	uart_init(115200);	 //串口初始化为115200
    	printf("CH376_UDisk_TEST\r\n");
    
    	while ( 1 ) 
    	{
    		printf( "Wait Udisk/SD\n" );
    		while ( CH376DiskConnect( ) != USB_INT_SUCCESS ) /* 检查U盘是否连接,等待U盘插入,对于SD卡,可以由单片机直接查询SD卡座的插拔状态引脚 */
    		{  
    			mDelaymS( 100 );
    		}
    		mDelaymS( 200 );  /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */
    
    		/* 对于检测到USB设备的,最多等待10*50mS */
    		for ( s = 0; s < 10; s ++ ) 
    		{ 
    			mDelaymS( 50 );
    			printf( "Ready ?\n" );
    			if ( CH376DiskMount( ) == USB_INT_SUCCESS ) break;  /* 初始化磁盘并测试磁盘是否就绪 */
    		}
    		
            s = CH376FileCreate("/ABC.TXT");
    		mStopIfError( s );
    		CH376ByteWrite( TEST_BUFF, sizeof(TEST_BUFF), NULL );
    		s = CH376FileClose( TRUE );
    		mStopIfError( s );
    
    		printf( "Take out\n" );
    		while ( CH376DiskConnect( ) == USB_INT_SUCCESS ) {  /* 检查U盘是否连接,等待U盘拔出 */
    			mDelaymS( 100 );
    		}
    		mDelaymS( 200 );
    	}	 
    }
    
    	

    到此代码部分调试完成,剩下就是连接好硬件部分,进行测试。

    四、硬件连接

    使用的是SPI接口时需要注意,SPI的MOSI对应的CH376的SDI,MISO对应的SDO。

    在芯片主控上面对应是

            PB10                 INT
            PB12                 SCS
            PB13                 SCK 
            PB14                 SDO
            PB15                 SDI

     

    展开全文
  • CH376开发板资料.zip

    2019-11-01 16:02:27
    本人淘宝购买的CH376开发板资料,里面有原理图,调试工具,和驱动代码。
  • STM32F107VC SPI口驱动CH376实现扫码枪数据获取。
  • CH376是文件管理控制芯片,用于单片机系统读写U盘或者SD卡中的文件。 CH376支持USB设备方式和USB主机方式,并且内置了USB通讯协议的基本固件,内置了处理 Mass-Storage海量存储设备的专用通讯协议的固件,内置了SD...
  • STM32F103 CH376 USB读写 实例代码,通过通讯方式驱动CH376来实现USB的读写

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,569
精华内容 1,427
关键字:

ch376