TE-STM32F103RE - «Махаон» работа с SDIO.
Проблема в работе с некоторыми SDНС картами оказалась в несоблюдении
в данной версии_1.00 платы SD Memory Card Hardware Interface
(отсутствуют 5 подтягивающих резисторов).
В STM3210E-EVAL evaluation board (UM0488) на SDIO они установлены (и на SWJ тоже).
Про Hi-Z state: ST - RM0008, Rev 9, стр.464-467.
(If the CPSM is not in the Send state, the SDIO_CMD output is in the Hi-Z state,
as shown in Figure 187 on page 464.
Idle: the data path is inactive, and the SDIO_D[7:0] outputs are in Hi-Z.)
Для поддержания Hi-Z состояния выводы порта должны быть сконфигурированны в Open Drain Mode,
и тогда наличие подтягивающих резисторов на линии передачи оправдано,
но в данном случае все выводы SDIO сконфигурированны в FWLib в Push-Pull Mode (кроме SDCard_Detect)
и в процессе работы конфигурация не меняется, т.е. вроде никакого Hi-Z state быть
не должно, если только вывод не вырубается автоматом аппаратно.
Однако добавление 5 подтягивающих резисторов решает проблему работы с некоторыми SDHC картами.
Причём в режиме отладки c SWJ-DP всё работало и без этих резисторов, поэтому пришлось вылавливать косяки
через HyperTerminal.
Без подтягивающих резисторов карта сначала не проходила инициализацию в SD_PowerON() - вываливалась с
SD_COM_CRC_FAILED после CMD55 (добавление повторов команды эту проблему решало),
но дальше всё висло в SD_EnableWideBusOperation(SDIO_BusWide_4b)--> SDEnWideBus(ENABLE)-->
FindSCR(RCA, scr)--> в цикле:
Код
while (!(SDIO->STA & (SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR)))
{
if (SDIO_GetFlagStatus(SDIO_FLAG_RXDAVL) != RESET)
{
*(tempscr + index) = SDIO_ReadData();
index++;
}
}
Вариации на тему изменения рабочей частоты, фазы синхронизации, TIMEOUT и SDIO_Wait результата не давали.
Ниже приведён пример листинга HyperTerminal рабочей программы SDIO для терровского махаона
и файл main.c который можно установить взамен библиотечного из FWLib-V2.0.3.
(в файле sdcard.c в cardinfo->CardCapacity = (cardinfo->SD_csd.DeviceSize + 1) * 512 * 1024; убрать *1024, чтобы не было переполнения)
В опциях препроцессора указать EMB_FLASH взамен VECT_TAB_FLASH для загрузки во flash.
Нажмите для просмотра прикрепленного файла SDIO DEBUG:
SD Init
SD_GetCardInfo:
CardType = SDIO_HIGH_CAPACITY_SD_CARD
CSD Version 2.0
CardCapacity = 7600 Mb
CardBlockSize = 512 byte
CardComdClasses = 5
MaxBusClkFrec = 25 MHz
SD SelectDeselect
EnableWideBusOperation
Erase
Set Transfer Mode
ReadMultiBlocks
Compare the buffer with zero
Write block of 512 bytes on address 0
Read block of 512 bytes from address 0
Check the correctness of written data
TransferStatus1 = 1
Write multiple block of many bytes on address 0
Read block of many bytes from address 0
Check the correctness of written data
TransferStatus2 = 1
Status = 42_SD_OK
Остаётся однако совершенно непонятным вопрос - почему без подтягивающих резисторов на SDIO
в режиме отладки из под IAR_5.3 всё выполнялось отлично и по шагам и в реалтайме.....