我的375能正确的读回测试信号(输入0xAA,返回0X5500) 当我插上U盘时返回0X1600,头文件里指明16是U盘断开。测试插上U盘时V+=4.01v 有两问题: 1.如何保证V+供电为5V,我直接提供5V给V+可行吗?我按照官方提供的电路无论R2取值为多少V+均为4.1V左右。是不是图有问题? 2.为什么在串口助手显示的返回值后面均有00? 请高手指点一二。 串口助手显示如下: test:5f00 test:5500 Insert USB disk chipan chushihua:1600 Error status, 22
1.R2电阻可以不加 可以使用计算机的USB口提供5v电压. 2.把串口输出方式换为 printf("%02x \n",(unsigned short)i); 3.你的CH375是工作在几伏的?
在U盘不插的时候电压是几V?请不要怀疑电路的正确性,我们能保证电路100%正确.您直接给VCC 5V电压就可以了.R2的电阻值一定要小.5欧姆以下.现在先解决您的硬件问题.4.01V的电压U盘根本就无法工作.
U盘不插的时候是5v,那我直接把R2换成导线可以不?
换了后插上U盘V+=5,vd-=0.5v,vd+=3.35v 我想知道为什么返回值为0x5500而不是0x55?
这跟你的打印格式有关系
如果供电在5V以下的话.可以使用升压IC!不过这样最高的效率在90% 而且价格比比较高!如果在5V或5V以上的话.可以使用LDO稳压IC! 我认为最好的办法是使用6V以上,降压输出!效率在98%以上!电压稳定,可以过大电流!
“这跟你的打印格式有关系” 不懂!!!!!!!!!!! 请说明清楚点
是和打印格式有关的,在KEIL编译器中,%X是按照4个字节输出,所以要强制转换为unsigned shor 型数据.由于您输出的数据实际长度不大于2个字节用%02X就可以了. 也就是1楼所说的printf("%02x \n",(unsigned short)i);
非常感谢你们的解答!!!!!!!!!! 明白了!
学到东西了 顶个
大家好!请教几个问题! 我在做用CH375B读写手机的U盘!有些手机可以读写!但有50%不行 大家都知道手机的充电脚电压最高在4.3V。 CH375B的VCC电压为5V供电。 (1)不插手机时!对应的充电脚电压为4.8V。 (2)插入手机时!充电脚被拉低成了4.3V。 不行的原因在于:无法对手机的U盘进行枚举,不知道何故。 请问:(1)手机的充电脚电压为4.3V时,它的U盘能正常工作吗? (2)有些U盘是不是采用CBI传输协议?CH375B是不是没有内置CBI传输协议? (3)怎样编写单片机的外部固件程序?
(1)电压过低了,最好保证在4.7V以上 (2)没有内置CBI协议固件 (3)目前还没遇到CBI协议的U盘,固件程序不是一两句话能说的清楚的,您需要先了解一下协议,才知道从哪入手
呵!看来不是手机U盘供电的问题了! (1)给充电引脚提供5.2VDC的电压。(不插入手机时为5.2V) (2)当手机插入时充电引脚电压拉低成5.0V。此时给手机充电的电流很大!(500mA以上) (3)还是不能获取设备的描述符?
我把程序贴出来! 请各位大侠帮忙看看问题出在哪里? void TI_cmd_dat(uchar rp)//发送串行命令 { TI=0; TB8=1; SBUF=rp; while(!TI); TI=0; } void TI_data(uchar start) //发送串行数据 {
TI=0; TB8=0; SBUF=start; while(!TI); TI=0; } uchar RI_data(void) //接收串行数据 { uchar strsta; unsigned int j; //接收数据启用超时控制30ms for(j=10000;j!=0;j--) { if(RI) { RI=0; strsta=SBUF; return(strsta); } } return(0);//出错 }
uchar starut_st(void)//使用查询方式,并且获取中断的状态 { uchar j,k; bit grey=0; for(j=80;j!=0;j--) //等待70ms for(k=250;k!=0;k--) { INT0=1; if(INT0==0) { grey=1; j=1; break; } } //多次查询且延时 if(grey) { grey=0; TI_cmd_dat(0x22); //发送获取中断状态的命令码 return(RI_data()); //返回状态码 } else return(0);//出错返回‘0’ }
void set_usb_mode(uchar mode ) { uchar spk; TI_cmd_dat(0x15); _nop_(); _nop_(); TI_data(mode); times_10us(3); for(spk=50;spk!=0;spk--) { if(RI_data()==0x51) return; else { TI_data(mode); times_10us(3); } } green1=0; //灯亮则表明模式设定不成功 }
void CH375_int0(void) { uchar datbuf; uchar *buffer; set_usb_mode(5);//设定为已启用的USB模式5。并且自动查检USB设备的连接状态 if(starut_st()==0x15)//等待设备插入 { set_usb_mode(7); times_20ms(6); set_usb_mode(6); //结束复位,并且切换到已启用的模式6 if(starut_st()==0x15) //再次等待设备插入 { delay_times1s();//有些USB设备必须延时800MS以上才能正常工作 green=0; TI_cmd_dat(0x51);//初始化USB存储器 if(starut_st()==0x14)//USB 存储器初始化成功 { yes_sucess=0; } else { TI_cmd_dat(0x4d); //自动配置普通的USB存储设备 times_20ms(1);//等待CH375B操作完成 if(starut_st()==0x14) { yes_sucess=0; } else { TI_cmd_dat(0x46);//获取USB设备的描述符 _nop_(); _nop_();
TI_data(1);//描述符的类型1类型2配置 _nop_(); _nop_(); if(starut_st()==0x14)//成功获取USB设备的描述符 { TI_cmd_dat(0x28);//获取数据流的长度 _nop_(); _nop_();
datbuf=RI_data(); //接收到第一个字节为后续数据流的长度 if(datbuf>0) { yes_sucess=0; } while(datbuf--) { *buffer=RI_data(); buffer++; } } } } } } }
void pss_usb(void) { uchar i; TI_cmd_dat(0x06);//发送测试CH375是否工作正常的命令码 _nop_(); _nop_(); TI_data(0x57); //发送测试的数据 _nop_(); _nop_();
if(RI_data()==0xa8) CH375_int0();//CH375B工作正常,调用CH375B初始化函数 else { for(i=100;i!=0;i--) { TI_cmd_dat(0x05); times_20ms(4); //执行USB硬件复位
TI_cmd_dat(0x06); _nop_(); _nop_(); TI_data(0x55); _nop_(); _nop_(); if(RI_data()==0xaa) break; } if(i==0) { while(1) { red=!red; times_1s(); times_1s(); } } else CH375_int0(); } }
有些手机可以枚举成功! 但大部分手机不行。请各位帮忙看看问题出在哪里了! 会不会是在设定模式时的延时出了问题呀