CH372 U盘问题

用STM32F101 IO口模拟时序,32K RAM作为模拟的U盘空间,只开启了一个INT中断,将CH372DSK.ZIP的文件更改了底层接口,以及源程序中对C51大端模式的更改(LEN.mdataLen[0]和LEN.mdataLen[1]对调)。连接电脑时可以认出大容量存储设备,BUS HOUND多数时候可以认出“沁恒电子U盘方案”,PC我的电脑里偶尔有可移动磁盘(大部分时候没有),但可移动磁盘的属性的已用空间和可用空间均为 0字节。 请帮忙分析原因 另外,void mCH375UpCsw()中 MassPara.buf[8]=0; MassPara.buf[9]=0; MassPara.buf[10]=LEN.mdataLen[0]; MassPara.buf[11]=LEN.mdataLen[1]; 为什么不是 MassPara.buf[8]=LEN.mdataLen[0]; MassPara.buf[9]=LEN.mdataLen[1]; MassPara.buf[10]=0; MassPara.buf[11]=0; 谢谢! 如果可以,请回复到个人信息保护,已隐藏 苏州文沃电子 王阔[Emot]8[/Emot]

上面的赋值是UFI规定的强制为高字节在前,低字节在后。还有就是如果出现“沁恒电子U盘方案”这个说明12H的命令返回成功,而读取的字节为0则说明25或者23的命令返回是有问题的。需要在BUSHOUND里面去查下问题在什么地方。看计算机发了哪条命令下面的设备未返回。


通过EP2 OUT 写入64Byte: 55 53 42 43 00 00 00 00 08 00 00 00 80 00 00 25 00... 可以返回: 3f 00 00 00 00 02 00 00,但在电脑里显示可用/已用空间都是0字节……悲剧,求教


主程序:

