51单片机和CH375问题

小弟按照ch375中文手册做了个51单片机(SST89E58RD)驱动CH375 读写U盘的电路,串口方式,没有接其他芯片,但是不管怎样都没有反应.希望各位大虾能帮个忙,给个 串口方式 的成功程序参考一下,只要能够写U盘就可以了.TXD==>RXD;INT#==>INT0;RXD==>TXD.小弟在此谢过了! 或者发邮件给我 个人信息保护,已隐藏

你先做下测试命令看下可以不可以?实际做的时候你把串口设置成9位数据方式,在写命令的时候将第9位设置成为1,写数据的时候将第9位数据设置成为0。这样就可以了。


我应该参考哪个程序呢? 我是刚刚开始做的,但是,时间上要求我在这两天内做出来,所以很急.昨晚通宵弄了一天都没有什么反应. 我的板没有连接电脑的,这样可以测试吗? 测试了下ch375 的25脚是低电平,26高电平,应该是正常的,这样说明芯片工作了吗? 但是ACT#的那个LED出来就没有亮过. 可以加我Q聊吗?那样快点.QQ:181910213 谢谢!


读写子函数参考: void CH375_PORT_INIT( ) { SCON = 0xD0; 设置串口为9位数据 设置波特率和其它串口参数 }

void xWriteCH375Cmd( UINT8 mCmd ) { TI = 0; TB8 = 1; SBUF = mCmd; while ( TI == 0 ); }

void xWriteCH375Data( UINT8 mData ) { TI = 0; TB8 = 0; SBUF = mData; while ( TI == 0 ); }

UINT8 xReadCH375Data( void ) { while ( RI == 0 ); RI = 0; return( SBUF ); } /* 为printf和getkey输入输出初始化串口 */ void mInitSTDIO( ) { SCON = 0x50; PCON = 0x80; TMOD = 0x20; TH1 = 0xf3; /* 24MHz晶振, 9600bps */ TR1 = 1; TI = 1; } 希望对你有用!


12M晶振,怎么设置TH1? void mInitSTDIO( ) 函数不是要有上位机连接才要的吗?我的是不能接电脑的.我的板是自己做的.


我用LED观测程序的进度,发觉结果是LED闪烁,操作不成功 void mStopIfError( UINT8 iError ) { if ( iError == ERR_SUCCESS ) return; /* 操作成功 */

while ( 1 ) { LED_OUT_ACT( ); /* LED闪烁 */ mDelay100mS( ); LED_OUT_INACT( ); mDelay100mS( ); } }


你先做测试命令吧,测试命令通过了了在往下调! void mInitSTDIO( ) 是初始化串口的!


大哥,不好意思啊,因为我是刚刚接触,所以很多不懂的东西.怎么测试命令呢?麻烦了


大哥,帮帮忙啦,不是我不懂事啊,做毕业设计,时间太赶了,没有太多的时间让我去理解.其他模块都做好了,就剩下把USB数据写进U盘了.给个可行的串口例子试试. 或是你帮我随便写个好不? 只要能向U写进一个文档,然后在文档写进一行数据就可以了 . 做了几天了,还看不到希望啊, 27号就得交差了.急急急!!! 电路连接方式TXD==>RXD;INT#==>INT0;RXD==>TXD loventer@163.COM


UINT8 mWaitInterrupt( void ) { /* 等待CH375中断并获取状态,返回操作状态 */

while( CH375_INT_WIRE ); /* 查询等待CH375操作完成中断(INT#低电平) */ P14=0; mDelaymS( 1250 ); CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 产生操作完成中断,获取中断状态 */ return( CH375_RD_DAT_PORT( ) ); }

过程中检测不到复位信号,死循环了,是怎么回事呢


到我们网站上下载CH375LIB.ZIP.(到在线下载里搜索),文件路径为:CH375LIB\MCS51\FILELIB5\EXAM7 例7里面有串口操作的例子(被屏蔽起来了),供你参考!


