logo

求助,代码付上,CH376S怎么读取U盘文件

#define CH376_CMD_PORT (*((unsigned char xdata*)(0x8001)))

#define CH376_DAT_PORT (*((unsigned char xdata*)(0x8000)))


unsigned char s;

unsigned int PC=0x0000;


void Sleep(const unsigned int a)

{

unsigned long b=a;

b=b*31;

while(b)--b;

}


void main()

{

CH376_CMD_PORT=0x05;/* 发送0x05给CH376_CMD端口,执行硬件复位 */

do{

CH376_CMD_PORT=0x06;/* 发送0x06给CH376_CMD端口,测试通讯接口和工作状态 */

CH376_DAT_PORT=0x55;/* 发送0x55给CH376_CMD端口 */

}while(CH376_DAT_PORT-0xAA);/* 读取CH376_DAT端口,返回输入的反值则表示通讯正常,其它表示通讯有问题或者复位未完成,循环执行do{}里的程序 */


CH376_CMD_PORT=0x15;/* 发送0x15给CH376_CMD端口:切换芯片模式 */

    CH376_DAT_PORT=0x07;/* 发送0x07给CH376_DAT端口:切换芯片07模式,复位USB总线*/

while(CH376_DAT_PORT-0x51);/* 循环读取CH376_DAT端口,返回51H则成功,其它未完成,循环读取CH376_DAT端口 */


CH376_CMD_PORT=0x15;/* 发送0x15给CH376_CMD端口:切换芯片模式 */

    CH376_DAT_PORT=0x06;/* 发送0x06给CH376_DAT端口:切换芯片06模式,主机模式*/

while(CH376_DAT_PORT-0x51);/* 循环读取CH376_DAT端口,返回51H则成功,其它未完成,循环读取CH376_DAT端口 */


do{

CH376_CMD_PORT=0x31;/* 发送0x31给CH376_CMD端口:识别USB磁盘类型 */

Sleep(1000);/* 等待1000毫秒 */

CH376_CMD_PORT=0x22;/* 获取中断状态并取消中断请求 */

}while(CH376_DAT_PORT-0x14);


do{

CH376_CMD_PORT=0x2F;/* 设置要打开的文件名 */

CH376_DAT_PORT='/';

CH376_DAT_PORT='1';

CH376_DAT_PORT='.';

CH376_DAT_PORT='B';

CH376_DAT_PORT='I';

CH376_DAT_PORT='N';

CH376_DAT_PORT=0x00;


CH376_CMD_PORT=0x32;/* 打开的文件名操作 */

Sleep(1000);/* 等待1000毫秒 */

CH376_CMD_PORT=0x22;/* 获取中断状态并取消中断请求 */

}while(CH376_DAT_PORT-0x14);


CH376_CMD_PORT=0x3A;

CH376_DAT_PORT=0x20;

CH376_DAT_PORT=0x00;/* 设置32字节 */


do{

CH376_CMD_PORT=0x22;/* 获取中断状态并取消中断请求 */

}while(CH376_DAT_PORT-0x1D);


do{

CH376_CMD_PORT=0x27;

s=CH376_DAT_PORT;


while(s)

{

(*((unsigned char xdata*)(PC)))=CH376_DAT_PORT;

++PC;

--s;

}

CH376_CMD_PORT=0x3B;/* 下一个数据块 */

}while(CH376_DAT_PORT-0x1D);



}

使用的51单片机。0000-7FFF为62256,8000为CH376S数据端口,8001为CH376S命令端口

INT引脚未连接,不使用

单片机与CH376S通讯可以通过,

现在U盘根目录有个8192字节的1.BIN文件,要把它装入62256的0000-1FFF,但是数据全是错的,不知道是怎么回事,求帮忙看看是哪里错了


热门产品推荐 : CH9120:网络串口透传芯片

整体处理结构不对,无任何中断判断部分,22命令执行的有效性是由中断确定的,请参考376 FILESYS.C文件提供的函数修改。建议直接使用该文件。


                           

整体处理结构不对,无任何中断判断部分,22命令执行的有效性是由中断确定的,请参考376 FILESYS.C文件提供的函数修改。建议直接使用该文件。

                       

3.7. 字节方式读文件 

操作步骤如下: 

1、发送 CMD2H_BYTE_READ(3AH)字节读数据命令; 

2、发送需要写后续数据长度。最多写数据长度为 65535; 

3、等待中断。如果中断状态为 USB_INT_DISK_READ(1DH)。则发送 CMD01_RD_USB_DATA0(27H)命

令。接着读后续数据长度。如果长度为非 0 数据,循环读取数据; 

4、读取完数据之后发送 CMD0H_BYTE_RD_GO(3BH)命令。如果中断状态为

USB_INT_DISK_READ(1DH),则跳到步骤 3 继续读。如果为其他中断状态,则读取数据完成;



CH376_CMD_PORT=0x3A;

CH376_DAT_PORT=0x20;    //低位

CH376_DAT_PORT=0x00; //高位 /* 设置32字节 */

do{

CH376_CMD_PORT=0x22; /* 获取中断状态并取消中断请求 */

}while(CH376_DAT_PORT-0x1D);            //循环等待中断状态为USB_INT_DISK_READ(1DH)


do{

CH376_CMD_PORT=0x27;//发送 CMD01_RD_USB_DATA0(27H)命令

s=CH376_DAT_PORT;   //接着读后续数据长度(这里是要读1字节还是2字节,上面都设置2字节了)

while(s)

{

(*((unsigned char *)(PC)))=CH376_DAT_PORT; /* 将数据写到62256 0000H-0400H*/

++PC;

--s;

}

CH376_CMD_PORT=0x3B; /* 下一个数据块 */

CH376_CMD_PORT=0x22; /* 获取中断状态并取消中断请求 */

}while(CH376_DAT_PORT==0x1D);


我还是取不到数据,大大帮我看看,哪个顺序错了


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