如何链接CH375文件系统库-CH375HFx.LIB!!(图片)

hcn你好,CH375LIB.ZIP里没有AVR的串口模式例程吧


用的是gcc,按照上面的说法在AVR Studio里面的库里增加了CH375HFB.A,编译后出现错误提示: d:\WinAVR\bin\..\lib\gcc\avr\3.4.6\..\..\..\..\avr\bin\ld.exe: cannot find -lCH375HFB 不知什么原因?


(1)TO wuchuan:参考\CH375LIB\MCS51\FILELIB5\EXAM7修改3个读写子程序 (2)TO heibai:你的库文件选错了,应是:libCH375HFD.A,参考示例:UploadImages/200810271232182.rar


SCM谢谢了。我试试吧!感谢!


现在更改为庫文件libCH375HFD.A后可以了,谢谢


你好,我用128下载了你们的并口示例程序,想改成串口,按照你们的提示修改了三个读写子函数,编译通过,但试验过不去,现在我把程序贴上,您给看看是哪里的问题,是不是串口初始化错误,应该还要做哪些改动,请帮忙。谢谢。 /* 2004.06.05 **************************************** ** Copyright (C) W.ch 1999-2004 ** ** Web: http://www.winchiphead.com ** **************************************** ** USB Host File Interface for CH375 ** ** TC2.0@PC, ICCAVR_6.31@AVR ** **************************************** */ /* CH375 主机文件系统接口 */ /* 支持: FAT12/FAT16/FAT32 */

/* AVR单片机C语言的U盘文件读写示例程序 */ /* 该程序将U盘中的/C51/CH375HFT.C文件中的前600个字符显示出来, 如果找不到原文件CH375HFT.C, 那么该程序将显示C51子目录下所有以CH375开头的文件名, 如果找不到C51子目录, 那么该程序将显示根目录下的所有文件名, 最后将程序ROM中的一个字符串写入写入新建的文件"NEWFILE.TXT"中 */ /* CH375的INT#引脚采用查询方式处理, 数据复制方式为"内部复制", 本程序适用于ATmega128单片机, 串口0输出监控信息,9600bps */ /* 本例以字节为单位读写U盘文件,读写速度较扇区模式慢,但是由于字节模式读写文件不需要文件数据缓冲区FILE_DATA_BUF, 所以总共只需要600字节的RAM,适用于单片机硬件资源有限、数据量小并且读写速度要求不高的系统 */

/* ICCAVR -v -Wp -I\ICC\INCLUDE -Wf -Mavr_enhanced -Wl -L\ICC\LIB -m -bfunc_lit:0x8C.0x20000 -bdata:0x0100.0x0FFF -dram_end:0x0FFF -dhwstk_size:40 -ucrtatmega.o CH375HFB.C CH375HFB.A */

#include #include #include

/* 以下定义的详细说明请看CH375HF9.H文件 */ #define LIB_CFG_FILE_IO 1 /* 文件读写的数据的复制方式,0为"外部子程序",1为"内部复制" */ #define LIB_CFG_INT_EN 0 /* CH375的INT#引脚连接方式,0为"查询方式",1为"中断方式" */

/* 单片机的RAM有限,其中CH375子程序用512字节,剩余RAM部分可以用于文件读写缓冲 */ #define DISK_BASE_BUF_LEN 2048 /* 默认的磁盘数据缓冲区大小为512字节,建议选择为2048甚至4096以支持某些大扇区的U盘,为0则禁止在.H文件中定义缓冲区并由应用程序在pDISK_BASE_BUF中指定 */ #define FILE_DATA_BUF_LEN 0x0200 /* 外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度 */

#define CH375_INT_WIRE ( PINB & 0x10 ) /* PINB.4, CH375的中断线INT#引脚,连接CH375的INT#引脚,用于查询中断状态 */

#define NO_DEFAULT_CH375_F_ENUM 1 /* 未调用CH375FileEnumer程序故禁止以节约代码 */ #define NO_DEFAULT_CH375_F_QUERY 1 /* 未调用CH375FileQuery程序故禁止以节约代码 */

#include "CH375HFB.H"

