Добрый день.
Приключения не закончились. Методом перебора подобрал следующие параметры для эмуляции накопителя объемом 6МБ:
Код
uint8_t mbr[16] = {
0x00, // not bootable
0x01, // head number of partition start sector in CHS form. ??
0x01,0x00, // cylinder number ??
0x01, // FAT12 (CHS/LBA, <65536 sectors)
0x07, // header number of partition end sector in CHS form. ??
0xE0,0xC9, // cylinder number and sector number in the cylinder... ??
0x3F,0x00,0x00,0x00, // partition start sector in LBA (0x3F = 63)
0xFF,0x7F,0x00,0x00 // partition size in unit of sector (0x7FFF = 32767)
};
uint8_t br[62] = {
0xEB,0xFE,0x90, // Jump to bootstrap
0x4D,0x53,0x44,0x4F,0x53,0x35,0x2E,0x30,// "MSDOS5.0"
0x00,0x02, // 512 bytes per sector
0x20, // 1 sector per cluster
0x01, 0x00, // number of reserved sectors
0x01, // number of FAT copies
0x00, 0x02, // number of root directory entries
0xF0,0x40, // Total number of sectors in the filesystem
0xF8, // descriptor type - hard disk
0x01,0x00, // Number of sectors per FAT
0x3F,0x00, // Number of sector per track
0xFF,0x00, // number of heads
0x3F,0x00, // Number of hidden sectors
0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x4E,0x4F,
0x20,0x4E,0x41,
0x4D,0x45,0x20,0x20,0x20,0x20,0x46,0x41,0x54,0x20,0x20,0x20,0x20,0x20
};
Теперь накопитель отображается в ОС windows следующим образом:

Для того, чтобы переваривать файлы размером Мегабайты функцию
STORAGE_Write_FS модифицировал следующим образом:
Код
/**
* @brief .
* @param lun: .
* @retval USBD_OK if all operations are OK else USBD_FAIL
*/
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_addr <= 97) {
flash_write(lun, buf, blk_addr, blk_len);
} else {
printf("!W blk %d, cnt %d\r\n", blk_addr, blk_len);
}
if(blk_addr == 97) {
printf("W blk %d, cnt %d\r\n", blk_addr, blk_len);
printf("%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\r\n", *(buf+0x00), *(buf+0x01), *(buf+0x02), *(buf+0x03), *(buf+0x04), *(buf+0x05), *(buf+0x06), *(buf+0x07), *(buf+0x08), *(buf+0x09), *(buf+0x0A), *(buf+0x0B), *(buf+0x0C), *(buf+0x0D), *(buf+0x0E), *(buf+0x0F) );
}
return USBD_OK;
/* USER CODE END 7 */
}
Где блок 97 - это область памяти, в котором FatFs создает реально существующий файл объемом 5 байт - этот блок записывается во флеш память МК по-настоящему, а все последующие нет.
При попытке записать файл размером 16КБ и выше получаю следующую ошибку:

В чем может быть проблема?