求助CH375与单片机的连接使用问题

各位大师,我按照+CH375中文手册里并口连接方式将375与STC89连接,但使用不起来.我的住程序是用的CH375.EVT里的EXAM4, main( ) { UINT8 i, c, SecCount; UINT16 NewSize; /* 因为演示板的RAM容量只有32KB,所以NewSize限制为16位,实际上如果文件大于32256字节,应该分几次读写并且将NewSize改为UINT32以便累计 */ UINT8 code *pCodeStr; LED_OUT_INIT( ); mDelay100mS( ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */ mDelay100mS( ); mDelay100mS( ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */ mDelay100mS( ); mDelay100mS( ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */ mDelay100mS( ); LED_OUT_ACT( ); /* 开机后LED亮一下以示工作 */ mDelay100mS( ); /* 延时100毫秒 */ mInitSTDIO( ); /* 为了让计算机通过串口监控演示过程 */ printf( "Start\n" ); LED_RUN_INACT( ) mDelay100mS( ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */ mDelay100mS( ); mDelay100mS( ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */ mDelay100mS( ); mDelay100mS( ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */ mDelay100mS( ); LED_RUN_ACT( ); /* 开机后LED亮一下以示工作 */

i = CH375LibInit( ); /* 初始化CH375程序库和CH375芯片,操作成功返回0 */ mStopIfError( i );

LED_WR_ACT( ); mDelay100mS( ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */ mDelay100mS( ); mDelay100mS( ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */ mDelay100mS( ); mDelay100mS( ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */ mDelay100mS( ); LED_WR_INACT( ); /* 开机后LED亮一下以示工作 */

程序运行到 i = CH375LibInit( ); /* 初始化CH375程序库和CH375芯片,操作成功返回0 */ mStopIfError( i );就停在这了,与P1.4和P1.5连接的两个LED交替循环亮,而与P1.6连接的不亮,好象初始化不了,请问这个是什么原因啊,我仔细检查了我的电路,应该没有问题的.求+助各位大仙了

LED_OUT_INIT( );是与P1.4连接的灯亮. LED_RUN_INACT( )是与P1.5连接的灯亮. LED_WR_ACT( );是与P1.6连接的灯亮.


库的初始化过不了的话,很大可能还是你的硬件上还有问题。先不用库的初始化,你自己写个测试命令(发命令CHECK_EXIST)测试一下你的375与单片机之间的连接是不是有问题。


谢谢,具体应该怎么写啊?(新手,多多照顾)


发测试命令,写入测试数据看返回数据是否是原数据取反. 程序如下: CH375_WR_CMD_PORT( CMD_CHECK_EXIST ); CH375_WR_DAT_PORT( 0x55 ); i = ~ 0x55; if ( CH375_RD_DAT_PORT( ) != i ) { for ( i=80; i!=0; i-- ) { CH375_WR_CMD_PORT( CMD_RESET_ALL ); CH375_RD_DAT_PORT( ); }

}


375.C(191): error C267: 'CH375_WR_CMD_PORT': requires ANSI-style prototype 375.C(191): warning C206: 'CH375_WR_CMD_PORT': missing function-prototype 编译的时候这个问题怎么解决啊?


你将命令写到命令端口,数据写到数据端口,在你文件中是定义了: #define CH375_CMD_PORT_ADDR 0xBDF1 /* CH375命令端口的I/O地址 */ #define CH375_DAT_PORT_ADDR 0xBCF0 /* CH375数据端口的I/O地址 */

你用下面的试:

CH375_CMD_PORT= CMD_CHECK_EXIST; /* 测试CH375是否正常工作 */ delay2us( ); /* 如果时钟频率低于16MHz则无需该指令延时 */ CH375_DAT_PORT= 0x55; /* 写入测试数据 */ delay2us( ); printf("CH375_DAT_PORT:%d\n",(unsigned short)CH375_DAT_PORT); i = ~ 0x55; /* 返回数据应该是测试数据取反 */ if ( CH375_DAT_PORT != i ) { /* CH375不正常 */    for ( i=80; i!=0; i-- ) {       CH375_CMD_PORT = CMD_RESET_ALL; /* 多次重复发命令,执行硬件复位 */       delay2us( );    }    CH375_CMD_PORT = 0;    Delay50ms( ); /* 延时50ms */ }


但测试结果返回值是正常的,返回数据和原数据是取反。:(


那库初使话之后返回的数据是多少????如果测试命令通过的话,那么应该是返回0X00


大师,现在初始化可以了,但我自己做的375与单片机连接的板子,与P1。4连接的LED一开始不亮,当插上U盘后先亮一下后就一直闪烁,请问这是什么原因啊?我用的是EVT文件夹里的EXAM4程序。我用的是STC公司的单片机,没有使用外部的RAM。谢谢贵人指导方向。


如果你的库的初始化是过了的话,那么,你有没有监测你的程序是跑到什么地方停下来的?还有就是你用的STC单片机有双DPTR吗?这个例子是采用双DPTR的方式


我用的是STC的89系列,支持双DPTR的,.我想先搞个简单的,U盘里建个新文件,所以把EXAM4的主程序删减了点,就是下面的.现在的问题是U盘插进去后,375是对U盘操作(U盘的指示灯闪了) ,但当P1.4连接一个LED(用于监控演示程序的进度,低电平LED亮,当U盘插入后亮 ) 在P1.5连接一个LED(用于监控演示程序的进度,低电平LED亮,当对U盘操作时亮 */) P1.6连接一个LED(用于监控演示程序的进度,低电平LED亮,当对U盘写操作时亮 )这三个LED都亮了后,与P1.4连接的LED一只闪烁不停,U盘里也没有新建的文件,是不是 /* 检查操作状态,如果错误则显示错误代码并停机 */ void mStopIfError( UINT8 iError ) { if ( iError == ERR_SUCCESS ) return; /* 操作成功 */ printf( "Error: %02X\n", (UINT16)iError ); /* 显示错误 */ while ( 1 ) { LED_OUT_ACT( ); /* LED闪烁 */ mDelay100mS( ); LED_OUT_INACT( ); mDelay100mS( ); } }这个操作状态检测出问题了啊?请高人指点应该怎么解决,谢谢:)

程序如下: #include #include

/* 以下定义的详细说明请看CH375HF6.H文件 */ #define LIB_CFG_DISK_IO 2 /* 磁盘读写的数据的复制方式,1为"单DPTR复制",2为"双DPTR复制",3为"单DPTR和P2+R0复制" */ #define LIB_CFG_FILE_IO 0 /* 文件读写的数据的复制方式,0为"外部子程序",1为"单DPTR复制",2为"双DPTR复制",3为"单DPTR和P2+R0复制" */ #define LIB_CFG_INT_EN 0 /* CH375的INT#引脚连接方式,0为"查询方式",1为"中断方式" */ /*#define LIB_CFG_FILE_IO_DEFAULT 1*/ /* 使用CH375HF6.H提供的默认"外部子程序" */

#define CH375_CMD_PORT_ADDR 0xBDF1 /* CH375命令端口的I/O地址 */ #define CH375_DAT_PORT_ADDR 0xBCF0 /* CH375数据端口的I/O地址 */ /* 只使用单片机内置的1KB外部RAM: 0000H-01FFH 为磁盘读写缓冲区, 没有文件数据缓冲区 */ #define DISK_BASE_BUF_ADDR 0x0000 /* 外部RAM的磁盘数据缓冲区的起始地址,从该单元开始的缓冲区长度为SECTOR_SIZE */ /* 由于单片机内置的外部RAM只有1KB, 有些单片机还要去掉256字节内部RAM, 只剩下768字节的外部RAM, 其中前512字节由CH375子程序用于磁盘数据缓冲, 由于"外部子程序"处理文件数据复制, 所以没有文件数据缓冲区 */ #define FILE_DATA_BUF_LEN 0x0200 /* 外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度,使用"外部子程序"时该定义没有意义 */ /* 如果准备使用双缓冲区交替读写,那么不要定义FILE_DATA_BUF_LEN,而是在参数中指定缓冲区起址,用CH375FileReadX代替CH375FileRead,用CH375FileWriteX代替CH375FileWrite */

#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 "..\CH375HF6.H" /* 如果不需要支持FAT32,那么请选用CH375HF4.H */

UINT8X mFileReadBuffer[ 64 ] _at_ 0x0200; /* 缓冲CH375读文件的一次数据传输,长度为CH375_MAX_DATA_LEN */

void xWriteToExtBuf( UINT8 mLength ) /* 该子程序由CH375的子程序库调用,用于从CH375读取文件数据到外部缓冲区,被CH375FileRead调用 */ { UINT8 i; PUINT8X p; if ( mLength == 64 ) { p = mFileReadBuffer; do { /* 根据长度读取数据,实际上长度总是CH375_MAX_DATA_LEN,也就是64 */ *p = CH375_DAT_PORT; /* 将U盘读出数据暂存到内部RAM缓冲区,可以用这种方式将文件数据保存到单片机的各种串行存储器中 */ p ++; } while ( -- mLength ); /* 复制上述数据的总时间不得超过2mS */ /* PutDataToDAC( mFileReadBuffer ); 将mFileReadBuffer缓冲区中的数据输出给DAC */ for ( i = 0; i != 4; i ++ ) { while( TI == 0 ); TI = 0; SBUF = mFileReadBuffer[ i ]; } /* 显示前4个字符 */ } else if ( mLength == 0 ) { /* 重试,恢复缓冲区起址,如果将文件数据读写的缓冲区的当前指针放在mCmdParam.ReadX.mDataBuffer中则会被自动恢复,无需下面的两行程序 */ // (UINT16)mCmdParam.ReadX.mDataBuffer; /* mDataBuffer中为负值,重试的字节数 */ } }

UINT8 GetDataFromADC( ) /* 没有ADC,所以总是模拟返回数据30H */ { /* while ( RI == 0 ); RI = 0; return( SBUF ); 通过串口获得数据或者从各种串行存储器中取出数据 */ return( '0' ); }

void xReadFromExtBuf( UINT8 mLength ) /* 该子程序由CH375的子程序库调用,用于从外部缓冲区读取文件数据到CH375,被CH375FileWrite调用 */ { if ( mLength ) { while ( mLength ) { /* 根据长度写入数据,实际上长度总是CH375_MAX_DATA_LEN,也就是64 */ CH375_DAT_PORT = GetDataFromADC( ); /* 从ADC获取一字节数据写入U盘,可以用这种方式从单片机的各种串行存储器中取出文件数据 */ mLength --; } /* 复制上述数据的总时间不得超过2mS,如果超过2mS请参考下述方法 */ } else { /* 重试,恢复缓冲区起址,如果将文件数据读写的缓冲区的当前指针放在mCmdParam.WriteX.mDataBuffer中则会被自动恢复,无需下面的两行程序 */ // (UINT16)mCmdParam.WriteX.mDataBuffer; /* mDataBuffer中为负值,重试的字节数 */ } }

#if 0 /* 如果xReadFromExtBuf子程序执行总时间超过1mS,那么应该用下述方法避免CH375长时间等待数据 */ UINT8X mFileWriteBuffer[ 64 ] _at_ 0x0240; /* 缓冲CH375写文件的一次数据传输,长度为CH375_MAX_DATA_LEN */ void xReadFromExtBuf( UINT8 mLength ) /* 该子程序由CH375的子程序库调用,用于从外部缓冲区读取文件数据到CH375,被CH375FileWrite调用 */ { UINT8 i; while ( mLength ) CH375_DAT_PORT = mLength --; /* 由于CH375的命令必须在2mS之内完成,所以先写入无意义数据结束前一个命令 */ for ( i = 0; i != 64; i ++ ) mFileWriteBuffer[ i ] = GetDataFromADC( ); /* 从ADC获得数据暂存到临时缓冲区, 没有时间限制 */ CH375_CMD_PORT = CMD_WR_USB_DATA7; /* 重新发出写数据命令,向CH375的主机端点发送缓冲区写入数据块 */ if ( CH375IntStatus ) CH375IntStatus = 0; /* 仅作延时,不短于2uS */ CH375_DAT_PORT = 64; /* 后续数据的长度,对于写U盘必须是64 */ for ( i = 0; i != 64; i ++ ) CH375_DAT_PORT = mFileWriteBuffer[ i ]; /* 将临时缓冲区中的数据写入CH375,覆盖前面写入的无意义数据 */ } #endif

/* 在P1.4连接一个LED用于监控演示程序的进度,低电平LED亮,当U盘插入后亮 */ sbit P1_4 = P1^4; #define LED_OUT_INIT( ) { P1_4 = 1; } /* P1.4 高电平 */ #define LED_OUT_ACT( ) { P1_4 = 0; } /* P1.4 低电平驱动LED显示 */ #define LED_OUT_INACT( ) { P1_4 = 1; } /* P1.4 低电平驱动LED显示 */ sbit P1_5 = P1^5; /* 在P1.5连接一个LED用于监控演示程序的进度,低电平LED亮,当对U盘操作时亮 */ #define LED_RUN_ACT( ) { P1_5 = 0; } /* P1.5 低电平驱动LED显示 */ #define LED_RUN_INACT( ) { P1_5 = 1; } /* P1.5 低电平驱动LED显示 */ sbit P1_6 = P1^6; /* 在P1.6连接一个LED用于监控演示程序的进度,低电平LED亮,当对U盘写操作时亮 */ #define LED_WR_ACT( ) { P1_6 = 0; } /* P1.6 低电平驱动LED显示 */ #define LED_WR_INACT( ) { P1_6 = 1; } /* P1.6 低电平驱动LED显示 */

/* 延时100毫秒,不精确 */ void mDelay100mS( ) { UINT8 i, j, c; for ( i = 200; i != 0; i -- ) for ( j = 200; j != 0; j -- ) c+=3; }

/* 将程序空间的字符串复制到内部RAM中,返回字符串长度 */ UINT8 mCopyCodeStringToIRAM( UINT8 idata *iDestination, UINT8 code *iSource ) { UINT8 i = 0; while ( *iDestination = *iSource ) { iDestination ++; iSource ++; i ++; } return( i ); }

/* 检查操作状态,如果错误则显示错误代码并停机 */ void mStopIfError( UINT8 iError ) { if ( iError == ERR_SUCCESS ) return; /* 操作成功 */ printf( "Error: %02X\n", (UINT16)iError ); /* 显示错误 */ while ( 1 ) { LED_OUT_ACT( ); /* LED闪烁 */ 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, c, SecCount; UINT16 NewSize; /* 因为演示板的RAM容量只有32KB,所以NewSize限制为16位,实际上如果文件大于32256字节,应该分几次读写并且将NewSize改为UINT32以便累计 */ UINT8 code *pCodeStr; LED_OUT_INIT( ); LED_OUT_ACT( ); /* 开机后LED亮一下以示工作 */ mDelay100mS( ); /* 延时100毫秒 */ LED_OUT_INACT( ); mInitSTDIO( ); /* 为了让计算机通过串口监控演示过程 */ printf( "Start\n" );

i = CH375LibInit( ); /* 初始化CH375程序库和CH375芯片,操作成功返回0 */ mStopIfError( i ); /* 其它电路初始化 */

while ( 1 ) { printf( "Wait Udisk\n" ); // while ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt( ); /* 查询CH375中断并更新中断状态,等待U盘插入 */ while ( CH375DiskStatus < DISK_CONNECT ) { /* 查询CH375中断并更新中断状态,等待U盘插入 */ if ( CH375DiskConnect( ) == ERR_SUCCESS ) break; /* 有设备连接则返回成功,CH375DiskConnect同时会更新全局变量CH375DiskStatus */


好象是你的外部缓冲区溢出了,死在建立文件的地方,你将: #define FILE_DATA_BUF_LEN 0x0200 /* 外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度,使用"外部子程序"时该定义没有意义 */ 中的0X0200改小了,其实没用到FILE_DATA_BUF,该定义无意义。 还有就是你在写的时候,得给出扇区数SecCount值;更新文件长度的时候给出文件长度NewSize的值。


恩,好了,谢谢大师了.我用的是内置1K的RAM,如果以扇区读写的话一次可以读写多少扇区啊?如果在进行简单的数据采集把数据要保存到U盘,不用外置的RAM行不行?


我们的375芯片+单片机操作U盘的话,对于以文件系统来操作U盘的话,对于51单片机来讲,需要RAM最少600字节(512磁盘缓冲区+10多个外部变量+几十字节的变量),对于普通的51单片机,对于操作物理扇区的话,RAM是可以的,最少大概需要100多字节吧


我想把U盘里的数据(譬如数字)通过375读出后显示在LED上,请问375将数据读出后存放在内部RAM的哪了?单片机应该读哪的地址?


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