int main(void) { int8u status; status = status; back_time = 200; System_Init(); printer_pwr_on(); DiskInit(); //对SRAM进行初始化,默认格式化,如果是闪存那么应该跳过此步 CH375_Init( ); /* 初始化CH375 */ while(1) { } }

中断程序:

void EXTI9_5_IRQHandler(void) { EXTI->PR = 0X0100; usb_int_handle(); }

USBDISK.C中有改动的部分:

unsigned char udisk[32768];

void CH375_WR_CMD_PORT( unsigned char cmd ) { /* 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 */

// GPIO_SetBits(GPIOA, GPIO_Pin_9 ); // /WR // GPIO_SetBits(GPIOA, GPIO_Pin_10); // /RD GPIO_SetBits(GPIOA, GPIO_Pin_11); // A0 if(cmd & 0x01) GPIOC->BSRR = (1 << 9); else GPIOC->BRR = (1 << 9); if(cmd & 0x02) GPIOC->BSRR = (1 << 8); else GPIOC->BRR = (1 << 8); if(cmd & 0x04) GPIOC->BSRR = (1 << 7); else GPIOC->BRR = (1 << 7); if(cmd & 0x08) GPIOC->BSRR = (1 << 6); else GPIOC->BRR = (1 << 6); if(cmd & 0x10) GPIOB->BSRR = (1 << 15); else GPIOB->BRR = (1 << 15); if(cmd & 0x20) GPIOB->BSRR = (1 << 14); else GPIOB->BRR = (1 << 14); if(cmd & 0x40) GPIOB->BSRR = (1 << 13); else GPIOB->BRR = (1 << 13); if(cmd & 0x80) GPIOB->BSRR = (1 << 12); else GPIOB->BRR = (1 << 12); GPIO_ResetBits(GPIOA, GPIO_Pin_9 ); // /WR GPIO_SetBits(GPIOA, GPIO_Pin_9 ); // /WR // CH375_CMD_PORT=cmd; }

void CH375_WR_DAT_PORT( unsigned char dat ) { /* 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 */ // CH375_DAT_PORT=dat; // GPIO_SetBits(GPIOA, GPIO_Pin_9 ); // /WR // GPIO_SetBits(GPIOA, GPIO_Pin_10); // /RD GPIO_ResetBits(GPIOA, GPIO_Pin_11); // A0 if(dat & 0x01) GPIOC->BSRR = (1 << 9); else GPIOC->BRR = (1 << 9); if(dat & 0x02) GPIOC->BSRR = (1 << 8); else GPIOC->BRR = (1 << 8); if(dat & 0x04) GPIOC->BSRR = (1 << 7); else GPIOC->BRR = (1 << 7); if(dat & 0x08) GPIOC->BSRR = (1 << 6); else GPIOC->BRR = (1 << 6); if(dat & 0x10) GPIOB->BSRR = (1 << 15); else GPIOB->BRR = (1 << 15); if(dat & 0x20) GPIOB->BSRR = (1 << 14); else GPIOB->BRR = (1 << 14); if(dat & 0x40) GPIOB->BSRR = (1 << 13); else GPIOB->BRR = (1 << 13); if(dat & 0x80) GPIOB->BSRR = (1 << 12); else GPIOB->BRR = (1 << 12); GPIO_ResetBits(GPIOA, GPIO_Pin_9 ); // /WR GPIO_SetBits(GPIOA, GPIO_Pin_9 ); // /WR } void change_to_input(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //USB 7..4 GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //USB 3..0 GPIO_Init(GPIOC, &GPIO_InitStructure); } void change_to_output(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; //USB 7..4 GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9); // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; //USB 3..0 GPIO_Init(GPIOC, &GPIO_InitStructure); }

unsigned char CH375_RD_DAT_PORT() { /* 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 */ unsigned char i8,i,a,x, xx; unsigned short i16; // GPIO_SetBits(GPIOA, GPIO_Pin_9 ); // /WR // GPIO_SetBits(GPIOA, GPIO_Pin_10); // /RD GPIO_ResetBits(GPIOA, GPIO_Pin_11); // A0 change_to_input(); GPIO_ResetBits(GPIOA, GPIO_Pin_10); // /RD i16 = GPIO_ReadInputData(GPIOB); i16 >>= 12; i16 &= 0x0f; i16 |= ((GPIO_ReadInputData(GPIOC) >> 2) & 0xf0); GPIO_SetBits(GPIOA, GPIO_Pin_10); // /RD change_to_output(); i8 = (unsigned char)i16; a = 0; x = 0x80; xx = 0x01; for(i=0; i<8; ++i) { if(i8 & xx) a |= x; x >>= 1; xx <<= 1; } // return( CH375_DAT_PORT ); return a; }

void CH375_Init( ) { unsigned char i; /* 设置USB工作模式, 必要操作 */ GPIO_ResetBits(GPIOA, GPIO_Pin_12); // CS = 0; // os_dly_wait(1); CH375_WR_CMD_PORT( CMD_SET_USB_MODE ); CH375_WR_DAT_PORT( 1 ); /* 设置为使用WAI置固件的USB设备方式 */ Delay2us( ); for ( i=0xff; i!=0; i-- ) { /* 等待操作成功,通常需要等待10uS-20uS */ if ( CH375_RD_DAT_PORT()==CMD_RET_SUCCESS ) break; } EXTI->PR = 0x0007ffff; EXTI->FTSR = 0X00000100; EXTI->IMR = 0x00000100; /* 下述启用中断,假定CH375连接在INT0 */ // IT0 = 0; /* 置外部信号为低电平触发 */ // IE0 = 0; /* 清中断标志 */ // EX0 = 1; /* 允许CH375中断 */ }

void UFI_read10(void){ //读取数据 LEN.mDataLength=MassPara.cbw.cbwcb.buf1[8]*512; pXDatbuf = udisk + MassPara.cbw.cbwcb.buf1[5]*512; pBuf=pXDatbuf; BcswStatus=0; mSenseKey=0; mASC=0;

}

mCH375BulkOnly中: LEN.mdataLen[0]=*(unsigned char *)(&MassPara.cbw.dCBWDatL); LEN.mdataLen[1]=*( (unsigned char *)(&MassPara.cbw.dCBWDatL) + 1 );

求救!


另外 单片机上电后电脑设备管理器里有大容量存储设备出现 但我的电脑里没有可移动磁盘,BUS HOUNT点一次RESET DEVICE后电脑出现可移动磁盘I:, 空间依然是0字节...


那其他命令返回正确吗?


标准请求没问题。 另外,void mCH375UpCsw()中(C51源程序) MassPara.buf[8]=0; MassPara.buf[9]=0; MassPara.buf[10]=LEN.mdataLen[1]; MassPara.buf[11]=LEN.mdataLen[0]; 这个好像不是UFI的内容。并且,即使是高字节在前,在C51中的LEN.mdataLen[1]应该是低字节(0-7bit),而LEN.mdataLen[0]是高字节(8-15bit),那么应该是MassPara.buf[10]=LEN.mdataLen[0]; MassPara.buf[11]=LEN.mdataLen[1];才对?


我需要看下你的详细的数据返回。建议你把BUSHOUND里面抓取到的数据贴出来看下。


问题已解决,多谢协助! 原因在于PC写命令25时 应该返回: 00 00 00 3f 00 00 02 00 而不是 3f 00 00 00 00 02 00 00


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