Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32H743 и SDIO
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
__inline__
Подсоединил DS карту к STM32H743(отладка Nucleo) к SDIO1. Сгенерировал Кубом Хал и вперёд.

Читаю нулевой сектор SD карты, который я видел и сравниваю с заранее правильно считанным эталоном побайтно. Сравнение показывает разный результат.
Выводил содержимое 0-го сектора на дисплей: часть байтов пропускается или не те, что нужно.

Режим без ДМА. Отключал кеширование, выравнивал буфер данных на 512 байт - ничего не помогло.

Удалось обнаружить, что функция чтения HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks, uint32_t Timeout)
возвращает всегда:

HAL_SD_ERROR_DATA_CRC_FAIL

Эррата на H743 даёт мутное описание, что-то связанное с линией данных 2 (Wrong data line 2 generation between two blocks  during DDR transfer with Read wait mode enabled)
Но раскурить не удалось.

Клок тоже понижал , ставил делитель до 256 - не помогает. Поддтяжки к питанию (PULL UP) всех линий включены.

Пробовал 3 карты: 2 ,4 и 16 ГБ - со всеми тремя фигня. На STM32H407 с SDIO все карты работают.

В чем может быть проблема?
nanorobot
Цитата(__inline__ @ Jul 30 2018, 15:06) *
Подсоединил DS карту к STM32H743(отладка Nucleo) к SDIO1. Сгенерировал Кубом Хал и вперёд.


В чем может быть проблема?


У меня тоже заказана такая же плата. Начинаю потихоньку переживать , похоже редкостный глюкодром, судя по последним темам....
__inline__
Цитата(nanorobot @ Jul 30 2018, 10:12) *
У меня тоже заказана такая же плата. Начинаю потихоньку переживать , похоже редкостный глюкодром, судя по последним темам....


Не переживайте. Скорее всего Хал/Куб что-то не учли, и проблема решается вставкой ворк-эраунда. На 407-м тоже пришлось копаться несколько дней(закончилось скачиванием обновленной библиотеки с фиксом).

Приложил результат - слева правильное чтение сектора на ПК, справа - не верное чтение (пропуск символов, не те)- на STM32H743:

Нажмите для просмотра прикрепленного файла
nanorobot
Цитата(__inline__ @ Jul 30 2018, 15:14) *
Не переживайте. Скорее всего Хал/Куб что-то не учли, и проблема решается вставкой ворк-эраунда. На 407-м тоже пришлось копаться несколько дней(закончилось скачиванием обновленной библиотеки с фиксом).

Уповаю на Jiovanni di Sirio c его ChibiOS / HAL - еще ни разу не подводил. Кстати советую попробвать...
__inline__
Удалось запустить SD карту SD HC 10-й класс скорости + 1-й класс в терминологии UHS-I . Емкостью 16 ГБ.

Сектора стали нормально читаться после как на линию CLK повешал ферритовую втулку (с провода питания ноутбука - длина суть больше 1 см). Без ферритовой втулки даёт CRC-ERROR и битые данные.

Остальные карты с 2 и 4 ГБ не работают даже с втулкой.

Карта подключена к отладке Nucleo-H743 проводами длиной около 15 см.

Надо будет попробовать укоротить насколько возможно.

Питание на карту беру от встроенного на плате LDO 3,3V. Между питанием и землёй карты - тантал 10 мкФ + керамика 0.1 мкФ.
MasterElectric
Цитата(nanorobot @ Jul 30 2018, 13:12) *
У меня тоже заказана такая же плата. Начинаю потихоньку переживать , похоже редкостный глюкодром, судя по последним темам....


Это мы рукожопые, а не они)
Obam
Цитата(__inline__ @ Jul 30 2018, 16:52) *
Удалось запустить SD карту SD HC 10-й класс скорости ... после как на линию CLK повешал ферритовую втулку (с провода питания ноутбука - длина суть больше 1 см). Без ферритовой втулки даёт CRC-ERROR и битые данные.

Выкрутасы из методов техники СВЧ как-бы не вредны, но это уже какой-то "шаманизм". Тогда уж и на каждый DAT по бусинке.
nanorobot
Цитата(MasterElectric @ Jul 30 2018, 20:44) *
Это мы рукожопые, а не они)

Тут про SPI четыре страницы накатали. c F0 и F4 проблем с SPI не имел. Ну почти не имел.
__inline__
Укоротил все линии соединения с SD карточкой до 4 см.
Подключил карту к AVCC/AGND.
На провод SDIO CLK надел ферритовую втулку.
Между выводом питания и землями на карте - три конденсатора: 0,1 мкф(керамика) + 10 мкФ(тантал) + 220 мкФ(электролит)

