CH376-U盘读写模块(串口)使用笔记

时间:2024-04-17 10:38:26

     最近做项目,需要把一些AD转换的数据存储在U盘上,四处寻访最终找到了CH376这个芯片。2009年12月终于在网上买到CH376模块。模块使用的是IC开发网设计的CH376模块,有兴趣的朋友可以去看看www.icdev.com.cn。价格不是很贵几十元钱。它用的CH376芯片是南京沁恒的(www.wch.cn)。

 

     经过1个月的摸索,总算调试成功了。这点要感谢“沁恒”的工程师的支持。很多问题都是他们帮助调试成功的。

    用7S64的串口驱动CH376模块,首先要对模块带的驱动文件进行修改。

(1)首先修改HAL.h 文件,屏蔽以下代码

       /* CH376芯片 硬件抽象层 V1.0 */
       /* 提供I/O接口子程序 */

      //#include <reg52.h>
        #include "CH376INC.H"

        #ifndef __CH376_HAL_H__
        #define __CH376_HAL_H__

       //#ifdef __CX51__
       //#ifndef __C51__
       //#define __C51__  1
       //#endif
       //#endif
       //
       //#ifdef __C51__
       //#define BIG_ENDIAN  1
       //#endif
       //#ifdef __C51__
       //#pragma NOAREGS
       //#endif

 (2)修改UART_HW.C串口驱动文件

#include "HAL.H"
#include "stdio.h"
#include "CH376INC.H"

#include "UART/Serial.h"    在这里加入AT91SAM7S64串口通信代码,后面会给出代码全文

 

void CH376_PORT_INIT( void )  /* 由于使用异步串口读写时序,所以进行初始化 */
{
//*屏蔽这里所有的代码*/

}

 

修改CH376写命令、数据写入、数据读写命令

void xWriteCH376Cmd( UINT8 mCmd )  /* 向CH376写命令 */
{
    Uart0WriteData(SER_SYNC_CODE1);/* 启动操作的第1个串口同步码 */
    Uart0WriteData(SER_SYNC_CODE2);/* 启动操作的第2个串口同步码 */
    Uart0WriteData(mCmd);        /* 串口输出 */

}

 

void xWriteCH376Data( UINT8 mData )  /* 向CH376写数据 */
{
 Uart0WriteData(mData);
}

 

UINT8 xReadCH376Data( void )  /* 从CH376读数据 */
{

    return(Uart0ReadData()); 
}

 

/* 查询CH376中断(INT#低电平) */
UINT8 Query376Interrupt( void )
{
 UINT8 res;
 xWriteCH376Cmd( CMD_GET_STATUS );  /* 测试单片机与CH376之间的通讯接口 */   
 res = xReadCH376Data( );  
 return(res);
}

 

UINT8 mInitCH376Host( void )  /* 初始化CH376 */
{
 UINT8 res;
 CH376_PORT_INIT( );  /* 接口硬件初始化 */
 xWriteCH376Cmd( CMD11_CHECK_EXIST );  /* 测试单片机与CH376之间的通讯接口 */
 xWriteCH376Data( 0x65 );
 res = xReadCH376Data( );
 if ( res != 0x9A )
 {
   printf("/nmInitCH376Host:USB MODULE CONNECTION FAILED/n");
   return( ERR_USB_UNKNOWN );
 }
 else
 {
   printf("/nmInitCH376Host: USB MODULE CONNECTION SUCCESS/n");
   return( USB_INT_SUCCESS );
 } 

}

 

修改完成后,就可以使用改模块了。

下面给出Serial.c Serial.h源程序供也在使用AT91SAM7S64的朋友一起参考交流。

 

/*******************************************************/

初始化串口0

void Init_UART0 (void) {                   /* Initialize Serial Interface */
  *AT91C_PMC_PCER|=(1 << AT91C_ID_US0);
  *AT91C_PIOA_PDR|= AT91C_PA5_RXD0|        /* Enable RxD0 Pin */
                    AT91C_PA6_TXD0;        /* Enalbe TxD0 Pin */

  index0=0;
  pUSART0->US_CR = AT91C_US_RSTRX |          /* Reset Receiver      */
                  AT91C_US_RSTTX |          /* Reset Transmitter   */
                  AT91C_US_RXDIS |          /* Receiver Disable    */
                  AT91C_US_TXDIS;           /* Transmitter Disable */

  pUSART0->US_MR = AT91C_US_USMODE_NORMAL |  /* Normal Mode */
                  AT91C_US_CLKS_CLOCK    |  /* Clock = MCK */
                  AT91C_US_CHRL_8_BITS   |  /* 8-bit Data  */
                  AT91C_US_PAR_NONE      |  /* No Parity   */
                  AT91C_US_NBSTOP_1_BIT;    /* 1 Stop Bit  */

  pUSART0->US_BRGR = BRD_USB;                    /* Baud Rate Divisor */

  pUSART0->US_CR = AT91C_US_RXEN  |          /* Receiver Enable     */
                  AT91C_US_TXEN;            /* Transmitter Enable  */


}

 

/******USB 模块通信用**********/
void Uart0WriteData (unsigned char data)  {                    /* Write character to Serial Port */
                        
  while (!(pUSART0->US_CSR & AT91C_US_TXRDY));   /* Wait for Empty Tx Buffer */
  pUSART0->US_THR = data;
}

unsigned char Uart0ReadData (void)  {                        /* Read character from Serial Port */ 
   while (!(pUSART0->US_CSR & AT91C_US_RXRDY)){  }
    return (pUSART0->US_RHR);                      /* Read Character */
}

unsigned int Uart0_IsRxReady(void)
{
    //return (AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_RXRDY);
 return (pUSART0->US_CSR & AT91C_US_RXRDY);
}
/******USB 模块通信用**********/

 

整个CH376在AT91SAM7S64上的使用就到此为止。 目前使用下列感觉还可以。

呵呵。