UINT8 mReadSector( UINT32 iLbaStart, UINT8 iSectorCount, UINT8X *oDataBuffer ) { char *str1="开始读取U 盘", *str2="U 盘读取完毕", str3[]="0 "; UINT16 mBlockCount; UINT8 c; CH375_WR_CMD_PORT( CMD_DISK_READ ); // 从USB存储器读数据块 CH375_WR_DAT_PORT( (UINT8)iLbaStart ); // LBA的最低8位 CH375_WR_DAT_PORT( (UINT8)( iLbaStart >> 8 ) ); CH375_WR_DAT_PORT( (UINT8)( iLbaStart >> 16 ) ); CH375_WR_DAT_PORT( (UINT8)( iLbaStart >> 24 ) ); // LBA的最高8位 CH375_WR_DAT_PORT( iSectorCount ); // 扇区数 LCD_write_char( 0x01, 0 );// 清屏 LCD_write_string(0,0,str1); for ( mBlockCount = iSectorCount * 8; mBlockCount != 0; mBlockCount -- ) { str3[1]=mBlockCount+48; LCD_write_string(0,1,str3);//显示mBlockCount变量的值 c = mWaitInterrupt( ); // 等待中断并获取状态 if ( c == USB_INT_DISK_READ ) { // 等待中断并获取状态,请求数据读出 CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); // 从CH375缓冲区读取数据块 c = CH375_RD_DAT_PORT( ); // 后续数据的长度 str3[3]=c/10+48; str3[4]=c%10+48; LCD_write_string(0,1,str3);// 显示后续数据的长度 while ( c -- ) *oDataBuffer++ = CH375_RD_DAT_PORT( ); CH375_WR_CMD_PORT( CMD_DISK_RD_GO ); // 继续执行USB存储器的读操作 } else break; // 返回错误状态 } if ( mBlockCount == 0 ) { c = mWaitInterrupt( ); // 等待中断并获取状态 if ( c== USB_INT_SUCCESS ) return( 0 ); // 操作成功 LCD_write_string(0,1,str1); } return( c ); // 操作失败 }
调用它读取LBA=0的一个扇区,发现当mBlockCount=7时,也就是第二次执行循环时,在“c = mWaitInterrupt( ); ”处停止,也就是在上一个循环里执行CH375_WR_CMD_PORT( CMD_DISK_RD_GO ); 后芯片没有给出中断。
这可能是什么问题?
可以不可以将里面LCD的显示不要或者减少其显示?
我加显示是为了调试用啊,不加显示程序照样会卡住。
您的意思是什么?LCD显示函数会拖慢程序以致跟CH375的通讯不正常?
又测试了一下,第一次读到的64个字节全是0x40,这是怎么回事?
你用的是什么单片机以及晶振是多少?还有就是三个读写子函数可以不可以看下
void CH375_WR_CMD_PORT( UINT8 cmd ) { /* 向CH375的命令端口写入命令 */ delay_us(1); CH375_CONTROL_PORT |= CH375_A0; /* 输出A0=1 */ CH375_CMD_PORT = cmd; CH375_CMD_DDR = 0xFF; CH375_CONTROL_PORT |= CH375_A0; /* 输出有效写控制信号, 写CH375芯片的命令端口, A0=1; CS=0; WR=0; RD=1; */ CH375_CONTROL_PORT &= ~CH375_CS; CH375_CONTROL_PORT &= ~CH375_WR; CH375_CONTROL_PORT |= CH375_RD; CH375_CMD_DDR = 0xFF; /* 仅作延时,CH375要求读写脉冲宽度大于100nS */ CH375_CONTROL_PORT |= CH375_A0; /* 输出无效的控制信号, 完成操作CH375芯片, A0=1; CS=1; WR=1; RD=1; */ CH375_CONTROL_PORT |= CH375_CS; CH375_CONTROL_PORT |= CH375_WR; CH375_CONTROL_PORT |= CH375_RD; CH375_CMD_DDR = 0x00; /* 禁止数据输出 */ CH375_CONTROL_PORT &= ~CH375_A0; /* 输出A0=0; 可选操作 */ delay_us(2); /* 至少延时2uS */ }
void CH375_WR_DAT_PORT( UINT8 dat ) { /* 向CH375的数据端口写入数据 */ CH375_DAT_PORT = dat; /* 向CH375的并口输出数据 */ CH375_DAT_DDR = 0xFF; /* 并口D0-D7输出 */ CH375_CONTROL_PORT &= ~CH375_A0; /* 输出有效写控制信号, 写CH375芯片的数据端口, A0=0; CS=0; WR=0; RD=1; */ CH375_CONTROL_PORT &= ~CH375_CS; CH375_CONTROL_PORT &= ~CH375_WR; CH375_CONTROL_PORT |= CH375_RD; CH375_DAT_DDR = 0xFF;; /* 仅作延时,CH375要求读写脉冲宽度大于100nS */ CH375_CONTROL_PORT &= ~CH375_A0; /* 输出无效的控制信号, 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1; */ CH375_CONTROL_PORT |= CH375_CS; CH375_CONTROL_PORT |= CH375_WR; CH375_CONTROL_PORT |= CH375_RD; CH375_DAT_DDR = 0x00; /* 禁止数据输出 */ delay_us(1); }
UINT8 CH375_RD_DAT_PORT( void ) { /* 从CH375的数据端口读出数据 */ delay_us(1); CH375_DAT_DDR = 0x00; /* 数据输入 */ CH375_CONTROL_PORT &= ~CH375_A0; /* 输出有效读控制信号, 读CH375芯片的数据端口, A0=0; CS=0; WR=1; RD=0; */ CH375_CONTROL_PORT &= ~CH375_CS; CH375_CONTROL_PORT |= CH375_WR; CH375_CONTROL_PORT &= ~CH375_RD; CH375_DAT_DDR = 0x00; /* 仅作延时,CH375要求读写脉冲宽度大于100nS */ return( CH375_DAT_PIN ); /* 从CH375的并口PA输入数据 */ CH375_CONTROL_PORT &= ~CH375_A0; /* 输出无效的控制信号, 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1; */ CH375_CONTROL_PORT |= CH375_CS; CH375_CONTROL_PORT |= CH375_WR; CH375_CONTROL_PORT |= CH375_RD; }
我用Mega128L,8M晶振。数据占一组IO口,A0 CS WR RD INT占一组IO口中的5个。
我估计问题在CH375_RD_DAT_PORT()字程序中。
RESET_ALL、CHECK_EXIST、SET_USB_MODE、DISK_INIT、DISK_SIZE这些指令执行都没有问题。
你的读数据子函数有点问题,return数据提前返回了,应该改为: UINT8 CH375_RD_DAT_PORT( void ) { unsigned char data; /* 从CH375的数据端口读出数据 */ delay_us(1); CH375_DAT_DDR = 0x00; /* 数据输入 */ CH375_CONTROL_PORT &= ~CH375_A0; /* 输出有效读控制信号, 读CH375芯片的数据端口, A0=0; CS=0; WR=1; RD=0; */ CH375_CONTROL_PORT &= ~CH375_CS; CH375_CONTROL_PORT |= CH375_WR; CH375_CONTROL_PORT &= ~CH375_RD;
CH375_DAT_DDR = 0x00; /* 仅作延时,CH375要求读写脉冲宽度大于100nS */
data=CH375_DAT_PIN; CH375_CONTROL_PORT &= ~CH375_A0; /* 输出无效的控制信号, 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1; */ CH375_CONTROL_PORT |= CH375_CS; CH375_CONTROL_PORT |= CH375_WR; CH375_CONTROL_PORT |= CH375_RD; return( data ); /* 从CH375的并口PA输入数据 */
}
还有你的延时应该是: 命令码与命令码之间的间隔时间:2us-……… 命令码与数据之间的间隔时间: 2us-100us 数据与数据之间的间隔时间:1us-100us
楼上说的也不对,应该先定义一个变量data,在输出无效的控制信号之前 data=CH375_DAT_PORT;,函数的最后return(data); 这样能读到正确的数据了,不过为什么return放在前面就有问题呢?
另外我的延时哪里有问题?我没看出来呀......请指教。
这个是时序上面的要求,只有在375的RD的上升延单片机才会采集数据,如果没有上升延的话,相当于没有读取数据,上面所说的延时实际上指的是在对于375芯片,命令与命令,命令与数据之间的延时为2US,数据与数据之间的延时为1US
现在操作正常了吗? 具体的是你说的这样.我只是看你的程序中将return( CH375_DAT_PIN ); 写在前面了,就给这个改过来了,其它的我想你应该知道. return放在前面,数据返回之后,后面的设置IO口电平就没有起作用了.操作时序就不符合CH375的读数据时序了. 延时方面是当你的晶振大些时,要保证这样的要求.我在这提前说明下.
能读到扇区了,谢谢楼上与hcn!