if (InitCH376Host() == USB_INT_SUCCESS) { if (CH376DiskConnect()== USB_INT_SUCCESS) { while(1); } else { if(CH376DiskMount() != USB_INT_SUCCESS) { Dlayms(100); while(1); } else { strcpy(buf, "\ABC.TXT"); if(CH376FileOpen(buf)==USB_INT_SUCCESS) { CH376ByteRead( buf, 30, &RealCount ); } } } } 前面都正常,运行 CH376ByteRead( buf, 30, &RealCount );时,s = Wait376Interrupt( );s=0x14,不是USB_INT_DISK_READ ,一直进不去,不知什么原因。下面是CH376ByteRead函数。 UINT8 CH376ByteRead( PUINT8 buf, UINT16 ReqCount, PUINT16 RealCount ) /* 以字节为单位从当前位置读取数据块 */ { UINT8 s; WriteCH376Cmd(CMD2H_BYTE_READ); WriteCH376Data((UINT8)ReqCount); WriteCH376Data((UINT8)(ReqCount>>8)); if (RealCount) { *RealCount = 0; } while ( 1 ) { s = Wait376Interrupt( ); if ( s == USB_INT_DISK_READ ) { s = CH376ReadBlock( buf ); // 从当前主机端点的接收缓冲区读取数据块,返回长度 WriteCH376Cmd( CMD0H_BYTE_RD_GO ); buf += s; if ( RealCount ) { *RealCount += s; } } else { return( s ); /* 错误 */ } } }
你的问题有可能是中断那块的问题,查一下中断引脚电平的变化状态。另外,串口读写的话,查询中断状态之前可以清一下串口接收标志。
谢谢,确实是这个问题,昨天晚上调试,可以读取数据了,但是好像只能读取15个数据,不知道什么原因?
字节读取一次最多可以读65535字节数据,首先检查一下你的读缓冲区是否足够大?其次,检查一下读数据的中断状态。
UINT8 CH376ReadBlock( PUINT8 buf ) /* 从当前主机端点的接收缓冲区读取数据块,返回长度 */ { UINT8 s, l,tmp; WriteCH376Cmd( CMD01_RD_USB_DATA0 ); s = l = ReadCH376Data( ); /* 长度 */ s = l = ReadCH376Data( ); /* 长度 */ if ( l ) { do { *buf = ReadCH376Data(); // tmp = CH376GetIntStatus(); buf ++; } while ( -- l ); } return( s ); } 读取的文件长度是42,但在读取12个数据之后,就一直停在 unsigned char ReadCH376Data(void) { unsigned char RcvData; BYTE IIRValue; while ((U0LSR & 0x01) == 0); /* 等待接收标志置位 */ RcvData= U0RBR; /* 读取数据 */ return (RcvData); } 收不到数据,读缓冲区1000字节,此事中断为高电平。
你的问题应该是串口接收不到数据。如果前面正常通过,命令发送正常读取到文件长度之后,会有对应文件长度的数据。检查一下是否有超时处理等问题?
我也遇到这个问题,现象一模一样,其他初始化正常,就是到字节发送函数那总是等不到USB_INT_DISK_WRITE,一直进不了数据发送
还有就是我用的是stm32异步串口4波特率9600函数已经接收到了USB_INT_DISK_WRIT但是在u8 CH376ByteWrite( u8 *buf, u16 ReqCount, u16 *RealCount )调用u8 Wait376Interrupt(void) 时就是没有返回0x1e 中断接收函数 u8 Wait376Interrupt(void) { u16 Init=0; while(Query376Interrupt() == FALSE);
Init=CH376GetIntStatus();//这里有返回0x1e SendByte(Init); return(Init); // 检测到中断,返回中断状态码 }
但是到
u8 CH376ByteWrite( u8 *buf, u16 ReqCount, u16 *RealCount ) /* 以字节为单位向当前位置写入数据块 */ { u8 s; xWriteCH376Cmd( CMD2H_BYTE_WRITE ); xWriteCH376Data( (u8)ReqCount ); xWriteCH376Data( (u8)(ReqCount>>8) ); // xEndCH376Cmd( ); //仅用于spi接口通信 if ( RealCount ) { *RealCount = 0; } while ( 1 ) {
s = Wait376Interrupt( ); //这里没有返回0x1e而是0x14 SendByte(0xfe); SendByte(s); if ( s == USB_INT_DISK_WRITE ) { SendByte(0x77); s = CH376WriteReqBlock( buf ); /* 向内部指定缓冲区写入请求的数据块,返回长度 */ xWriteCH376Cmd( CMD0H_BYTE_WR_GO ); buf += s; if ( RealCount ) { *RealCount += s; } } /* else if ( s == USB_INT_SUCCESS ) return( s );*/ /* 结束 */ else return( s ); /* 错误 */ } } 求大伙帮忙看看,谢谢
串口波特率9600下在哪个地方收到USB_INT_DISK_WRIT?如果你写入数据比较少的话,只会产生一次USB_INT_DISK_WRIT,之后会产生0x14中断。
u8 Wait376Interrupt(void) { u16 Init=0; while(Query376Interrupt() == FALSE); Init=CH376GetIntStatus();//这里有返回0x1e SendByte(Init); return(Init); // 检测到中断,返回中断状态码 }这里有返回0x1E
但是这个函数u8 CH376ByteWrite( u8 *buf, u16 ReqCount, u16 *RealCount )调用u8 Wait376Interrupt(void)没有返回0x1E一直返回是0x14 u8 CH376ByteWrite( u8 *buf, u16 ReqCount, u16 *RealCount ) /* 以字节为单位向当前位置写入数据块 */ { u8 s; xWriteCH376Cmd( CMD2H_BYTE_WRITE ); xWriteCH376Data( (u8)ReqCount ); xWriteCH376Data( (u8)(ReqCount>>8) ); // xEndCH376Cmd( ); //仅用于spi接口通信 if ( RealCount ) { *RealCount = 0; } while ( 1 ) {
s = Wait376Interrupt( ); //这里没有返回0x1e而是0x14//
if ( s == USB_INT_DISK_WRITE ) {
SendByte(0x77); s = CH376WriteReqBlock( buf ); /* 向内部指定缓冲区写入请求的数据块,返回长度 */ xWriteCH376Cmd( CMD0H_BYTE_WR_GO ); buf += s; if ( RealCount ) { *RealCount += s; } } /* else if ( s == USB_INT_SUCCESS ) return( s );*/ /* 结束 */ else return( s ); /* 错误 */ } }
在u8 CH376ByteWrite( u8 *buf, u16 ReqCount, u16 *RealCount )函数里的 s = Wait376Interrupt( );一次都没有接收到0x1E,一直是0x14所以数据没有从串口发出
你CH376ByteWrite这个函数里等中断的函数就是调用的第9楼的函数。CH376串口操作的话,如果使用查询接收状态码来获取中断状态,可以在获取中断状态之前清一下串口接收标志。
是这个u8 Wait376Interrupt(void) { u16 Init=0; //是在这里清串口接收标志。 while(Query376Interrupt() == FALSE); Init=CH376GetIntStatus();//这里有返回0x1e SendByte(Init); return(Init); // 检测到中断,返回中断状态码 }这里有返回0x1E
你说的那边返回0x1E是哪个函数里面调用的?检查你写需要你发送的命令和数据是否正确?
在u8 Wait376Interrupt(void)里面调用CH376GetIntStatus();有0x1e返回!但是在u8 CH376ByteWrite( u8 *buf, u16 ReqCount, u16 *RealCount )函数里调用u8 Wait376Interrupt(void)没有返回0x1e,就这里很困惑?