Итак, для начала вам следует взглянуть на документацию ST о том, как точно перемещать дерево процессов с помощью SD-карты. Я знаю, что с USB вы должны вызвать хост-процесс и дождаться, пока состояние хоста станет активным, прежде чем можно будет делать какие-либо вызовы FATFS. Убедитесь, что вы находитесь на земле, ожидая аппаратных прерываний, чтобы вызвать присутствие.
Что-то похожее на эффект, просто убедитесь, что у вас есть параметр тайм-аута, если корпус SD не монтируется.
// stateOfHost will change depending on the cube generated code, but it should be somewhere in the SD Card code
extern ApplicationTypeDef stateOfHost;
// Set the default state to idle
ApplicationTypeDef stateOfHost = APPLICATION_IDLE;
while(1)
{
// Start USB Host Process
MX_USB_HOST_PROCESS();
if(stateOfHost == HOST_USER_CLASS_ACTIVE)
{
// FATFS Can now be called
}
}
Если после этого ничего не получится, это может звучать немного странно, но попробуйте увеличить размер стека по умолчанию. Тайм-аут DMA появляется, потому что обратный вызов для диска не вызывается. Не было данных для заполнения. Попытка отладки с помощью этой реализации FATFS - это кошмар.
У USB OTG и стороннего промежуточного программного обеспечения FATFS на SD-карте возникают проблемы, если размер стека не превышает установленного по умолчанию значения 0x400.
Внутри файла startup_stm32l4 (xx) xx.s (два х в скобках относятся к вашему варианту L4), измените размер стека на подходящий. Для начала попробуйте 0x1000.
У меня были похожие проблемы, и мне пришлось увеличить размер стека до 0x3000, чтобы заставить работать мой USB.
Если SD-карта распознана, убедитесь, что вы создали переменные для отслеживания всех ваших вызовов FATFS, чтобы убедиться, что все это успешно.
Чтобы читать через FATFS, вы должны:
1. Смонтировать рабочее пространство (f_Mount)
2. Откройте файл (f_open)
3. Считайте файл открытым (f_read)
Запись производится точно так же, просто меняются с вызовом чтения.
Надеюсь, это поможет.