CH375B CMD_DISK_SIZE 出错

用的是给的标准的代码,只是把它移到ARM中,U盘出初化代码出错。有那位高手帮看一下。 unsigned char mInitDisk( ) { unsigned char mIntStatus, i; CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 产生操作完成中断, 获取中断状态 */ mIntStatus = CH375_RD_DAT_PORT( ); if ( mIntStatus == USB_INT_DISCONNECT ) return( mIntStatus ); /* USB设备断开 */ CH375_WR_CMD_PORT( CMD_DISK_INIT ); /* 初始化USB存储器 */ mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */ if ( mIntStatus != USB_INT_SUCCESS ) return( mIntStatus ); /* 出现错误 */ CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 获取USB存储器的容量 */ mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */ Uart_Printf("\tfirst time error %x\n",mIntStatus); if ( mIntStatus != USB_INT_SUCCESS ) { /* 出错重试 */ mDelaymS( 200 ); CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 获取USB存储器的容量 */ mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */ } if ( mIntStatus != USB_INT_SUCCESS ) return( mIntStatus ); /* 出现错误 */ return( 0 ); // U盘已经成功初始化 }

表达清楚写,哪里有错,返回的错误代码是什么。 CMD_DISK_SIZE 如果失败,延时200MS后,继续发送CMD_DISK_SIZE ,还是失败再延时200MS,再发送CMD_DISK_SIZE ,如此循环,实验一下看结果


谢谢你的回复,就是写入CMD_DISK_SIZE 后,通过mWaitInterrupt( );得到的是0x1f(USB_INT_DISK_ER)。所以没办法往下了,我用你的循环法试一下。。。


main()里面调用mInitDisk()函数进行初始化 void Main(void) { unsigned char aa,i,mIntStatus=0x00,c=1; rSYSCFG=CACHECFG;// Using 8KB Cache// Port_Init(); /*把PG0配置成输入方式.用于查询375的INT端口*/ rPCONG = 0x00fc; //PG0 Input rPUPG = 0xff; //pull-up regiseter should be enabled rPDATG =0x0ff; //initing PG Port 1 Uart_Init(0,115200); Led_Display(0xf); Uart_Select(0); //Select UART0// CH375_WR_CMD_PORT(CMD_CHECK_EXIST);// 测试工作状态 CH375_WR_DAT_PORT(0xaa);// 测试数据 aa = CH375_RD_DAT_PORT();// 返回数据应该是测试数据取反 if(aa==0x55)Uart_Printf("data checking MCH375 is successed!\n"); else Uart_Printf("data checking MCH375 is failed!\n"); i = mCH375Init( ); // 初始化CH375 mStopIfError( i );

while ((mIntStatus=mWaitInterrupt())==USB_INT_DISCONNECT ); /* 等待U盘连接 */ mDelaymS( 200 ); c=mInitDisk(); if ( c ) Uart_Printf( "Error @InitDisk, %02X\n", c ); else if(c==0) Uart_Printf( " @InitDisk successed\n" ); }

这个U盘始子程序,是照搬的, unsigned char mInitDisk( ) { unsigned char mIntStatus, i; CH375_WR_CMD_PORT( CMD_GET_STATUS ); // 产生操作完成中断, 获取中断状态 mIntStatus = CH375_RD_DAT_PORT( ); if ( mIntStatus == USB_INT_DISCONNECT ) return( mIntStatus ); // USB设备断开 CH375_WR_CMD_PORT( CMD_DISK_INIT ); /* 初始化USB存储器 */ mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */ if ( mIntStatus != USB_INT_SUCCESS ) return( mIntStatus ); /* 出现错误 */ CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 获取USB存储器的容量 */ mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */ Uart_Printf("\tfirst time error %x\n",mIntStatus); do{ /* 出错重试 */ mDelay100mS( ); mDelay100mS( ); CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 获取USB存储器的容量 */ mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */ }while(mIntStatus != USB_INT_SUCCESS ); // if ( mIntStatus != USB_INT_SUCCESS ) // return( mIntStatus ); /* 出现错误 */

/* // 可以由CMD_RD_USB_DATA命令将容量数据读出,分析每扇区字节数 CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); // 从CH375缓冲区读取数据块 i = CH375_RD_DAT_PORT( ); // 后续数据的长度 if ( i != 8 ) return( USB_INT_DISK_ERR ); // 异常 for ( i = 0; i != 8; i ++ ) { // 根据长度读取数据 DATA_BUFFER[ i ] = CH375_RD_DAT_PORT( ); //读出数据并保存 } i = DATA_BUFFER[ 6 ]; // U盘容量数据中的每扇区字节数,大端格式 if ( i == 0x04 ) BlockPerSector = 1024/CH375_BLOCK_SIZE; // 磁盘的物理扇区是1K字节 else if ( i == 0x08 ) BlockPerSector = 2048/CH375_BLOCK_SIZE; // 磁盘的物理扇区是2K字节 else if ( i == 0x10 ) BlockPerSector = 4096/CH375_BLOCK_SIZE; // 磁盘的物理扇区是4K字节 else BlockPerSector = 512/CH375_BLOCK_SIZE; // 默认的磁盘的物理扇区是512字节 BytePerSector = BlockPerSector*CH375_BLOCK_SIZE; // 物理磁盘的扇区大小 CH375_WR_CMD_PORT( CMD_SET_PKT_P_SEC ); // 设置USB存储器的每扇区数据包总数 CH375_WR_DAT_PORT( 0x39 ); CH375_WR_DAT_PORT( BlockPerSector ); // 设置每扇区数据包总数 */ return( 0 ); // U盘已经成功初始化 }

我用了循环,不过还是不行,会一直在循环!!!


main()里面调用mInitDisk()函数进行初始化 void Main(void) { mDelaymS( 200 ); c=mInitDisk(); //在这里调用, if ( c ) Uart_Printf( "Error @InitDisk, %02X\n", c ); else if(c==0) Uart_Printf( " @InitDisk successed\n" ); }

这个U盘始子程序,是照搬的, unsigned char mInitDisk( ) { unsigned char mIntStatus, i; CH375_WR_CMD_PORT( CMD_GET_STATUS ); // 产生操作完成中断, 获取中断状态 mIntStatus = CH375_RD_DAT_PORT( ); if ( mIntStatus == USB_INT_DISCONNECT ) return( mIntStatus ); // USB设备断开 CH375_WR_CMD_PORT( CMD_DISK_INIT ); /* 初始化USB存储器 */ mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */ if ( mIntStatus != USB_INT_SUCCESS ) return( mIntStatus ); /* 出现错误 */ CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 获取USB存储器的容量 */ mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */ Uart_Printf("\tfirst time error %x\n",mIntStatus); do{ /* 出错重试 */ mDelay100mS( ); mDelay100mS( ); CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 获取USB存储器的容量 */ mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */ }while(mIntStatus != USB_INT_SUCCESS ); // if ( mIntStatus != USB_INT_SUCCESS ) // return( mIntStatus ); /* 出现错误 */

/* // 可以由CMD_RD_USB_DATA命令将容量数据读出,分析每扇区字节数 CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); // 从CH375缓冲区读取数据块 i = CH375_RD_DAT_PORT( ); // 后续数据的长度 if ( i != 8 ) return( USB_INT_DISK_ERR ); // 异常 for ( i = 0; i != 8; i ++ ) { // 根据长度读取数据 DATA_BUFFER[ i ] = CH375_RD_DAT_PORT( ); //读出数据并保存 } i = DATA_BUFFER[ 6 ]; // U盘容量数据中的每扇区字节数,大端格式 if ( i == 0x04 ) BlockPerSector = 1024/CH375_BLOCK_SIZE; // 磁盘的物理扇区是1K字节 else if ( i == 0x08 ) BlockPerSector = 2048/CH375_BLOCK_SIZE; // 磁盘的物理扇区是2K字节 else if ( i == 0x10 ) BlockPerSector = 4096/CH375_BLOCK_SIZE; // 磁盘的物理扇区是4K字节 else BlockPerSector = 512/CH375_BLOCK_SIZE; // 默认的磁盘的物理扇区是512字节 BytePerSector = BlockPerSector*CH375_BLOCK_SIZE; // 物理磁盘的扇区大小 CH375_WR_CMD_PORT( CMD_SET_PKT_P_SEC ); // 设置USB存储器的每扇区数据包总数 CH375_WR_DAT_PORT( 0x39 ); CH375_WR_DAT_PORT( BlockPerSector ); // 设置每扇区数据包总数 */ return( 0 ); // U盘已经成功初始化 }

我用了循环,不过还是不行,会一直在循环!!!串口调试端输出:first time error 1f


怎么没看到CH375的初始化?


有啊,CH375的初始化就是设置它的工作模式吧。 在函数中有 i = mCH375Init( ); // 初始化CH375 mStopIfError( i );

子函数在usb.c中定义:

unsigned char mCH375Init( ) { unsigned char c; unsigned int i; CH375_WR_CMD_PORT( CMD_SET_USB_MODE ); /* 设置USB工作模式 */ CH375_WR_DAT_PORT( 6 ); /* 模式代码,自动检测USB设备连接 */ for ( i = 0xffff; i != 0; i -- ) { /* 等待操作成功,通常需要等待10uS-20uS */ c = CH375_RD_DAT_PORT(); if ( c == CMD_RET_SUCCESS ) break; /* 操作成功 */ } //if( c == CMD_RET_SUCCESS)return( USB_INT_SUCCESS ); if ( c == CMD_RET_SUCCESS ) return( USB_INT_SUCCESS ); /* 操作成功 */ else return( 0xff ); /* CH375出错,例如芯片型号错或者处于串口方式或者不支持 */ }


主函数哪里调用的?


void Main(void) { unsigned char aa,i,mIntStatus=0x00,c=1; rSYSCFG=CACHECFG;// Using 8KB Cache// Port_Init();

/*把PG0配置成输入方式.用于查询375的INT端口*/ rPCONG = 0x00fc; //PG0 Input rPUPG = 0xff; //pull-up regiseter should be enabled rPDATG =0x0ff; //initing PG Port 1

Uart_Init(0,115200); Led_Display(0xf); Uart_Select(0); //Select UART0//

CH375_WR_CMD_PORT(CMD_CHECK_EXIST);// 测试工作状态

CH375_WR_DAT_PORT(0xaa);// 测试数据

aa = CH375_RD_DAT_PORT();// 返回数据应该是测试数据取反 if(aa==0x55)Uart_Printf("data checking MCH375 is successed!\n"); else Uart_Printf("data checking MCH375 is failed!\n");

i = mCH375Init( ); // 初始化CH375 //这里调用。。。 mStopIfError( i );

while ((mIntStatus=mWaitInterrupt())==USB_INT_DISCONNECT ); /* 等待U盘连接 */ mDelaymS( 200 ); c=mInitDisk(); if ( c ) Uart_Printf( "Error @InitDisk, %02X\n", c ); else if(c==0) Uart_Printf( " @InitDisk successed\n" ); }


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