Перейти к содержанию

    

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Подсоединил DS карту к STM32H743(отладка Nucleo) к SDIO1. Сгенерировал Кубом Хал и вперёд.

 

 

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

 

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

Изменено пользователем nanorobot

Поделиться сообщением


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

 

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

 

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

 

post-99126-1532946046_thumb.jpg

Изменено пользователем __inline__

Поделиться сообщением


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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

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

 

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

 

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

Изменено пользователем __inline__

Поделиться сообщением


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

 

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

Поделиться сообщением


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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Это мы рукожопые, а не они)

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Укоротил все линии соединения с 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

Изменено пользователем IgorKossak
[codebox] для длинного кода. [code]-для короткого!!!

Поделиться сообщением


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

 

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

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Для 10 МГц да, 10 см провод уже длинноват.

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация