我是一个初学者,下面的图是我参考CH375做的一个usb的串口扩展电路,有没有完整的程序啊?小妹不胜感激~~ UploadImages/20085513445963.doc
不知道你的要求是什么,看了一下你的电路,其实并不是USB扩展串口,是MCU通过串口来操作CH375这种方式只能用在CH375做HOST的情况下,做DEVICE则只能用并口!
如果我是MCU通过串口来操作CH375对U盘进行读写,那程序该如何写呢?
关键是3个低层的读写子函数.到在线下载里搜索CH375LIB.ZIP.找到MCS51下面的FILELIB5 里面有相关例子供你参考: void CH375_PORT_INIT( ) { SCON = 0xD0; 设置串口为9位数据 设置波特率和其它串口参数 }
void xWriteCH375Cmd( UINT8 mCmd ) { TI = 0; TB8 = 1; //第9位为1说明是命令 SBUF = mCmd; while ( TI == 0 ); }
void xWriteCH375Data( UINT8 mData ) { TI = 0; TB8 = 0; //第9位为0说明是数据 SBUF = mData; while ( TI == 0 ); }
UINT8 xReadCH375Data( void ) { while ( RI == 0 ); RI = 0; return( SBUF ); } */
谢谢,非常有用!
读写子程序做了相应的修改后,主程序是否也要做相应的修改? main( ) { UINT8 i, month, hour; UINT16 date, adc, len; CH375_PORT_INIT( ); /* 由于使用通用I/O模块并口读写时序,所以进行初始化 */ LED_OUT_INIT( ); LED_OUT_ACT( ); /* 开机后LED亮一下以示工作 */ mDelay100mS( ); /* 延时100毫秒 */ LED_OUT_INACT( ); mInitSTDIO( ); /* 为了让计算机通过串口监控演示过程 */ printf( "Start\n" );
如何该为串口的呢?
串口只用来操作375就不能用来监视程序,printf( "Start\n" );就不能用了,还有mInitSTDIO( ); 要把串口初试化成9位数据!
这是我的整个简单的程序,请帮忙看看有什么问题好吗? #include #include
#define MAX_BYTE_IO 35 /* 以字节为单位单次读写文件时的最大长度,默认值是29,值大则占用内存多,值小则超过该长度必须分多次读写 */ #define LIB_CFG_FILE_IO 1 /* 文件读写的数据的复制方式,0为"外部子程序",1为"内部复制" */ #define LIB_CFG_INT_EN 0 /* CH375的INT#引脚连接方式,0为"查询方式",1为"中断方式" */ #define LIB_CFG_UPD_SIZE 1 /* 在添加数据后是否自动更新文件长度: 0为"不更新",1为"自动更新" */ #define DISK_BASE_BUF_ADDR 0x0000 /* 外部RAM的磁盘数据缓冲区的起始地址,从该单元开始的缓冲区长度为SECTOR_SIZE */ #define DISK_BASE_BUF_LEN 2048 /* 默认的磁盘数据缓冲区大小为512字节,建议选择为2048甚至4096以支持某些大扇区的U盘,为0则禁止在.H文件中定义缓冲区并由应用程序在pDISK_BASE_BUF中指定 */ #define FILE_DATA_BUF_ADDR 0x0000 /* 外部RAM的文件数据缓冲区的起始地址,缓冲区长度不小于一次读写的数据长度,字节模式不用该缓冲区 */ #define FILE_DATA_BUF_LEN 0x0800 /* 外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度,字节模式不用该缓冲区 */
#define CH375_INT_WIRE INT0 /* P3.2, INT0, CH375的中断线INT#引脚,连接CH375的INT#引脚,用于查询中断状态 */ #define NO_DEFAULT_CH375_F_ENUM 1 /* 未调用CH375FileEnumer程序故禁止以节约代码 */ #define NO_DEFAULT_CH375_F_QUERY 1 /* 未调用CH375FileQuery程序故禁止以节约代码 */ #include "..\CH375HF5.H" void CH375_PORT_INIT( ) { SCON = 0xD0; 设置串口为9位数据设置波特率和其它串口参数 { if ( iError == ERR_SUCCESS ) return; /* 操作成功 */ printf( "Error: %02X\n", (UINT16)iError ); /* 显示错误 */ while ( 1 ) { mDelay100mS( ); LED_OUT_INACT( ); mDelay100mS( ); } } /* 为printf和getkey输入输出初始化串口 */ void mInitSTDIO( ) { SCON = 0x50; PCON = 0x80; TMOD = 0x20; TH1 = 0xf3; /* 24MHz晶振, 9600bps */ TR1 = 1; TI = 1; } main( ) { UINT8 i, month, hour; UINT16 date, adc, len; CH375_PORT_INIT( ); mDelay100mS( ); /* 延时100毫秒 */ mInitSTDIO( ); #if DISK_BASE_BUF_LEN == 0 pDISK_BASE_BUF = &my_buffer[0]; /* 不在.H文件中定义CH375的专用缓冲区,而是用缓冲区指针指向其它应用程序的缓冲区便于合用以节约RAM */ #endif
i = CH375LibInit( ); /* 初始化CH375程序库和CH375芯片,操作成功返回0 */ mStopIfError( i ); while ( 1 ) { printf( "Wait Udisk\n" ); while ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt( ); /* 查询CH375中断并更新中断状态,等待U盘插入 */ mDelay100mS( ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */ mDelay100mS( ); /* 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 */ for ( i = 0; i < 5; i ++ ) { /* 有的U盘总是返回未准备好,不过可以被忽略 */ mDelay100mS( ); printf( "Ready ?\n" ); if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查询磁盘是否准备好 */ } #if DISK_BASE_BUF_LEN if ( DISK_BASE_BUF_LEN < CH375vSectorSize ) { /* 检查磁盘数据缓冲区是否足够大,CH375vSectorSize是U盘的实际扇区大小 */ printf( "Too large sector size\n" ); while ( CH375DiskConnect( ) == ERR_SUCCESS ) mDelay100mS( ); continue; } #endif /* 如果MY_ADC.TXT文件已经存在则添加数据到尾部,如果不存在则新建文件 */ printf( "Open\n" ); mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, "/MY_ADC.TXT" ); /* 文件名,该文件在根目录下 */ i = CH375FileOpen( ); /* 打开文件 */ if ( i == ERR_SUCCESS ) { /* 文件存在并且已经被打开,移动文件指针到尾部以便添加数据 */ printf( "File size = %ld\n", CH375vFileSize ); /* V1.5以上子程序库在成功打/* 如果MY_ADC.TXT文件已经存在则添加数据到尾部,如果不存在则新建文件 */ printf( "Open\n" ); mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, "/MY_ADC.TXT" ); /* 文件名,该文件在根目录下 */ i = CH375FileOpen( ); /* 打开文件 */ if ( i == ERR_SUCCESS ) { /* 文件存在并且已经被打开,移动文件指针到尾部以便添加数据 */ printf( "File size = %ld\n", CH375vFileSize ); /* V1.5以上子程序库在成功打 /* 如果MY_ADC.TXT文件已经存在则添加数据到尾部,如果不存在则新建文件 */ printf( "Open\n" ); mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, "/MY_ADC.TXT" ); /* 文件名,该文件在根目录下 */ i = CH375FileOpen( ); /* 打开文件 */ if ( i == ERR_SUCCESS ) { /* 文件存在并且已经被打开,移动文件指针到尾部以便添加数据 */ printf( "File size = %ld\n", CH375vFileSize ); printf( "Open\n" ); mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, "/MY_ADC.TXT" ); i = CH375FileOpen( ); /* 打开文件 */ if ( i == ERR_SUCCESS ) { /* 文件存在并且已经被打开,移动文件指针到尾部以便添加数据 */ printf( "File size = %ld\n", CH375vFileSize ); /* V1.5以上子程序库在成功打 printf( "Locate tail\n" ); mCmdParam.ByteLocate.mByteOffset = 0xffffffff; /* 移到文件的尾部 */ i = CH375ByteLocate( ); mStopIfError( i ); } else if ( i == ERR_MISS_FILE ) { /* 没有找到文件,必须新建文件 */
printf( "Create\n" ); mCopyCodeStringToIRAM(mCmdParam.Create.mPathName, "/MY_ADC.TXT" ) i = CH375FileCreate( ); /* 新建文件并打开,如果文件已经存在则先删除后再新建 */ mStopIfError( i ); } else mStopIfError( i ); /* 打开文件时出错 */ printf( "Close\n" ); mCmdParam.Close.mUpdateLen = 1; /* 自动计算文件长度,以字节为单位写文件,建议让程序库关闭文件以便自动更新文件长度 */ i = CH375FileClose( ); /* 关闭文件 */ mStopIfError( i ); printf( "Take out\n" ); while ( CH375DiskStatus != DISK_DISCONNECT ) xQueryInterrupt( ); /* 查询CH375中断并更新中断状态,等待U盘拔出 */ mDelay100mS( ); mDelay100mS( ); } }
编译过了吗?操作375的三个读写子函数呢?
还没编译,不好意思 读写子程序忘记放上去了!
把三个读写子函数放上去之后,你在你的主程序一上电的时候延时100MS后就进行测试命令,看下输出的数据是不是你输入数据的取反,375默认的波特率是9600,同时你可以直接利用我们的CH375LIB5下面的例子程序来进行测试
我用上面的程序进行编译,出现一个错误: File0:ERROR 129 IN LINE 765 OF CH375HF5.H:missing';'before '_at_' CH375HF5.H是公司提供的,她说在'_at_'缺了个";",我就不知道怎么办了,是否要将CH375HF5进行修改呢?
现在编译通过了,那下一步如何进行调试CH375呢?有测试工具吗?测试命令是什么?