好的,我今晚试试,实在不行我就再做一个并口的板.先谢谢伟大的 红桃六大哥和hcn大哥了~~


我用贵公司CH375LIB.ZIP中\MCS51\FILELIB5\EXAM7的程序例子进行修改,在 i = CH375LibInit( ); 就停止运行了,请问是怎么回事啊?硬件完全按照程序说明接的. 附上修改后的程序:

#include #include #define MAX_BYTE_IO 35 /* 以字节为单位单次读写文件时的最大长度,默认值是29,值大则占用内存多,值小则超过该长度必须分多次读写 */

/* 以下定义的详细说明请看CH375HF5.H文件 */ #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为"自动更新" */

/* 只使用单片机内置的1KB外部RAM: 0000H-01FFH 为磁盘读写缓冲区, 以字节为单位读写文件不需要文件数据读写缓冲区FILE_DATA_BUF */ #define DISK_BASE_BUF_ADDR 0x0000 /* 外部RAM的磁盘数据缓冲区的起始地址,从该单元开始的缓冲区长度为SECTOR_SIZE */ #define FILE_DATA_BUF_ADDR 0x0000 /* 外部RAM的文件数据缓冲区的起始地址,缓冲区长度不小于一次读写的数据长度,字节模式不用该缓冲区 */ /* 由于单片机内置的外部RAM只有1KB, 有些单片机还要去掉256字节内部RAM, 只剩下768字节的外部RAM, 其中前512字节由CH375子程序用于磁盘数据缓冲 */ #define FILE_DATA_BUF_LEN 0x0200 /* 外部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"

/* 在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显示 */

/* 本例用I/O引脚模拟产生CH375的并口读写时序 */ /* 本例中的硬件连接方式如下(实际应用电路可以参照修改下述3个并口读写子程序) */ /* 单片机的引脚 CH375芯片的引脚 P3.2 INT# P1.0 A0 P1.1 CS# 如果模拟出的并口上只有CH375,那么CS#可以直接接低电平,强制片选 P1.2 WR# P1.3 RD# P0(8位端口) D7-D0 */ sbit CH375_A0 = P1^0; sbit CH375_CS = P1^1; sbit CH375_WR = P1^2; sbit CH375_RD = P1^3;

void mDelay1_2uS( ) /* 至少延时1.2uS,根据单片机主频调整 */ { return; }

void CH375_PORT_INIT( ) /* 由于使用通用I/O模块并口读写时序,所以进行初始化 */ { CH375_CS = 1; CH375_WR = 1; CH375_RD = 1; CH375_A0 = 0; P0 = 0xFF; /* 并口输入 */ }

void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定义的被CH375程序库调用的子程序,向CH375写命令 */ { mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */

P0 = mCmd; /* 向CH375的并口输出数据 */ CH375_A0 = 1; CH375_CS = 0; CH375_WR = 0; /* 输出有效写控制信号, 写CH375芯片的命令端口 */ CH375_CS = 0; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ CH375_WR = 1; /* 输出无效的控制信号, 完成操作CH375芯片 */ CH375_CS = 1; CH375_A0 = 0; P0 = 0xFF; /* 禁止数据输出 */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时2uS */ }

void xWriteCH375Data( UINT8 mData ) /* 外部定义的被CH375程序库调用的子程序,向CH375写数据 */ { P0 = mData; /* 向CH375的并口输出数据 */ CH375_A0 = 0; CH375_CS = 0; CH375_WR = 0; /* 输出有效写控制信号, 写CH375芯片的数据端口 */ CH375_CS = 0; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ CH375_WR = 1; /* 输出无效的控制信号, 完成操作CH375芯片 */ CH375_CS = 1; P0 = 0xFF; /* 禁止数据输出 */ mDelay1_2uS( ); /* 至少延时1.2uS */ }