/* 有些AVR单片机提供开放系统总线,那么直接将CH375挂在其系统总线上,以8位I/O方式进行读写 */ /* 虽然Atmega128提供系统总线,不过本例假定不开放系统总线,所以用I/O引脚模拟产生CH375的并口读写时序 */ /* 本例中的硬件连接方式如下(实际应用电路可以参照修改下述3个并口读写子程序) */ /* 单片机的引脚 CH375芯片的引脚 PINB.4 INT# PORTB.3 A0 PORTB.2 CS# PORTB.1 WR# PORTB.0 RD# PORTA(8位端口) D7-D0 */

void mDelay1uS( ) /* 至少延时1uS,根据单片机主频调整 */ { UINT8 i; for ( i = 5; i != 0; i -- ); }

void CH375_PORT_INIT( ) /* 由于使用通用I/O模块并口读写时序,所以进行初始化 */ { DDRA = 0x00; /* 设置8位并口为输入 */ PORTB = 0x07; /* 设置CS,WR,RD默认为高电平 */ DDRB = 0x0F; /* 设置CS,WR,RD,A0为输出,设置INT#为输入 */ }

void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定义的被CH375程序库调用的子程序,向CH375写命令 */ { while(!(UCSR0A&(1<UCSR0B&=~(1<if(mCmd&0x0100) UCSR0B|=(1<UDR0=mCmd; } void xWriteCH375Data( UINT8 mData ) /* 外部定义的被CH375程序库调用的子程序,向CH375写数据 */ { while(!(UCSR0A&(1<UCSR0B&=~(1<if(!(mData&0x0100)) UCSR0B&=~(1<UDR0=mData;

} UINT8 xReadCH375Data( void ) /* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */ { unsigned char status,resh,resl; while(!(UCSR0A&(1<status=UCSR0A; resh=UCSR0B; resl=UDR0; if(status&(1<return -1; resh=(resh>>1)&0x01; return((resh<<8)|resl);

}

/* 在P0.2连接一个LED用于监控演示程序的进度,低电平LED亮 */ #define LED_OUT_INIT( ) { PORTB |= 0x80; DDRB |= 0x80; } /* PORTB.7 高电平为输出方向 */ #define LED_OUT_ACT( ) { PORTB &= 0x7F; } /* PORTB.7 低电平驱动LED显示 */ #define LED_OUT_INACT( ) { PORTB |= 0x80; } /* PORTB.7 低电平驱动LED显示 */

/* 延时指定毫秒时间,根据单片机主频调整,不精确 */ void mDelaymS( UINT8 ms ) { UINT16 i; while ( ms -- ) for ( i = 2600; i != 0; i -- ); }

/* 检查操作状态,如果错误则显示错误代码并停机 */ void mStopIfError( UINT8 iError ) { if ( iError == ERR_SUCCESS ) return; /* 操作成功 */ printf( "Error: %02X\n", (UINT16)iError ); /* 显示错误 */ while ( 1 ) { LED_OUT_ACT( ); /* LED闪烁 */ mDelaymS( 100 ); LED_OUT_INACT( ); mDelaymS( 100 ); } }

/* 为printf和getkey输入输出初始化串口 */ extern int _textmode; void mInitSTDIO( ) { UBRR0H = 0; UBRR0L = 103; /* 9600bps@16MHz */ UCSR0B = 0x18; /* BIT(RXEN) | BIT(TXEN); */ UCSR0C = 0x06; /* BIT(UCSZ1) | BIT(UCSZ0); */ _textmode = 1; }

void main( ) { UINT8 i, c; UINT16 TotalCount; UINT8 *pCodeStr; CH375_PORT_INIT( ); LED_OUT_INIT( ); LED_OUT_ACT( ); /* 开机后LED亮一下以示工作 */ mDelaymS( 100 ); /* 延时100毫秒 */ LED_OUT_INACT( ); mInitSTDIO( ); /* 为了让计算机通过串口监控演示过程 */ printf( "Start\n" );

#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盘插入 */ LED_OUT_ACT( ); /* LED亮 */ mDelaymS( 200 ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */

/* 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 */ for ( i = 0; i < 10; i ++ ) { /* 有的U盘总是返回未准备好,不过可以被忽略 */ mDelaymS( 100 ); 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 ) mDelaymS( 100 ); continue; } #endif /* 查询磁盘物理容量 */ /* printf( "DiskSize\n" ); i = CH375DiskSize( ); mStopIfError( i ); printf( "TotalSize = %u MB \n", (unsigned int)( mCmdParam.DiskSize.mDiskSizeSec * (CH375vSectorSize/512) / 2048 ) ); // 显示为以MB为单位的容量 // 原计算方法 (unsigned int)( mCmdParam.DiskSize.mDiskSizeSec * CH375vSectorSize / 1000000 ) 有可能前两个数据相乘后导致溢出, 所以修改成上式 */

/* 读取原文件 */ printf( "Open\n" ); strcpy( (char *)mCmdParam.Open.mPathName, "/C51/CH375HFT.C" ); /* 文件名,该文件在C51子目录下 */ i = CH375FileOpen( ); /* 打开文件 */ if ( i == ERR_MISS_DIR || i == ERR_MISS_FILE ) { /* 没有找到文件 */ /* 列出文件 */ if ( i == ERR_MISS_DIR ) pCodeStr = (UINT8 *)"/*"; /* C51子目录不存在则列出根目录下的文件 */ else pCodeStr = (UINT8 *)"/C51/CH375*"; /* CH375HFT.C文件不存在则列出\C51子目录下的以CH375开头的文件 */ printf( "List file %s\n", pCodeStr ); for ( c = 0; c < 254; c ++ ) { /* 最多搜索前254个文件 */ strcpy( (char *)mCmdParam.Open.mPathName, (char *)pCodeStr ); /* 搜索文件名,*为通配符,适用于所有文件或者子目录 */ i = strlen( (char *)mCmdParam.Open.mPathName ); /* 计算文件名长度,以处理文件名结束符 */ mCmdParam.Open.mPathName[ i ] = c; /* 根据字符串长度将结束符替换为搜索的序号,从0到255 */ i = CH375FileOpen( ); /* 打开文件,如果文件名中含有通配符*,则为搜索文件而不打开 */ if ( i == ERR_MISS_FILE ) break; /* 再也搜索不到匹配的文件,已经没有匹配的文件名 */ if ( i == ERR_FOUND_NAME ) { /* 搜索到与通配符相匹配的文件名,文件名及其完整路径在命令缓冲区中 */ printf( " match file %03d#: %s\n", (unsigned int)c, mCmdParam.Open.mPathName ); /* 显示序号和搜索到的匹配文件名或者子目录名 */ continue; /* 继续搜索下


贴的都是下载的示例程序,我只修改了三个读写子函数


(1)试验过不去?哪步出错,返回值是多少? 在CH375LibInit之前先做测试命令,详细流程参看手册说明 xWriteCH375Cmd( 0x06 ); xWriteCH375dat( 0x55 ); i = xReadCH375dat( ); 如果i = 0xAA,则表示硬件连接和3个读写函数基本没问题,可以继续操作,反之检查硬件连接和3个读写函数 (2)确认单片机串口配置是否正确,能否正确收发数据,可以用自发自收测试


void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定义的被CH375程序库调用的子程序,向CH375写命令 */ { while(!(UCSR0A&(1<UCSR0B&=~(1<if(mCmd&0x0100) UCSR0B|=(1<UDR0=mCmd; } void xWriteCH375Data( UINT8 mData ) /* 外部定义的被CH375程序库调用的子程序,向CH375写数据 */ { while(!(UCSR0A&(1<UCSR0B&=~(1<if(!(mData&0x0100)) UCSR0B&=~(1<UDR0=mData;

} UINT8 xReadCH375Data( void ) /* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */ { unsigned char status,resh,resl; while(!(UCSR0A&(1<status=UCSR0A; resh=UCSR0B; resl=UDR0; if(status&(1<return -1; resh=(resh>>1)&0x01; return((resh<<8)|resl);

}

SCM你好,问您几个问题(我是编程新手,公司给分配的任务,想用贵公司的CH375做U盘的读写) 1.咱们的示例程序是并口的,如果想改成串口是不是只需改动以上三个读写子函数就行了,以上是我改的,您给看看有什么问题没有。 2.串口连接是不是只需连上TXD,RXD,和INT#三根线呢,INT#是连在通用I/O口上吗,什么时候对他进行操作,该怎样操作他呢。 3.我的串口初始化操作正确吗: void mInitSTDIO( ) { UBRR0H = 0; UBRR0L = 103; /* 9600bps@16MHz */ UCSR0B = 0x1C ; /* BIT(RXEN) | BIT(TXEN); */ UCSR0C = 0x06; /* BIT(UCSZ1) | BIT(UCSZ0); */ //_textmode = 1; } 4.另外咱们的示例程序里串口用来做监测用了,我想用串口的话是不是把监测部分程序直接去掉就可以了,还有那个发光管的程序,实际中我用不上的话直接去掉就行了吗。 谢谢了,我真是菜鸟,两个多月了还是不行啊。


(1)写命令接口函数中有无效语句:if(mCmd&0x0100) 所有的命令码都8位的,向CH375发送命令码时要求第9位为1,而这条语句会始终把命令码当成数据发给CH375 注:与CH375串口通信时,需为9位数据方式,第9位为1表示命令,反之表示数据 (2) void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定义的被CH375程序库调用的子程序,向CH375写命令 */ { while( UCSR0A & ( 1 << UDRE0 ) == 0 ); /* 等待发送完成 */ UCSR0B |= ( 1 << TXB80 ); /* 置第9位为1 */ UDR0 = mCmd; } void xWriteCH375Data( UINT8 mData ) /* 外部定义的被CH375程序库调用的子程序,向CH375写数据 */ { while( UCSR0A & ( 1 << UDRE0 ) == 0 ); /* 等待发送完成 */ UCSR0B &= ( 1 << TXB80 ); /* 置第9位为0 */ UDR0 = mCmd; }

UINT8 xReadCH375Data( void ) /* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */ { while( UCSR0A & ( 1 << RXC0 ) == 0 ); /* 等待接收完成 */ return ( UDR0 ); } (3)还有GND线,INT#是CH375请求中断线,可以连接在通用I/O口上,只要像例程中定义CH375_INT_WIRE接口,库会自动处理CH375的中断请求 (4)UCSR0B = ( 1 << RXEN ) | ( 1 << TXEN ) | ( 1 << UCSZ2 ) | ( 1 << RXB8 ) | ( 1 << TXB8 ); (5)建议增加USART1的配置,用于监视,发光管代码可以去掉


SCM谢谢你了,如果我只想用Mega128串口方式实现对U盘的文件读写(即实现能读文件和写文件)那我应该参考哪个示例子程序呢?我看咱们站上好多例子,看了很长时间了,好多还不理解,如果用我上边说的例子,还需做哪些修改呢?另外SCM我在实际应用中做好的产品只是给用户留个USB口让用户完成文件的读写,所以用于监视的代码和对USART1的配置是否可以省略呢。不好意思太麻烦你了!


(1)\CH375LIB\AVR下的例程都可以参考,只是编译器及版本不同,主程序基本都是通用的 (2)可以省略,只是监视方便调试程序


CH375EVT CH375HM CH375HMU CH375HST CH375LIB_V30 CH375X86等里面的 示例程序是不是也能用上呢。


(1)CH375HM CH375HMU CH375HST CH375X86不可以 (2)CH375LIB_V30是早期版本的库,下载最新的CH375LIB.ZIP(V3.6),只要参考\CH375LIB\AVR下的例程就够了,下载地址:http://wch.cn/download/list.asp?id=41


SCM你好,我按您说的把程序做了如下修改来达到我要的功能(配合我的仪器使用,即把数据存入U盘,和从U盘里读数据): 1.修改三个读写子函数。把并口的改为了串口。 2.屏蔽掉了咱们使用串口做的监测程序部分(就只把带printf("")的语句屏蔽掉了,是不是只需这样呢) 3.把发光二极管的指示部分屏蔽了。 做了以上修改后能实现我要的功能吗?另外还有个问题: 4.我存入U盘中的数据是以什么格式存在的?是文件吗?是什么形式的文件?后缀是什么呢?如果把这些数据传到电脑里该用什么工具打开呢?谢谢!


只有登录才能回复,可以选择微信账号登录