最近做项目,需要把一些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上的使用就到此为止。 目前使用下列感觉还可以。
呵呵。