ch376扇区写入,返回FA

以前调好的程序,连续测试过几天都正常,最近我也忘了改了哪里了,或者是其他原因,发现了这个问题。 程序一直在接收串口数据并缓冲下来,然后用扇区写入,连续测了好多次,基本每次都会停在出现错误的那个while循环中,并且返回FA,只不过每次的时间不定。在程序还没有报这个错误的时候,我按键中断执行更新关闭文件,发现保存的文件是正常的。 但是如果程序返回了FA,并且跳转到那个while循环后,我主控芯片的按键中断都不响应了,是怎么回事啊?

你监视下程序看CH376SecWrite函数中哪里返回FA?


是SecWrite()函数返回来的FA


CH376SecWrite函数中哪里返回FA,再细致测试下现象?


是CH376SecWrite函数中的s = CH376DiskWriteSec( buf, StaSec, cnt ); /* 将缓冲区中的多个扇区的数据块写入U盘 */ 返回的错误值,为了方便,我把这个函数内容放在下面了。 UINT8 CH376DiskWriteSec( PUINT8 buf, UINT32 iLbaStart, UINT8 iSectorCount ) /* 将缓冲区中的多个扇区的数据块写入U盘,不支持SD卡 */ /* iLbaStart 是写入的线起始性扇区号, iSectorCount 是写入的扇区数 */ { UINT8 s, err; UINT16 mBlockCount; for ( err = 0; err != 3; ++ err ) { /* 出错重试 */ xWriteCH376Cmd( CMD5H_DISK_WRITE ); /* 向USB存储器写扇区 */ xWriteCH376Data( (UINT8)iLbaStart ); /* LBA的最低8位 */ xWriteCH376Data( (UINT8)( (UINT16)iLbaStart >> 8 ) ); xWriteCH376Data( (UINT8)( iLbaStart >> 16 ) ); xWriteCH376Data( (UINT8)( iLbaStart >> 24 ) ); /* LBA的最高8位 */ xWriteCH376Data( iSectorCount ); /* 扇区数 */ xEndCH376Cmd( ); for ( mBlockCount = iSectorCount * DEF_SECTOR_SIZE / CH376_DAT_BLOCK_LEN; mBlockCount != 0; -- mBlockCount ) { /* 数据块计数 */ s = Wait376Interrupt( ); /* 等待中断并获取状态 */ if ( s == USB_INT_DISK_WRITE ) { /* USB存储器写数据块,请求数据写入 */ CH376WriteHostBlock( buf, CH376_DAT_BLOCK_LEN ); /* 向USB主机端点的发送缓冲区写入数据块 */ xWriteCH376Cmd( CMD0H_DISK_WR_GO ); /* 继续执行USB存储器的写操作 */ xEndCH376Cmd( ); buf += CH376_DAT_BLOCK_LEN; } else break; /* 返回错误状态 */ } if ( mBlockCount == 0 ) { s = Wait376Interrupt( ); /* 等待中断并获取状态 */ if ( s == USB_INT_SUCCESS ) return( USB_INT_SUCCESS ); /* 操作成功 */ } if ( s == USB_INT_DISCONNECT ) return( s ); /* U盘被移除 */ CH376DiskReqSense( ); /* 检查USB存储器错误 */ } return( s ); /* 操作失败 */ }

这个函数内只有下面这个for循环内返回了s状态, for ( mBlockCount = iSectorCount * DEF_SECTOR_SIZE / CH376_DAT_BLOCK_LEN; mBlockCount != 0; -- mBlockCount ) { /* 数据块计数 */ s = Wait376Interrupt( ); /* 等待中断并获取状态 */ if ( s == USB_INT_DISK_WRITE ) { /* USB存储器写数据块,请求数据写入 */ CH376WriteHostBlock( buf, CH376_DAT_BLOCK_LEN ); /* 向USB主机端点的发送缓冲区写入数据块 */ xWriteCH376Cmd( CMD0H_DISK_WR_GO ); /* 继续执行USB存储器的写操作 */ xEndCH376Cmd( ); buf += CH376_DAT_BLOCK_LEN; } else break; /* 返回错误状态 */ }, 请问是怎么回事啊。测试到目前发现程序仍然是可以运行一段时间,但是不知道过多长时间还会出现主题中所说的情况。 另外一个不懂的地方是扇区写入不是一次要写入512的数据吗,这里为什么循环发送0x40的的数据,不应该是0x2h吗?


底层就是一次写64个,只是我们函数帮你做好了,把512分8次写入 你前面的初始化每次都能过么?DISKMOUNT每次都返回14么? FA可能是中断超时那返回的,你把中断查询函数Wait376Interrupt( ); 中的超时加长点或者把超时去掉,死等中断试试


我测试过了,确实是中断查询函数Wait376Interrupt( )返回的FA,那是什么问题呢,怎么解决? 我的程序中先初始化U盘都能通过,DISKMOUNT也应该能通过,因为在未出现这个错误之前如果我,停止写入新数据而关闭刷新文件长度,写出来的文件是正常的。所以程序中只在最开始的时候DISKMOUNT过一次,那我让出错的时候在DISKMOUNT一次试试, 如果是DISKMOUNT返回值不对, 那应该是哪里的问题呢?


还有一个疑问,在出错后,程序会跳入下面这个函数 void mStopIfError(uint8_t iError) { if (iError == USB_INT_SUCCESS) { return; /* 操作成功 */ } // printf("Error: %02X\n", iError ); /* 显示错误 */ while(1) { /* LED1闪烁 */ GPIO_ResetBits(GPIOD, GPIO_Pin_6); mDelaymS( 200 ); GPIO_SetBits(GPIOD, GPIO_Pin_6); mDelaymS( 200 ); } }, 此时现象是实验板上的灯不断的闪,但是为什么这是侯用按键中断来跳入其他地方时,按键中断无无响应呢?


在程序出现这个错误之后,然后在进行ch376初始化及u盘检测,发现此时根本检测不到u盘连接,是ch376工作不稳定吗,发现u盘略微有些发热,此时将u盘拔下,程序重启又能恢复正常,但是执行中还会出错。


出错时,也测过电压了,分别是4.5v,0v,2.6v,应该没有问题吧?


1、你的电压是哪里的电压? 2、按键中断无无响应是可能是你单片机中断设置或者按键检测有问题 3、返回FA那必须需要你把超时时间加长或者是死等中断


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