io读写下ch376初始化不成功,没反应

#include #include #include //#include //#include sbit CS=P2^1; sbit A0=P2^0; //sbit WR=P3^6; //sbit RD=P3^7; sbit INT=P3^2; /* 为printf和getkey输入输出初始化串口 */ void mInitSTDIO( void ) { SCON = 0x50; PCON = 0x00; TMOD = 0x20; TH1 = 0xfd; /* 11.0592MHz晶振, 9600bps */ TL1 = 0xfd; TR1 = 1; TI = 1; } void delay(unsigned int z) { unsigned int x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void CH376_Write_Cmd(unsigned char cmd)//io 写命令 { CS=0; A0=1; P0=cmd; WR=0; WR=1; CS=1; A0=1; } void CH376_Write_Dat(unsigned char dat)//io 写数据 { CS=0; A0=0; P0=dat; WR=0; WR=1; CS=1; A0=1; } unsigned char CH376_Read_Dat()//io读数据 { unsigned char temp; CS=0; A0=0; RD=0; P0=0xff; temp=P0; RD=1; CS=1; A0=1; return temp; } unsigned char CH376_Wait_Int()//等待中断 { INT=1; while(INT); CH376_Write_Cmd(CMD01_GET_STATUS); return CH376_Read_Dat(); } unsigned char CH376_InitDisk() //初始化U盘 { unsigned char status; printf( "初始化U盘: \n" ); printf( "请插入U盘: \n" ); status=CH376_Wait_Int(); if(status==USB_INT_CONNECT) {printf( "U盘已插入 \n" );} else {printf( "U盘插入错误 \n" );} CH376_Write_Cmd(CMD0H_DISK_INIT); status=CH376_Wait_Int(); if(status!=USB_INT_SUCCESS) { printf( "U盘初始化失败 \n" ); return(status); } printf( "初始化U盘成功 \n" ); printf( "\n" ); return(0); } void main() { unsigned char s; mInitSTDIO(); s=CH376_InitDisk(); }

不知道为什么,上电后用超级终端看串口返回的信息只看到"初始化U盘:"和"请插入U盘:"这两句,然后插入U盘就没下文了,请各位帮忙看看?UploadImages/20104162225817.rar

我把上面 unsigned char改成unsigned long int也不行。


unsigned char CH376_Read_Dat()//io读数据 { unsigned char temp; P0=0xff; CS=0; A0=0; RD=0; temp=P0; RD=1; CS=1; A0=1; return temp; } 这个地方时序需要修改一下。 你先做测试命令,然后看看读写函数是否成功。建议参考我们提供的代码去写。你的写法很多不规范的地方。 INT=1;应该是在初始化IO的时候做的,每次查询中断的时候都拉为1,做法感觉欠妥。


看了上传的程序,估计楼主对CH376的用法还不太清楚,程序中CH376没有被初始化,怎么能监测到U盘呢! 建议下载CH376EVT.ZIP,先不要自己编写程序,直接移植例程,仅需要根据实际的硬件连接修改PRAA_SW.C文件即可


悲剧了,谢谢scm和红桃六,我参照了PRAA_SW.C文件,根据实际的硬件连接修改PRAA_SW.C文件,但是这次一个字都没出来,怎么办啊? /* CH376芯片 软件模拟8位并口连接的硬件抽象层 V1.0 */ /* 提供I/O接口子程序 */ //#include #include #include "HAL.H"

/* 本例中的硬件连接方式如下(实际应用电路可以参照修改下述定义及子程序) */ /* 单片机的引脚 CH376芯片的引脚 P2.0 A0 P2.6 CS# 如果模拟出的并口上只有CH376,那么CS#可以直接接低电平,强制片选 P3.6 WR# P3.7 RD# P0(8位端口) D7-D0 */ sbit CH376_A0 = P2^0; sbit CH376_CS = P2^1; sbit CH376_WR = P3^6; sbit CH376_RD = P3^7; #define CH376_DATA_DAT_OUT( d ) { P0 = d; } /* 向并口输出数据 */ #define CH376_DATA_DAT_IN( ) ( P0 ) /* 从并口输入数据 */ #define CH376_DATA_DIR_OUT( ) /* 设置并口方向为输出 */ #define CH376_DATA_DIR_IN( ) { P0 = 0xFF; } /* 设置并口方向为输入 */

