Здравствуйте, уважаемые
Вот пытаюсь запустить

Все инициализации, размер карты (CSD) - всегда без проблем.
Использую драйвер, взятый
отсюдаЕго исходник приложил. Модификации, проведенные мною в нём - добавил в него все функции низкоуровневой инициализации, типа SD_LowLevel_DMA_RxConfig. В той ссылке оно разбросано по разным файлам.
Вот почитал инструкции в sdio_sd.c, немного поэкспериментировал.
Получился код:
CODE
// Init SD card
sdErr = SD_Init ( );
................
// SDIO Interrupt ENABLE
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 );
sdErr = SD_ReadMultiBlocks ( sectorBuffer, i, 512, 1 );
sdErr = SD_WaitReadOperation ( );
while ( 1 )
{
state = SD_GetStatus();
if ( state == SD_TRANSFER_OK )
break;
} // while
........................
void SDIO_IRQHandler(void)
{
// SD_ProcessIRQ(); -- это в инструкции, но такой функции нет
SD_ProcessIRQSrc ( );
}
void SD_SDIO_DMA_IRQHANDLER(void)
{
SD_ProcessDMAIRQ();
}
Все инициализации, размер карты (CSD) проходят всегда без проблем.
Проблема в следующем.
0-й сектор (MBR) всегда читается идеально, оба прерывания вызываются и отрабатывают.
На всех других секторах прерываний нету, SD_WaitReadOperation висит во внутреннем цикле (смотрел отладчиком):
Код
while ((DMAEndOfTransfer == 0x00) && (TransferEnd == 0) && (TransferError == SD_OK) && (timeout > 0))
{
timeout--;
}
Т.е. флаги не сброшены - прямое следствие неотработавших прерываний DMA.
От номера сектора никак не зависит. Единственное исключение - MBR.
Соответственно и FatFs сразу обламывается и прочие гадости.
Пробовал 2 SD карты, одна 32МБ "демка" от фотоаппарата Canon, 2-я 4ГБ Transcend (не SDHC!!) - одинаково.
Монтаж - на проводках, примерно такой же, как и в ST-шной ссылке выше.
Датчики разъёма не опрашиваю, плату криво спаял, они оба всегда замкнуты. Но это мелочи - кнопки опрашивать я умею.
Кто-нибудь может сказать, в чём здесь дело?
Спасибо.
Сообщение отредактировал IgorKossak - Feb 24 2013, 11:38
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда