STM32, mass storage device. Windows просит отформатировать диск после записи большого файла
Всем привет! Хочу организовать флешку на основе STM32F105RBT + AT45DB041. Суть проблемы: после записи файла (или группы файлов с совокупным...) размером более 12 KB, после переподключения устройства к ПК, windows7 просит отформатировать диск. Все работает нормально, если:
- Размер файла (-файлов) <= 12KB
- Не переподключать устройство к ПК
Память работает в режиме 264 байта/страницу. Всего, 2048 страниц. Так как передача данных устройству идет блоками по 512 байт, я модифицировал код вычисления объема
int8_t STORAGE_GetCapacity_FS(uint8_t lun, uint32_t *block_num, uint16_t *block_size)
{
/* USER CODE BEGIN 3 */
*block_num = 1024;
*block_size = 512;
return (USBD_OK);
/* USER CODE END 3 */
}
Модифицировал функции чтения/записи USB таким образом, что пишу один блок данных в две страницы памяти по 256 байт.
int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
/* USER CODE BEGIN 7 */
AT45dbxx_WritePage(buf, 256, (uint16_t)blk_addr*2);
AT45dbxx_WritePage(buf+256, 256, (uint16_t)blk_addr*2+1);
return (USBD_OK);
/* USER CODE END 7 */
}
int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
/* USER CODE BEGIN 6 */
AT45dbxx_ReadPage(buf, 256, (uint16_t)blk_addr*2);
AT45dbxx_ReadPage(buf+256, 256, (uint16_t)blk_addr*2+1);
return (USBD_OK);
/* USER CODE END 6 */
}
Функции для работы с памятью работают корректно во всем диапазоне страниц.
UPD. Флешка перед записью форматируется средствами windows. В процессе записи и короткого файла, и "длинного" запись идет и в начальные сектора: 0, 1, 2...
Ответы (2 шт):
Решил проблему, исправлением uint16_t page на uint32_t page и все работает. Всем спасибо!
void AT45dbxx_ErasePage(uint32_t page)
{
page = page << AT45dbxx.Shift; // AT45dbxx.Shift = 9 For 264 byte per page
AT45dbxx_Resume();
AT45dbxx_WaitBusy();
HAL_GPIO_WritePin(_45DBXX_CS_GPIO,_45DBXX_CS_PIN,GPIO_PIN_RESET);
AT45dbxx_Spi(AT45DB_PGERASE); // CMD 0x81
AT45dbxx_Spi((page >> 16) & 0xff);
AT45dbxx_Spi((page >> 8) & 0xff);
AT45dbxx_Spi(page & 0xff);
HAL_GPIO_WritePin(_45DBXX_CS_GPIO,_45DBXX_CS_PIN,GPIO_PIN_SET);
AT45dbxx_WaitBusy();
}
void AT45dbxx_WritePage(uint8_t *Data,uint16_t len,uint32_t page)
{
page = page << AT45dbxx.Shift; // AT45dbxx.Shift = 9 For 264 byte per page
AT45dbxx_Resume();
AT45dbxx_WaitBusy();
HAL_GPIO_WritePin(_45DBXX_CS_GPIO,_45DBXX_CS_PIN,GPIO_PIN_RESET);
AT45dbxx_Spi(AT45DB_MNTHRUBF1); // CMD 0x82
AT45dbxx_Spi((page >> 16) & 0xff);
AT45dbxx_Spi((page >> 8) & 0xff);
AT45dbxx_Spi(page & 0xff);
HAL_SPI_Transmit(&_45DBXX_SPI,Data,len,100);
HAL_GPIO_WritePin(_45DBXX_CS_GPIO,_45DBXX_CS_PIN,GPIO_PIN_SET);
AT45dbxx_WaitBusy();
}
Еще была подобная проблемв с маленьким медленным диском на 32 Кб. Требовалось обязательное "Безопасное извлечение" после любой процедуры записи (зписсь, форматирование, переименование, перемещение). Интересно что Windows смог его отформатировать, а для форматирования с помощью FatFS было недостаточно секторов