本帖最后由 jihesong-1019213 于 2016-3-8 14:33 编辑 模拟U盘,把USB线连电脑后,像是插上U盘一样,能识别出板上SPI驱动的SD卡,和U盘一样,但很慢,枚举很慢,电脑显示写入时177K/秒也很慢;过程和挂载fatfs基本一样,很简单,就是在接口那里放上出和入的程序,照常满足3个参数。 打上断点后,看到SPI的应答从没出错,问题是从来没连续块读写,觉得应该得有个USB的缓冲区吧,因为单片机的内存挺金贵的,目前应该是默认的安全模式,一个byte一个蹦,节省资源。 usbd_storage_if.c里面增加上SPI的块读写就能识别SD卡容量,前提是SD卡需要先识别出,和fatfs无关。 怎么样让块的连续读写生效,发挥作用啊????SPI速度有18M啊,速度全让单字节读写浪费了。 虚拟串口和HOST+storage还没弄,但是我觉得路数应该一样的,hal库还是挺给力,要养成习惯就是把程序写在用户代码区。 /******************************************************************************* * Function Name : STORAGE_Read_FS * Description : * Input : None. * Output : None. * Return : None. *******************************************************************************/ int8_t STORAGE_Read_FS (uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)//这个blk_len长度从来都是1,就不肯大于1,正在找原因。 { /* USER CODE BEGIN 6 */ if(blk_len==1) { if(SD_ReadBlock(buf, blk_addr*512, 512)!=SD_RESPONSE_NO_ERROR) SD_ReadBlock(buf, blk_addr*512, 512); } else SD_ReadMultiBlocks(buf, blk_addr*512, 512, blk_len); return (USBD_OK); /* USER CODE END 6 */ } /******************************************************************************* * Function Name : STORAGE_Write_FS * Description : * Input : None. * Output : None. * Return : None. *******************************************************************************/ int8_t STORAGE_Write_FS (uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len) { /* USER CODE BEGIN 7 */ if(blk_len==1) { if(SD_WriteBlock(buf,blk_addr*512, 512)!=SD_RESPONSE_NO_ERROR) SD_WriteBlock(buf,blk_addr*512, 512); } else SD_WriteMultiBlocks(buf, blk_addr*512, 512, blk_len); return (USBD_OK); /* USER CODE END 7 */ } 那个lun参数其实应该就是DRV,第几个硬件U口而已,既然板上只有1个U插口,当然是0,不用管了; USB的hal库似乎比较新,看那注释是空的,看不到参数的解释。 送上个命令,在电脑的“运行”里输入 chkdsk G:/F ,可以修复被自己读写乱了的SD卡,G是SD卡的盘符,到连格式化都不行时候,这个命令可以救命。 |