|
楼主 |
发表于 2021-10-19 13:59:09
|
显示全部楼层
主机芯片用的是STM32F105RBT6, 从机用的是国产的一款M4内核的但是USB只有从机的芯片,为了改善SPI Flash的写入速度,在文件系统与USB的几个地方做了修改
ffconfig.h
- #define _MIN_SS 512
- #define _MAX_SS 4096
复制代码
diskiio.c
- #define FLASH_SECTOR_SIZE 4096
- #define FLASH_BLOCK_SIZE 16
- #define FLASH_SECTOR_COUNT 1024
- DRESULT disk_read(
- BYTE pdrv, /* Physical drive nmuber (0..) */
- BYTE *buff, /* Data buffer to store read data */
- DWORD sector, /* Sector address (LBA) */
- UINT count /* Number of sectors to read (1..128) */
- )
- {
- u8 res = 0;
- if(!count)return RES_PARERR; //count不能等于0,否则返回参数错误
- switch(pdrv)
- {
- case FLASH_1: //外部flash0
- for(; count > 0; count--)
- {
- W25QXX_Read(buff, sector * FLASH_SECTOR_SIZE, FLASH_SECTOR_SIZE, 1);
- sector++;
- buff += FLASH_SECTOR_SIZE;
- }
- res = 0;
- break;
- case FLASH_2: //内部flash1
- for(; count > 0; count--)
- {
- W25QXX_Read(buff, sector * FLASH_SECTOR_SIZE, FLASH_SECTOR_SIZE, 2);
- sector++;
- buff += FLASH_SECTOR_SIZE;
- }
- res = 0;
- break;
- case USB_DISK:
- res = USBH_UDISK_Read((u8*)buff, sector, count);
- break;
- default:
- res = 1;
- }
- //处理返回值,将SPI_SD_driver.c的返回值转成ff.c的返回值
- if(res == 0x00)return RES_OK;
- else return RES_ERROR;
- }
- //读写函数参数一样
- #if _USE_IOCTL
- DRESULT disk_ioctl(
- BYTE pdrv, /* Physical drive nmuber (0..) */
- BYTE cmd, /* Control code */
- void *buff /* Buffer to send/receive control data */
- )
- {
- DRESULT res;
- if(pdrv == FLASH_1) //外部FLASH0
- {
- switch(cmd)
- {
- case CTRL_SYNC:
- res = RES_OK;
- break;
- case GET_SECTOR_SIZE:
- *(WORD*)buff = FLASH_SECTOR_SIZE;
- res = RES_OK;
- break;
- case GET_BLOCK_SIZE:
- *(WORD*)buff = FLASH_BLOCK_SIZE;
- res = RES_OK;
- break;
- case GET_SECTOR_COUNT:
- *(DWORD*)buff = FLASH_SECTOR_COUNT;
- res = RES_OK;
- break;
- default:
- res = RES_PARERR;
- break;
- }
- }
- else if(pdrv == FLASH_2) //外部FLASH1
- {
- switch(cmd)
- {
- case CTRL_SYNC:
- res = RES_OK;
- break;
- case GET_SECTOR_SIZE:
- *(WORD*)buff = FLASH_SECTOR_SIZE;
- res = RES_OK;
- break;
- case GET_BLOCK_SIZE:
- *(WORD*)buff = FLASH_BLOCK_SIZE;
- res = RES_OK;
- break;
- case GET_SECTOR_COUNT:
- *(DWORD*)buff = FLASH_SECTOR_COUNT;
- res = RES_OK;
- break;
- default:
- res = RES_PARERR;
- break;
- }
- }
- else if(pdrv == USB_DISK)
- {
- switch(cmd)
- {
- case CTRL_SYNC:
- res = RES_OK;
- break;
- case GET_SECTOR_SIZE:
- *(WORD*)buff = 4096;
- res = RES_OK;
- break;
- case GET_BLOCK_SIZE:
- *(WORD*)buff = 4096;
- res = RES_OK;
- break;
- case GET_SECTOR_COUNT:
- *(DWORD*)buff = (DWORD) USBH_MSC_Param.MSCapacity;
- res = RES_OK;
- break;
- default:
- res = RES_PARERR;
- break;
- }
- }
- else res = RES_ERROR; //其他的不支持
- return res;
- }
复制代码
usbh_msc_usr.c
- void USBH_USR_DeInit(void)
- {
- USBH_USR_ApplicationState = USH_USR_FS_INIT;
- }
- extern USBH_HOST USB_Host;
- uint8_t USBH_UDISK_Status(void)
- {
- return HCD_IsDeviceConnected((USB_OTG_CORE_HANDLE*)&USB_OTG_Core);
- }
- uint8_t USBH_UDISK_Read(uint8_t *buf, uint32_t sector, uint32_t cnt)
- {
- u8 res = 1;
- if(HCD_IsDeviceConnected((USB_OTG_CORE_HANDLE*)&USB_OTG_Core) )
- {
- do
- {
- res = USBH_MSC_Read10((USB_OTG_CORE_HANDLE*)&USB_OTG_Core, buf, sector, 4096 * cnt);
- USBH_MSC_HandleBOTXfer((USB_OTG_CORE_HANDLE*)&USB_OTG_Core ,&USB_Host);
-
- if(!HCD_IsDeviceConnected((USB_OTG_CORE_HANDLE*)&USB_OTG_Core))
- {
- res = 1;
- break;
- }
- }
- while(res == USBH_MSC_BUSY );
- }else res = 1;
- if(res == USBH_MSC_OK)
- res = 0;
- return res;
- }
- uint8_t USBH_UDISK_Write(uint8_t* buf,uint32_t sector,uint32_t cnt)
- {
- uint8_t res=1;
- if(HCD_IsDeviceConnected((USB_OTG_CORE_HANDLE*)&USB_OTG_Core))//连接还存在,且是APP测试状态
- {
- do
- {
- res=USBH_MSC_Write10((USB_OTG_CORE_HANDLE*)&USB_OTG_Core,buf,sector, 4096 * cnt);
- USBH_MSC_HandleBOTXfer((USB_OTG_CORE_HANDLE*)&USB_OTG_Core ,&USB_Host);
- if(!HCD_IsDeviceConnected((USB_OTG_CORE_HANDLE*)&USB_OTG_Core))
- {
- res=1;
- break;
- };
- }while(res==USBH_MSC_BUSY);
- }else res=1;
- if(res==USBH_MSC_OK)res=0;
- return res;
- }
复制代码
usb_host处理函数的一部分
- void USB_Application(void)
- {
- uint8_t res = 1;
- uint32_t total, free;
- uint8_t file = 1;
- uint8_t sta = 0;
- if(Enum_Done == 1)
- {
- delay_ms(10);
- res = exf_get_free("2:", &total, &free);
- SEGGER_RTT_SetTerminal(2);
- SEGGER_RTT_printf(0, "> Rrturn exf_get_free is :%d\r\n", res);
- if(res == 0)
- {
- /* 检测到磁盘并可以正常获取磁盘状态,LED常亮 */
- led_toggle_flag = DISABLE;
- led_on();
- SEGGER_RTT_SetTerminal(2);
- SEGGER_RTT_printf(0, "> U Disk FATFS OK!\r\n");
- SEGGER_RTT_printf(0, "> U Disk Total Size: %d KB\r\n", total);
- SEGGER_RTT_printf(0, "> U Disk Total Size: %d KB\r\n", free);
-
- exf_scan_files("2:");
- }
- }
- }
复制代码
从机文件系统和主机差不多,USB这是修改了mass_mal.c中的这个函数
- uint16_t MAL_GetStatus (uint8_t lun)
- {
- switch(lun)
- {
- case 0:
- Mass_Memory_Size[0] = 1024 * 1024 * 4; //4M字节
- Mass_Block_Size[0] = 4096; //设置SPI FLASH的操作扇区大小为4096
- Mass_Block_Count[0]= Mass_Memory_Size[0] / Mass_Block_Size[0];
- break;
- default:
- return MAL_FAIL;
- }
- return MAL_OK;
- }
复制代码
目前有点进展,主机插上从机偶尔会正常检索从机的文件,有时又不正常
不正常的情况就是在主机处理程序获取从机磁盘容量那一块 res = exf_get_free("2:", &total, &free);,返回值1(FR_DISK_ERR),查了FATFS官网有如下说明
C:\Users\Administrator\Desktop\1.jpg
|
|