完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
我插上U盘一点反应都没有,本人小菜 求大侠指点迷津
#include "config.h" #include "CH376INC.h" /************************************************************************/ /* smart2200引脚 CH376芯片的引脚 P1.16 INT# P1.17 A0 P1.18 CS# P1.19 WR# P1.20 RD# P2.16-P2.23(8位端口) D7-D0 */ void mDelay0_5uS( void ) /* 至少延时0.5uS,根据单片机主频调整 */ { int i=1; for(;i!=0;i--); } void mDelayuS( UINT8 us ) { //while ( us -- ); /* 24MHz MCS51 */ us = us*2*4; while ( us -- ); //11.059200*4MHZ ARM } /* 延时指定毫秒时间,根据单片机主频调整,不精确 */ void mDelaymS( UINT8 ms ) { while ( ms -- ) { mDelayuS( 250 ); mDelayuS( 250 ); mDelayuS( 250 ); mDelayuS( 250 ); } } void CH376_PORT_INIT( void ) /* 由于使用通用I/O模拟并口读写时序,并口初始化 */ { PINSEL2 &=0xFFFFFFF4; //P1.16~P1.25为GPIO PINSEL2 |=0x00000030; //P2.16~P2.23为GPIO IO1SET |= 0x001C0000; /* 设置CS,WR,RD默认为高电平 */ IO2DIR |= 0x00000000; /* 设置8位并口和INT#为输入 */ IO1DIR |= 0x001E0000; /* 设置CS,WR,RD,A0为输出 */ } void WriteCH376Cmd( UINT8 mCmd ) /* 外部定义的被CH376程序库调用的子程序,向CH376写命令 */ { mDelayuS(2); /* 至少延时1uS */ IO2CLR |= 0x00FF0000; /* 清并口输出, P2.16-P2.23(8位端口)为并口 */ IO1SET |= 0x00120000; //输出A0(P1.17)=1,CS=0,WR=0,RD=1; IO1DIR |= 0x001E0000; /* 设置CS,WR,RD,A0为输出 */ IO2SET |= ( (UINT32)mCmd << 16 ); /* 向CH376的并口输出数据,移16位是由于P2.16~P2.23为GPIO */ IO1SET |= 0x000C0000; //WR=1,CS=1,A0=1 mDelayuS(2); /* 至少延时2uS */ } void WriteCH376Data( uint32 mData ) /* 外部定义的被CH375程序库调用的子程序,向CH375写数据 */ { mDelayuS(2); /* 至少延时1uS */ //uint32 mCmd; IO2CLR |= 0x00FF0000; /* 清并口输出 */ IO1SET |= 0x00100000; //输出A0(P1.17)=0,CS=0,WR=0,RD=1; IO1DIR |= 0x001E0000; /* 设置CS,WR,RD,A0为输出 */ IO2SET |= ( (uint32)mData << 16 ); /* 向CH376的并口输出数据,移16位是由于P2.16~P2.23为GPIO */ IO1SET |= 0x000E0000; //WR=1,CS=1,A0=1 mDelayuS(2); /* 至少延时2uS */ } UINT8 ReadCH376Data( void ) /* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */ { UINT8 mData; mDelayuS(2); /* 至少延时1.2uS */ IO2DIR &= 0xFF00FFFF; /* 读操作输入 */ IO1SET |=0x00100000; //输出A0(P1.17)=0,CS=0,WR=0,RD=1; IO1DIR |= 0x001E0000; /* 设置CS,WR,RD,A0为输出 */ mData = (UINT8)( IO2PIN >> 16 ); /* 从CH376的并口P2.16-P2.23输入数据 */ IO1SET |= 0x000E0000; //WR=1,CS=1,A0=1 mDelayuS(2); /* 至少延时2uS */ return( mData ); } /****************************************************************** - 功能描述:初始化CH376芯片 - 隶属模块:CH376模块 - 函数属性:外部,供用户调用 - 参数说明:无 - 返回说明:执行结果 ******************************************************************/ UINT8 CH376_Init() { UINT8 i=0; WriteCH376Cmd(CMD_GET_IC_VER); /* 获取芯片及固件版本 */ i=ReadCH376Data(); /* 版本 */ if(i<0xA2) return 1; /* 不支持该芯片 */ WriteCH376Data(CMD_SET_USB_MODE); /* 设置USB工作模式 */ WriteCH376Data(6); /* 模式代码,自动检测USB设备连接 */ for(i=0;i<250;i++) { /* 等待操作成功,通常需要等待10uS-20uS */ mDelayuS(20) ; if(ReadCH376Data()==CMD_RET_SUCCESS ) return 0; /* 操作成功 */ } return 1; /* CH376出错,例如芯片型号错或者处于串口方式或者不支持 */ } UINT8 CH376_Wait_Int() //等待中断信号,即INT引脚上产生低电平,并获取中断状态码,获取后INT恢复高电平,以产生下一次中断信号 { IO1SET |= 0x00010000;//INT=P1.16先为高电平 while(IO1PIN &= 0x00010000 ==0 ); //等待中断,INT=P1.16变为高电平 WriteCH376Cmd( CMD_GET_STATUS);//产生操作完成中断,获取中断状态 return ReadCH376Data(); } /****************************************************************** - 功能描述:初始化磁盘 - 隶属模块:CH376模块 - 函数属性:外部,供用户调用 - 参数说明:无 - 返回说明:操作结果,0表示初始化磁盘成功 1表示初始化磁盘失败 - 注:在使用U盘之前,先要调用此函数,此函数将进行判断 磁盘是否连接,初始化是否成功等操作 ******************************************************************/ UINT8 CH376_InitDisk() { UINT8 status,i,j=0; status=CH376_Wait_Int(); if(status==USB_INT_DISCONNECT) return 1; /* USB设备断开 */ while(1) { WriteCH376Cmd(CMD_DISK_INIT); /* 初始化USB存储器 */ status=CH376_Wait_Int(); /* 等待中断并获取状态 */ if(status==USB_INT_SUCCESS) break; } while(1) //以下代码均源自沁恒的官方U盘初始化函数,借用它可以提高对U盘的兼容性! { j++; WriteCH376Cmd(CMD_DISK_SIZE); /* 获取USB存储器的容量 */ status=CH376_Wait_Int(); /* 等待中断并获取状态 */ if(status==USB_INT_SUCCESS) break; else { mDelaymS(2) ; WriteCH376Cmd(CMD_DISK_R_SENSE); /* 获取USB存储器的容量 */ status=CH376_Wait_Int(); /* 等待中断并获取状态 */ if(status==USB_INT_SUCCESS) /* 出现错误 */ continue; else return 1; } if(j==5) return 1; } for(i=0;i!=5;i++) { WriteCH376Cmd( CMD_DISK_READY ); /* 获取USB存储器的容量 */ status=CH376_Wait_Int(); /* 等待中断并获取状态 */ if(status==USB_INT_SUCCESS) return 0; /* U盘已经成功初始化 */ } return 1; } int main(void) { CH376_Init(); //初始化CH375芯片 CH376_InitDisk(); //初始化U盘 } |
|
相关推荐
3个回答
|
|
国产的芯片,直接跟厂家沟通,最直接,下个例程序测试一下
|
|
|
|
|
|
|
|
您好 你的问题解决了吗? 我想看一下您的IO2DIR IO1SET 这样的定义 我也在做CH376的事情 用的是16位的单片机 他们之间的通讯弄不清楚了
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
飞凌嵌入式ElfBoard ELF 1板卡-CAN编程示例之开发板测试
654 浏览 0 评论
该问题是用APP给芯海科技的CST92F25芯片发指令是出现的
2242 浏览 1 评论
771 浏览 0 评论
1530 浏览 1 评论
2276 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 06:07 , Processed in 0.616693 second(s), Total 76, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号