Заработали все три карты!

Пробовал убирать ферритовую втулку с SDIO_CLK и понижать частоту SDIO CLK - карты не работают.

Инит карты такой (HAL, Cube):

Код
static void MX_SDMMC1_SD_Init(void)
{
  hsd1.Instance = SDMMC1;
  hsd1.Init.ClockEdge = SDMMC_CLOCK_EDGE_RISING;
  hsd1.Init.ClockPowerSave = SDMMC_CLOCK_POWER_SAVE_DISABLE;
  hsd1.Init.BusWide = SDMMC_BUS_WIDE_4B;
  hsd1.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_DISABLE;
  hsd1.Init.ClockDiv = 0;
}


Частотомером обнаружил, что Куб не даёт сделать частоту SD CLK выше, чем 24.176 МГц.
Иными словами, все делители hsd1.Init.ClockDiv, меньшие чем 4 - не прокатывают - частота 24.176 МГц.
Снять это ограничение можно, расковыряв HAL Куба.

Ниже частоты SD CLK, измеренные частотомером и значения hsd1.Init.ClockDiv:

Цитата
hsd1.Init.ClockDiv=4, CLK=24.176 MHz
hsd1.Init.ClockDiv=8, CLK=12.09 MHz
hsd1.Init.ClockDiv=32, CLK=3.023 MHz
hsd1.Init.ClockDiv=64, CLK=1.51 MHz
hsd1.Init.ClockDiv=128, CLK=0.756 MHz


На сильно низких частотах касание щупа частотомера к SD CLK приводит к повисанию SD карты.

GPIO настроены так (на всех линиях -встроенные PULL UP, кроме CLK. Внешних резисторов нет):

CODE
void HAL_SD_MspInit(SD_HandleTypeDef* hsd)
{

GPIO_InitTypeDef GPIO_InitStruct;

if(hsd->Instance==SDMMC1)
{
/* USER CODE BEGIN SDMMC1_MspInit 0 */

/* USER CODE END SDMMC1_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_SDMMC1_CLK_ENABLE();

/**SDMMC1 GPIO Configuration
PC8 ------> SDMMC1_D0
PC9 ------> SDMMC1_D1
PC10 ------> SDMMC1_D2
PC11 ------> SDMMC1_D3
PC12 ------> SDMMC1_CK
PD2 ------> SDMMC1_CMD
*/
GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11;
// |GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP; //!!! включить подтяжки!
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF12_SDIO1;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

//C12 => CK, NO PULL
GPIO_InitStruct.Pin = GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL; //!!!
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF12_SDIO1;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);


GPIO_InitStruct.Pin = GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP; //!!! включить подтяжки!
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF12_SDIO1;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

/* USER CODE BEGIN SDMMC1_MspInit 1 */

/* USER CODE END SDMMC1_MspInit 1 */
}
}


Иллюстрации ниже (подсоединение, втулки и SD-карты, которые успешно работают):

Нажмите для просмотра прикрепленного файла

Пробовал в High Speed Mode наскоряк переключить - не работает.
Включал путём установки:

Код
#define USE_SD_TRANSCEIVER 1
Alechek
Цитата(__inline__ @ Jul 31 2018, 06:34) *
Пробовал убирать ферритовую втулку с SDIO_CLK и понижать частоту SDIO CLK - карты не работают.

hsd1.Init.ClockDiv=128, CLK=0.756 MHz

В такой ситуации только логический анализатор поможет быстро разобраться.
Полагаю, опять STM косячнули и данные изменяются одновременно с фронтом клока.

Может попробовать CLK сделать длиннее/короче остальных линий?
Integro
Косячат тут не STшники
Если нужны большие скорости на этих соплях:
1. Укоротить провода до максимально коротких, 1-2см
2. Установить pull-up'ы в соответствии со спецификацией

Из опыта скажу, что при питании 3V и длине проводов 10-15 см на скорости 10MHz уже будут ошибки CRC

Если это только макет и планируется разводка PCB советую не заморачиваться и ждать нормальную плату, если это своя подделка, рекомендую привести все в порядок.
V_N
Добавлю свои пять копеек. STM32L476 - SDIO . Упорно не работали карты емкостью более 4 ГВ . Проблема решилась установкой резистора 30 ом в линию SDIO_CLK . с тех пор не встречал карт которые не работают.
aaarrr
Цитата(__inline__ @ Jul 31 2018, 04:34) *
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;

