Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум разработчиков электроники ELECTRONIX.ru _ ARM _ STM32H743 и SDIO

Автор: __inline__ Jul 30 2018, 10:06

Подсоединил 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 Jul 30 2018, 10:12

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


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


У меня тоже заказана такая же плата. Начинаю потихоньку переживать , похоже редкостный глюкодром, судя по последним темам....

Автор: __inline__ Jul 30 2018, 10:14

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


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

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


Автор: nanorobot Jul 30 2018, 10:24

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

Уповаю на Jiovanni di Sirio c его ChibiOS / HAL - еще ни разу не подводил. Кстати советую попробвать...

Автор: __inline__ Jul 30 2018, 13:52

Удалось запустить SD карту SD HC 10-й класс скорости + 1-й класс в терминологии UHS-I . Емкостью 16 ГБ.

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

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

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

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

Питание на карту беру от встроенного на плате LDO 3,3V. Между питанием и землёй карты - тантал 10 мкФ + керамика 0.1 мкФ.

Автор: MasterElectric Jul 30 2018, 15:44

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


Это мы рукожопые, а не они)

Автор: Obam Jul 30 2018, 16:21

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

Выкрутасы из методов техники СВЧ как-бы не вредны, но это уже какой-то "шаманизм". Тогда уж и на каждый DAT по бусинке.

Автор: nanorobot Jul 30 2018, 16:25

Цитата(MasterElectric @ Jul 30 2018, 20:44) *
Это мы рукожопые, а не они)

Тут про SPI четыре страницы накатали. c F0 и F4 проблем с SPI не имел. Ну почти не имел.

Автор: __inline__ Jul 31 2018, 01:34

Укоротил все линии соединения с 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 Jul 31 2018, 06:14

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

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

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

Может попробовать CLK сделать длиннее/короче остальных линий?

Автор: Integro Jul 31 2018, 06:32

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

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

Если это только макет и планируется разводка PCB советую не заморачиваться и ждать нормальную плату, если это своя подделка, рекомендую привести все в порядок.

Автор: V_N Jul 31 2018, 07:31

Добавлю свои пять копеек. STM32L476 - SDIO . Упорно не работали карты емкостью более 4 ГВ . Проблема решилась установкой резистора 30 ом в линию SDIO_CLK . с тех пор не встречал карт которые не работают.

Автор: aaarrr Jul 31 2018, 07:31

Цитата(__inline__ @ Jul 31 2018, 04:34) *
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;

Зачем VERY_HIGH-то? Чтобы гарантированно не работало?

Автор: Alechek Jul 31 2018, 07:33

Для 10 МГц да, 10 см провод уже длинноват.
Но речь то о 700 кГц!

Автор: aaarrr Jul 31 2018, 07:40

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

Да хоть 32кГц, без разницы: это всего лишь частота запуска лютой скорости фронта в линию.

Автор: Alechek Jul 31 2018, 08:44

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

И что с того? Ну создали жуткие помехи в радиоэфире. Не вижу причин не работать - когда придет время снимать данные на такой низкой скорости все уже устаканится.
Единственное, что приходит на ум - выброс напряжения в момент переходного процесса, превышающий допустимый.

Автор: aaarrr Jul 31 2018, 08:50

Цитата(Alechek @ Jul 31 2018, 11:44) *
...когда придет время снимать данные

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

Автор: __inline__ Jul 31 2018, 09:27

Цитата(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__ Aug 2 2018, 10:38

Заимплементировал 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://electronix.ru/redirect.php?http://vrtp.ru/index.php?showtopic=29688&st=150
Там же исходники (High Speed Mode отключен, включить его - раскомментарить последнюю строку в main.c).

Видео в действии: http://electronix.ru/redirect.php?http://www.youtube.com/watch?v=s2a_DqrIFaw

Автор: __inline__ Sep 27 2018, 09:42

Ферритовую бусину на SDIO CLK убрал на печатной плате (4-слойка, 2 внутренних полигона Vcc и GND), все карты работают. Даже на 48 МГц (HSM)

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)