UINT8 xReadCH375Data( void ) /* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */ { UINT8 mData; mDelay1_2uS( ); /* 至少延时1.2uS */ mDelay1_2uS( ); /* 至少延时1.2uS */ P0 = 0xFF; /* 输入 */ CH375_A0 = 0; CH375_CS = 0; CH375_RD = 0; /* 输出有效写控制信号, 读CH375芯片的数据端口 */ CH375_CS = 0; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ mData = P0; /* 从CH375的并口输入数据 */ CH375_RD = 1; /* 输出无效的控制信号, 完成操作CH375芯片 */ CH375_CS = 1; return( mData ); }

/* 延时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; /* 操作成功 */

while ( 1 ) { LED_OUT_ACT( ); /* LED闪烁 */ mDelay100mS( ); LED_OUT_INACT( ); mDelay100mS( ); } }

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( );

LED_RUN_ACT( ); mDelay100mS( ); /* 延时100毫秒 */ mDelay100mS( ); /* 延时100毫秒 */ mDelay100mS( ); /* 延时100毫秒 */ mDelay100mS( ); /* 延时100毫秒 */

LED_RUN_INACT( );

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

mStopIfError( i ); /* 其它电路初始化 */

while ( 1 ) {

while ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt( ); /* 查询CH375中断并更新中断状态,等待U盘插入 */ LED_OUT_ACT( ); /* LED亮 */ mDelay100mS( ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */ mDelay100mS( );

/* 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 */ for ( i = 0; i < 5; i ++ ) { /* 有的U盘总是返回未准备好,不过可以被忽略 */ mDelay100mS( );

if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查询磁盘是否准备好 */ }

LED_RUN_ACT( ); /* 开始操作U盘 */

/* 如果MY_ADC.TXT文件已经存在则添加数据到尾部,如果不存在则新建文件 */

mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, "/MY_ADC.TXT" ); /* 文件名,该文件在根目录下 */ i = CH375FileOpen( ); /* 打开文件 */ if ( i == ERR_SUCCESS ) { /* 文件存在并且已经被打开,移动文件指针到尾部以便添加数据 */

mCmdParam.ByteLocate.mByteOffset = 0xffffffff; /* 移到文件的尾部 */ i = CH375ByteLocate( ); mStopIfError( i ); } else if ( i == ERR_MISS_FILE ) { /* 没有找到文件,必须新建文件 */ LED_WR_ACT( ); /* 写操作 */

mCopyCodeStringToIRAM( mCmdParam.Create.mPathName, "/MY_ADC.TXT" ); /* 文件名,该文件在根目录下,刚才已经提供给CH375FileOpen */ i = CH375FileCreate( ); /* 新建文件并打开,如果文件已经存在则先删除后再新建 */ mStopIfError( i ); } else mStopIfError( i ); /* 打开文件时出错 */ LED_WR_ACT( ); /* 写操作 */

i = sprintf( mCmdParam.ByteWrite.mByteBuffer, "此前文件长度= %ld 字节\xd\xa", CH375vFileSize ); mCmdParam.ByteWrite.mByteCount = i; /* 指定本次写入的字节数,单次读写的长度不能超过MAX_BYTE_IO */ i = CH375ByteWrite( ); /* 以字节为单位向文件写入数据,单次读写的长度不能超过MAX_BYTE_IO */ mStopIfError( i );

for ( hour = 8; hour != 20; hour ++ ) { /* 用循环方式添加12行数据 */ TR0=1; /* 用定时器0的计数值代替ADC数据 */ month = 5; /* 假定是5月 */ date = TL1 & 0x1F; /* 因为测试板上没有实时时钟芯片,所以用定时器1的计数代替进行演示 */ /* adc = get_adc_data( ); */


你原来不是用串口吗?按照你上面的程序你改为模拟并口后TXD脚要接地.


已经接地了,程序运行的结果是不断地闪烁.我先去开会,大哥你帮我看还有什么可能出错的地方,谢了~


那你的硬件可能有问题,做测试命令.做完看看结果再所吧.方法如下:上电复位完成后 先发命令0X06再发数据0X55;然后再去读数据,读到的数据是你发的是数据的按位取反,也就是0XAA.你看看是不是这个结果!


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