Цитата(AHTOXA @ Jul 27 2017, 20:43)

Дело не только и не столько в burst, сколько в пословном доступе к невыровненным данным. Этого, думаю, и L4 не любит.
(FatFs при определённых условиях вызывает функцию записи блока с адресом буфера, не кратным 4).
Так на 4 я выравниваю, я имел ввиду что если нет барста то не надо на 512 выравнивать.
Вообще, когда-то делал на Ф4 с FatFs R0.11 и драйвром от Nemui Trinomius (http://nemuisan.blog.bai.ne.jp)
Проблем не замечал.
А вот с L4 тут напарник занимается, я сильно не влазил, так он уже неделю ковыряется. То что калокуб нагенерил было вообще сразу снесено, им только проверили что железо работает, потом переделали под драйвер от EVAL - хоть поллинг нормально заработал, а с ДМА пока засада, даже на чтении -пишет блоками до 1023 байта, дальше дикс эррор, если дать блок 8К или 16К, как задумывалось изначально, то эррор сразу (это я все пишу со слов напарника).
Мое личное мнение (проверю на след. неделе), что он не делает, илиделает не правильно, какую-нибудь из проверок.
У меня disk_read выглядел так:
Код
DRESULT disk_read (
BYTE drv, /* Physical drive nmuber (0..) */
BYTE *buff, /* Data buffer to store read data */
DWORD sector, /* Sector address (LBA) */
BYTE count /* Number of sectors to read (1..255) */
)
{
switch (drv) {
case SDIO_DRIVE: {
Status = SD_ReadMultiBlocks((uint8_t*)(buff),(sector)*SECTOR_SIZE,SECTOR_SIZE,count);
/* Check if the Transfer is finished */
Status = SD_WaitReadOperation();
/* Wait until end of DMA transfer */
while(SD_GetStatus() != SD_TRANSFER_OK);
if (Status == SD_OK) return RES_OK;
else return RES_ERROR;
}
}
return RES_PARERR;
}
а у него:
Код
DRESULT SD_read(BYTE lun, BYTE *buff, DWORD sector, UINT count){
DRESULT res = RES_ERROR;
uint32_t timeout = 100000;
if(BSP_SD_ReadBlocks_DMA((uint32_t*)buff,
(uint32_t) (sector),
count, SD_DATATIMEOUT) == MSD_OK)
{
while(BSP_SD_GetCardState()!= MSD_OK) {
if (timeout-- == 0) {
return RES_ERROR;
}
}
res = RES_OK;
}
return res;
}