2023-06-04 02:20 AM
I am trying to use stm32f407 and w25q128 to get a usb drive, for this I wrote a driver to control the flash drive and initialized the USB MSC using CubeMX. When I connect the stm32 to the PC (Ubuntu) I see the new storage device in the Disks app but it doesn't mount, I tried to erase it but the process freezes until I reboot the board
w251128 has:
PageSize = 256
SectorSize = 4096
SectorCount = 4096
PageCount = 65536
BlockSize = 65536
CapacityInKiloByte = 16Mb
Based on this information, I set the defines in `usbd_storage_if.c`:
```
#define STORAGE_LUN_NBR 1
#define STORAGE_BLK_NBR 0x1000
#define STORAGE_BLK_SIZ 0x1000
int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
w25q_readSector(buf, blk_addr, 0, blk_len * 4096); // 0 is offset
return USBD_OK;
}
int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
w25q_eraseBlock(blk_addr);
w25q_writeBlock(buf, blk_addr, 0, blk_len * 4096);
return USBD_OK;
}
```
I added some printfs inside these methods to notify the start and end of the process, if I erase blocks/sectors/pages from the main function in `main.c` everything goes fine, but when I try to erase the flash drive using PC OS and `usbd_storage_if.c` I see that the process just started but never finished, also adding the above code to the read function gives the following popup window "Error wiping device: Failed to probe the device 'dev/-sdb' (udisks-error-quark, 0)".
I also tried to comment out the w25q code and replace it with memcpy to work with internal memory, this works as expected, but how do I use external SPI flash memory as the MSC?
Solved! Go to Solution.
2023-06-04 11:42 AM
Thanks for your reply! Yes, I found the problem. It seems OS doesn’t like delays inside the driver functions. My driver has HAL_Delay() for a few ticks while using spi transmit/receive. When I comment out all delays I got MSC working
2023-06-04 09:23 AM
Test the IO routines thoroughly
Instrument interaction
See what OS is doing when failed.
Make sure sector size and capacity are correctly reported. ie INQURY and READ CAPACITY/MODE PAGE
Can't use FatFS and MSC concurrently, but can use f_mkfs() to format suitably first time around.
2023-06-04 11:42 AM
Thanks for your reply! Yes, I found the problem. It seems OS doesn’t like delays inside the driver functions. My driver has HAL_Delay() for a few ticks while using spi transmit/receive. When I comment out all delays I got MSC working