#define CH376_INT_WIRE INT0 /* 假定CH376的INT#引脚,如果未连接那么也可以通过查询状态端口实现 */ /* 为printf和getkey输入输出初始化串口 */ void mInitSTDIO( void ) { SCON = 0x50; PCON = 0x00; TMOD = 0x20; TH1 = 0xfd; /* 11.0592MHz晶振, 9600bps */ TL1 = 0xfd; TR1 = 1; TI = 1; } void CH376_PORT_INIT( void ) /* 由于使用通用I/O模拟并口读写时序,所以进行初始化 */ { CH376_CS = 1; CH376_WR = 1; CH376_RD = 1; CH376_A0 = 0; CH376_DATA_DIR_IN( ); /* 设置并口输入 */ }

//void mDelay0_5uS( void ) /* 至少延时0.5uS,根据单片机主频调整 */ //{ //}

#define xEndCH376Cmd( ) /* 结束CH376命令,仅用于SPI接口方式 */

UINT8 xReadCH376Status( void ) /* 从CH376读状态,仅用于并口方式 */ { UINT8 mData; CH376_DATA_DIR_IN( ); /* 设置并口方向为输入 */ CH376_A0 = 1; CH376_CS = 0; CH376_RD = 0; /* 输出有效读控制信号, 读CH376芯片的状态端口 */ CH376_CS = 0; /* 该操作无意义,仅作延时,CH376要求读写脉冲宽度大于40nS,强烈建议此处执行一条空指令延时以确保并口有足够时间输入数据 */ mData = CH376_DATA_DAT_IN( ); /* 从CH376的并口输入数据 */ CH376_RD = 1; /* 输出无效的控制信号, 完成操作CH376芯片 */ CH376_CS = 1; CH376_A0 = 0; return( mData ); }

