Здравствуйте!
Использую Дискавери на STM32F407 + карту SD Micro 4 GB на чтение.
Чтение через поллинг (Polling) идет отлично, даже файлы верно читаются с помощью FatFs.
Но через DMA не удаётся нормально работать.
Помотрел как читается нулевой(первый сектор) карты в 2 случаях: Polling и DMA.
Фрагменты кода (прерывания включил, карту проинитил, данные выровнял на 16 байт) :
Код
u8 buff[512] __attribute__((aligned (16)));
void SDIO_IRQHandler(void)
{
SD_ProcessIRQSrc();
}
void SD_SDIO_DMA_IRQHANDLER(void)
{
SD_ProcessDMAIRQ();
}
void SD_NVIC_Configuration(void)
{
// SDIO Interrupt ENABLE
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = SDIO_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// DMA2 STREAMx Interrupt ENABLE
NVIC_InitStructure.NVIC_IRQChannel = SD_SDIO_DMA_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_Init(&NVIC_InitStructure);
}
SD_Init();
SD_NVIC_Configuration();
__enable_irq();
SD_ReadBlock(buff,0<<9,512);
OLED_ON();
#define COL 255
for(u32 i=0;i<512;i++)OLED_Char(i%20,i/20,buff[i],COL|(COL<<8)|(COL<<16));
while(1);
Фотки прикладываю. Вывод содержимого нулевого сектора на дисплей.
Первая картинка - перез Polling - там всё OK.
Вторая через DMA - первые байты (от трети до половины всего экрана) - нулевые.
Куда копать, чтобы DMA нормально на чтение с SDIO начал работать?