Jump to content

    

STM32H743 и SDIO

Подсоединил 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 все карты работают.

 

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

Share this post


Link to post
Share on other sites
Подсоединил DS карту к STM32H743(отладка Nucleo) к SDIO1. Сгенерировал Кубом Хал и вперёд.

 

 

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

 

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

Edited by nanorobot

Share this post


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

 

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

 

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

 

post-99126-1532946046_thumb.jpg

Edited by __inline__

Share this post


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

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

Share this post


Link to post
Share on other sites

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

 

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

 

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

 

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

 

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

 

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

Edited by __inline__

Share this post


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

 

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

Share this post


Link to post
Share on other sites
Удалось запустить SD карту SD HC 10-й класс скорости ... после как на линию CLK повешал ферритовую втулку (с провода питания ноутбука - длина суть больше 1 см). Без ферритовой втулки даёт CRC-ERROR и битые данные.

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

Share this post


Link to post
Share on other sites
Это мы рукожопые, а не они)

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

Share this post


Link to post
Share on other sites

Укоротил все линии соединения с 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. Внешних резисторов нет):

 

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-карты, которые успешно работают):

 

post-99126-1533000844_thumb.jpg

 

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

Включал путём установки:

 

#define USE_SD_TRANSCEIVER 1

Edited by IgorKossak
[codebox] для длинного кода. [code]-для короткого!!!

Share this post


Link to post
Share on other sites
Пробовал убирать ферритовую втулку с SDIO_CLK и понижать частоту SDIO CLK - карты не работают.

 

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

В такой ситуации только логический анализатор поможет быстро разобраться.

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

 

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

Share this post


Link to post
Share on other sites

Косячат тут не STшники

Если нужны большие скорости на этих соплях:

1. Укоротить провода до максимально коротких, 1-2см

2. Установить pull-up'ы в соответствии со спецификацией

 

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

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;

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

Share this post


Link to post
Share on other sites

Для 10 МГц да, 10 см провод уже длинноват.

Но речь то о 700 кГц!

Share this post


Link to post
Share on other sites
Для 10 МГц да, 10 см провод уже длинноват.

Но речь то о 700 кГц!

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this