Зачем VERY_HIGH-то? Чтобы гарантированно не работало?
Alechek
Для 10 МГц да, 10 см провод уже длинноват.
Но речь то о 700 кГц!
aaarrr
Цитата(Alechek @ Jul 31 2018, 10:33) *
Для 10 МГц да, 10 см провод уже длинноват.
Но речь то о 700 кГц!

Да хоть 32кГц, без разницы: это всего лишь частота запуска лютой скорости фронта в линию.
Alechek
Цитата(aaarrr @ Jul 31 2018, 12:40) *
Да хоть 32кГц, без разницы: это всего лишь частота запуска лютой скорости фронта в линию.

И что с того? Ну создали жуткие помехи в радиоэфире. Не вижу причин не работать - когда придет время снимать данные на такой низкой скорости все уже устаканится.
Единственное, что приходит на ум - выброс напряжения в момент переходного процесса, превышающий допустимый.
aaarrr
Цитата(Alechek @ Jul 31 2018, 11:44) *
...когда придет время снимать данные

...карта уже выставит их 3 раза из-за "звона" на CLK, например (те самые "пропуски" данных, отмеченные ТС).
__inline__
Цитата(aaarrr @ Jul 31 2018, 07:31) *
Зачем VERY_HIGH-то? Чтобы гарантированно не работало?


Пробовал все линии и по-очереди делать в LOW. Без бусины тоже не работало, даже при CLK < 1 МГц. И это Куб изначально выставил, а не я sm.gif

Цитата
...карта уже выставит их 3 раза из-за "звона" на CLK, например (те самые "пропуски" данных, отмеченные ТС).


Был бы у меня глаз осциллограф, можно было посмотреть форму сигнала...... Соглашусь с ув. aaarrr, ферритовая бусина как раз душит СВЧ-всплески, от которых карта может несанкционированно передёргиваться.

Это макет. Сделать короче уже трудновато, много другой периферии висит.
На релизе будет печатная плата с земляными полигонами и всё как надо. Но футпринт заложить на резистор/бусину не помешает.

Мне удалось повысить SD CLK до 48 МГц - карта работает, прикрутил FatFs (не та, то с Куб-ом идёт, а свою отлаженную версию). MP3-файл декодируется нормально.
На 96 МГц уже не работает.
Никакими командами перевода в High Speed Mode не пользовался, просто увеличил CLK до 48 МГц.
Все три карты работают.

Спрашивается, зачем нужна команда для перевода в High Speed Mode, когда она при 3,3V нормально работает на быстром клоке 48..50МГц ?

В файле stm32h7xx_hal_sd.c сделать изменения в функции HAL_SD_ConfigWideBusOperation():
CODE

//..............
#if 0
/* Check if user Clock div < Normal speed 25Mhz, no change in Clockdiv */
if(hsd->Init.ClockDiv >= SDMMC_NSpeed_CLK_DIV)
{
Init.ClockDiv = hsd->Init.ClockDiv;
}
else
{
if(hsd->SdCard.CardSpeed == CARD_ULTRA_HIGH_SPEED)
{
Init.ClockDiv = hsd->Init.ClockDiv;
}
else
{
/* No High speed SD card */
Init.ClockDiv = SDMMC_NSpeed_CLK_DIV;
}
}
#endif

Init.ClockDiv = hsd->Init.ClockDiv; //!!! снимаем ограничение на SD CLK

SDMMC_Init(hsd->Instance, Init);
//.......

__inline__
Заимплементировал SDIO в работе декодера видео + FLAC.

Переписал Хало-Куб для работы с картами в HIGH_SPEED Mode. У Куба 2 крайности: либо карта в Standard Mode, либо в Ultra High Speed Mode (с понижением питания до 1.8V).
Мне же Ultra HS Mode не подошёл, так как питание карты 3.3V.
Поэтому сделал поддержку High Speed Mode (3.3V).

Частотомер выдал на SDIO CLK 48,6 МГц (вместо теоретических 50 МГц).

Подробнее тут: http://vrtp.ru/index.php?showtopic=29688&st=150
Там же исходники (High Speed Mode отключен, включить его - раскомментарить последнюю строку в main.c).

Видео в действии: http://www.youtube.com/watch?v=s2a_DqrIFaw
__inline__
Ферритовую бусину на SDIO CLK убрал на печатной плате (4-слойка, 2 внутренних полигона Vcc и GND), все карты работают. Даже на 48 МГц (HSM)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.