void xWriteCH376Cmd( UINT8 mCmd ) /* 向CH376写命令 */ { CH376_DATA_DAT_OUT( mCmd ); /* 向CH376的并口输出数据 */ CH376_DATA_DIR_OUT( ); /* 设置并口方向为输出 */ CH376_A0 = 1; CH376_CS = 0; CH376_WR = 0; /* 输出有效写控制信号, 写CH376芯片的命令端口 */ // CH376_CS = 0; /* 该操作无意义,仅作延时,CH376要求读写脉冲宽度大于40nS */ CH376_WR = 1; /* 输出无效的控制信号, 完成操作CH376芯片 */ CH376_CS = 1; CH376_A0 = 0; CH376_DATA_DIR_IN( ); /* 禁止数据输出 */ /* mDelay0_5uS( ); mDelay0_5uS( ); mDelay0_5uS( );*/ /* 延时1.5uS确保读写周期大于1.5uS,或者用状态查询代替 */ }

void xWriteCH376Data( UINT8 mData ) /* 向CH376写数据 */ { CH376_DATA_DAT_OUT( mData ); /* 向CH376的并口输出数据 */ CH376_DATA_DIR_OUT( ); /* 设置并口方向为输出 */ CH376_A0 = 0; CH376_CS = 0; CH376_WR = 0; /* 输出有效写控制信号, 写CH376芯片的数据端口 */ // CH376_CS = 0; /* 该操作无意义,仅作延时,CH376要求读写脉冲宽度大于40nS */ CH376_WR = 1; /* 输出无效的控制信号, 完成操作CH376芯片 */ CH376_CS = 1; CH376_DATA_DIR_IN( ); /* 禁止数据输出 */ // mDelay0_5uS( ); /* 确保读写周期大于0.6uS */ }

UINT8 xReadCH376Data( void ) /* 从CH376读数据 */ { UINT8 mData; // mDelay0_5uS( ); /* 确保读写周期大于0.6uS */ CH376_DATA_DIR_IN( ); /* 设置并口方向为输入 */ CH376_A0 = 0; CH376_CS = 0; CH376_RD = 0; /* 输出有效读控制信号, 读CH376芯片的数据端口 */ CH376_CS = 0; /* 该操作无意义,仅作延时,CH376要求读写脉冲宽度大于40nS,强烈建议此处执行一条空指令延时以确保并口有足够时间输入数据 */ mData = CH376_DATA_DAT_IN( ); /* 从CH376的并口输入数据 */ CH376_RD = 1; /* 输出无效的控制信号, 完成操作CH376芯片 */ CH376_CS = 1; return( mData ); }

/* 查询CH376中断(INT#低电平) */ UINT8 Query376Interrupt( void ) { #ifdef CH376_INT_WIRE return( CH376_INT_WIRE ? FALSE : TRUE ); /* 如果连接了CH376的中断引脚则直接查询中断引脚 */ #else return( xReadCH376Status( ) & PARA_STATE_INTB ? FALSE : TRUE ); /* 如果未连接CH376的中断引脚则查询状态端口 */ #endif }

UINT8 mInitCH376Host( void ) /* 初始化CH376 */ { UINT8 res; CH376_PORT_INIT( ); /* 接口硬件初始化 */ xWriteCH376Cmd( CMD11_CHECK_EXIST ); /* 测试单片机与CH376之间的通讯接口 */ xWriteCH376Data( 0x65 ); res = xReadCH376Data( ); // xEndCH376Cmd( ); // 并口方式不需要 if ( res != 0x9A ) { return( ERR_USB_UNKNOWN ); printf( "通讯接口不正常 \n" ); } /* 通讯接口不正常,可能原因有:接口连接异常,其它设备影响(片选不唯一),串口波特率,一直在复位,晶振不工作 */ printf( "通讯接口正常 \n" ); xWriteCH376Cmd( CMD11_SET_USB_MODE ); /* 设备USB工作模式 */ xWriteCH376Data( 0x06 ); mDelayuS( 20 ); res = xReadCH376Data( ); // xEndCH376Cmd( ); // 并口方式不需要 if ( res == CMD_RET_SUCCESS ) {return( USB_INT_SUCCESS ); printf( "设置模式成功 \n" );} else { return( ERR_USB_UNKNOWN ); printf( "设置模式错误 \n" );}/* 设置模式错误 */ } /*UINT8 CH376_InitDisk(void) //初始化U盘 { UINT8 status; printf( "初始化U盘: \n" ); printf( "请插入U盘: \n" ); status=CH376_Wait_Int(); if(status==USB_INT_CONNECT) {printf( "U盘已插入 \n" );} else {printf( "U盘插入错误 \n" );} CH376_Write_Cmd(CMD0H_DISK_INIT); status=CH376_Wait_Int(); if(status!=USB_INT_SUCCESS) { printf( "U盘初始化失败 \n" ); return(status); } printf( "初始化U盘成功 \n" ); printf( "\n" ); return(0); } */ void main() { unsigned char s; mInitSTDIO(); s=mInitCH376Host(); }


1、普通51单片机的P0做I/O口使用时,需要外接上拉电阻 2、并口不可能读不到数据,大不了数据出错


呵呵,谢谢SCM,不好意思,接电路的时候不小心把并口接到P1口了,但是新的问题出现了,我用的单片机是STC89c52,程序编译后虽然可以看到串口信息,但是反馈回来的都是些乱码,如"通讯接口粘? ㄑ督涌谡常 ㄑ督涌谡常 ㄑ督涌谡常" 麻烦再给看看程序. #include #include "HAL.H" sbit CH376_A0 = P2^0; sbit CH376_CS = P2^1; sbit CH376_WR = P3^6; sbit CH376_RD = P3^7; #define CH376_INT_WIRE INT0 /* 假定CH376的INT#引脚,如果未连接那么也可以通过查询状态端口实现 */ /* 为printf和getkey输入输出初始化串口 */ void mInitSTDIO( void ) { SCON = 0x50; PCON = 0x00; TMOD = 0x20; TH1 = 0xfd; /* 11.0592MHz晶振, 9600bps */ TL1 = 0xfd; TR1 = 1; TI = 1; } void CH376_PORT_INIT( void ) /* 由于使用通用I/O模拟并口读写时序,所以进行初始化 */ { CH376_CS = 1; CH376_WR = 1; CH376_RD = 1; CH376_A0 = 0; } void mDelay0_5uS( void ) /* 至少延时0.5uS,根据单片机主频调整 */ { ; } UINT8 xReadCH376Status( void ) /* 从CH376读状态,仅用于并口方式 */ { UINT8 mData; CH376_A0 = 1; CH376_CS = 0; CH376_RD = 0; /* 输出有效读控制信号, 读CH376芯片的状态端口 */ CH376_CS = 0; /* 该操作无意义,仅作延时,CH376要求读写脉冲宽度大于40nS,强烈建议此处执行一条空指令延时以确保并口有足够时间输入数据 */ mData = P1; /* 从CH376的并口输入数据 */ CH376_RD = 1; /* 输出无效的控制信号, 完成操作CH376芯片 */ CH376_CS = 1; CH376_A0 = 0; return( mData ); } void xWriteCH376Cmd( UINT8 mCmd ) /* 向CH376写命令 */ { P1=mCmd; /* 向CH376的并口输出数据 */ CH376_A0 = 1; CH376_CS = 0; CH376_WR = 0; /* 输出有效写控制信号, 写CH376芯片的命令端口 */ CH376_CS = 0; /* 该操作无意义,仅作延时,CH376要求读写脉冲宽度大于40nS */ CH376_WR = 1; /* 输出无效的控制信号, 完成操作CH376芯片 */ CH376_CS = 1; CH376_A0 = 0; mDelay0_5uS( ); mDelay0_5uS( ); mDelay0_5uS( ); /* 延时1.5uS确保读写周期大于1.5uS,或者用状态查询代替 */ } void xWriteCH376Data( UINT8 mData ) /* 向CH376写数据 */ { P1= mData ; /* 向CH376的并口输出数据 */ CH376_A0 = 0; CH376_CS = 0; CH376_WR = 0; /* 输出有效写控制信号, 写CH376芯片的数据端口 */ CH376_CS = 0; /* 该操作无意义,仅作延时,CH376要求读写脉冲宽度大于40nS */ CH376_WR = 1; /* 输出无效的控制信号, 完成操作CH376芯片 */ CH376_CS = 1; mDelay0_5uS( ); /* 确保读写周期大于0.6uS */ }

UINT8 xReadCH376Data( void ) /* 从CH376读数据 */ { UINT8 mData; mDelay0_5uS( ); /* 确保读写周期大于0.6uS */ CH376_A0 = 0; CH376_CS = 0; CH376_RD = 0; /* 输出有效读控制信号, 读CH376芯片的数据端口 */ CH376_CS = 0; /* 该操作无意义,仅作延时,CH376要求读写脉冲宽度大于40nS,强烈建议此处执行一条空指令延时以确保并口有足够时间输入数据 */ mData = P1; /* 从CH376的并口输入数据 */ CH376_RD = 1; /* 输出无效的控制信号, 完成操作CH376芯片 */ CH376_CS = 1; return( mData ); }

/* 查询CH376中断(INT#低电平) */ UINT8 Query376Interrupt( void ) { #ifdef CH376_INT_WIRE return( CH376_INT_WIRE ? FALSE : TRUE ); /* 如果连接了CH376的中断引脚则直接查询中断引脚 */ #else return( xReadCH376Status( ) & PARA_STATE_INTB ? FALSE : TRUE ); /* 如果未连接CH376的中断引脚则查询状态端口 */ #endif }

UINT8 mInitCH376Host( void ) /* 初始化CH376 */ { UINT8 res; CH376_PORT_INIT( ); /* 接口硬件初始化 */ xWriteCH376Cmd( CMD11_CHECK_EXIST ); /* 测试单片机与CH376之间的通讯接口 */ xWriteCH376Data( 0x65 ); res = xReadCH376Data( ); if ( res != 0x9A ) { return( ERR_USB_UNKNOWN ); printf( "通讯接口不正常 \n" ); } /* 通讯接口不正常,可能原因有:接口连接异常,其它设备影响(片选不唯一),串口波特率,一直在复位,晶振不工作 */ printf( "通讯接口正常 \n" ); xWriteCH376Cmd( CMD11_SET_USB_MODE ); /* 设备USB工作模式 */ xWriteCH376Data( 0x06 ); mDelayuS( 20 ); res = xReadCH376Data( ); if ( res == CMD_RET_SUCCESS ) {return( USB_INT_SUCCESS ); printf( "设置模式成功 \n" );} else { return( ERR_USB_UNKNOWN ); printf( "设置模式错误 \n" );}/* 设置模式错误 */ } void main() { unsigned char s; mInitSTDIO(); s=mInitCH376Host(); }


你的程序有很多问题。 void main() { unsigned char s; mInitSTDIO(); s=mInitCH376Host(); } 这种写法会导致MCU跑飞 void main() { unsigned char s; mInitSTDIO(); s=mInitCH376Host(); while(1); } 为什么加while(1);需要你仔细了解MCU原理。 你可以测试一下是什么问题导致乱码。波特率是否正确,打印数据的时候是否被打断等等都可能导致乱码


能告诉我为什么吗?


如果不加的话 执行完 s=mInitCH376Host(); 单片机怎么往下运行?PC(程序计数器)的值是多少?很可能导致真个main函数死循环运行 以后写程序务必注意这点


1、P1口有方向问题,读数据时,需要P1 = 0xFF以切换方向为输入 2、串口乱码可能与串口软件有关,最好打印英文 3、至于死机,单片机程序要求是一个闭环,否则程序会跑飞


我刚买了CH376评估板开发模块,单片机用的也是STC89c52,想把采集的数据存到u盘,希望高手指点,我qq 451229240.


谢谢红桃六,SCM,这几天有事耽搁了,我用的是普通的51单片机,P1口是双向且有上拉电阻的,我发现开超级终端连接后一上电就是一直显示"通讯接口正常",接上U盘后也是一直在显示这句话.好像后面设置USB工作模式都不成功,这是为什么啊?


加一点串口调试,监控一下程序到底停在哪一步了


嗯,是加了串口调试,监控程序一直停在" UINT8 mInitCH376Host( void ) /* 初始化CH376 */ { UINT8 res; CH376_PORT_INIT( ); /* 接口硬件初始化 */ xWriteCH376Cmd( CMD11_CHECK_EXIST ); /* 测试单片机与CH376之间的通讯接口 */ xWriteCH376Data( 0x65 ); res = xReadCH376Data( ); if ( res != 0x9A ) { return( ERR_USB_UNKNOWN ); printf( "通讯接口不正常 \n" ); } /* 通讯接口不正常,可能原因有:接口连接异常,其它设备影响(片选不唯一),串口波特率,一直在复位,晶振不工作 */ printf( "通讯接口正常 \n" ); xWriteCH376Cmd( CMD11_SET_USB_MODE ); /* 设备USB工作模式 */ xWriteCH376Data( 0x06 ); mDelayuS( 20 ); res = xReadCH376Data( ); if ( res == CMD_RET_SUCCESS ) {return( USB_INT_SUCCESS ); printf( "设置模式成功 \n" );} else { return( ERR_USB_UNKNOWN ); printf( "设置模式错误 \n" );}/* 设置模式错误 */ } "中的" printf( "通讯接口正常 \n" ); ",超级终端一直不停的往下显示通讯接口正常 .SCM,麻烦你看看我前面6楼发的程序,非常感谢!


“一直不停的往下显示通讯接口正常”?像是单片机在不停的复位,mDelayuS( 20 )是怎么做的,屏蔽掉试试


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