реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> STM32H743 и SDIO, битые данные
__inline__
сообщение Jul 30 2018, 10:06
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 257
Регистрация: 5-09-17
Пользователь №: 99 126



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

В чем может быть проблема?
Go to the top of the page
 
+Quote Post
nanorobot
сообщение Jul 30 2018, 10:12
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 244
Регистрация: 29-02-08
Пользователь №: 35 503



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


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


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

Сообщение отредактировал nanorobot - Jul 30 2018, 10:15
Go to the top of the page
 
+Quote Post
__inline__
сообщение Jul 30 2018, 10:14
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 257
Регистрация: 5-09-17
Пользователь №: 99 126



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


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

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

Прикрепленное изображение


Сообщение отредактировал __inline__ - Jul 30 2018, 10:21
Go to the top of the page
 
+Quote Post
nanorobot
сообщение Jul 30 2018, 10:24
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 244
Регистрация: 29-02-08
Пользователь №: 35 503



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

Уповаю на Jiovanni di Sirio c его ChibiOS / HAL - еще ни разу не подводил. Кстати советую попробвать...
Go to the top of the page
 
+Quote Post
__inline__
сообщение Jul 30 2018, 13:52
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 257
Регистрация: 5-09-17
Пользователь №: 99 126



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

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

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

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

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

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

Сообщение отредактировал __inline__ - Jul 30 2018, 13:54
Go to the top of the page
 
+Quote Post
MasterElectric
сообщение Jul 30 2018, 15:44
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 19-07-18
Пользователь №: 106 151



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


Это мы рукожопые, а не они)
Go to the top of the page
 
+Quote Post
Obam
сообщение Jul 30 2018, 16:21
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



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

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


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
nanorobot
сообщение Jul 30 2018, 16:25
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 244
Регистрация: 29-02-08
Пользователь №: 35 503



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

Тут про SPI четыре страницы накатали. c F0 и F4 проблем с SPI не имел. Ну почти не имел.
Go to the top of the page
 
+Quote Post
__inline__
сообщение Jul 31 2018, 01:34
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 257
Регистрация: 5-09-17
Пользователь №: 99 126



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


Сообщение отредактировал IgorKossak - Jul 31 2018, 06:32
Причина редактирования: [codebox] для длинного кода. [code]-для короткого!!!
Go to the top of the page
 
+Quote Post
Alechek
сообщение Jul 31 2018, 06:14
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



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

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

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

Может попробовать CLK сделать длиннее/короче остальных линий?
Go to the top of the page
 
+Quote Post
Integro
сообщение Jul 31 2018, 06:32
Сообщение #11


Частый гость
**

Группа: Свой
Сообщений: 167
Регистрация: 25-12-09
Из: Минск
Пользователь №: 54 460



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

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

Если это только макет и планируется разводка PCB советую не заморачиваться и ждать нормальную плату, если это своя подделка, рекомендую привести все в порядок.
Go to the top of the page
 
+Quote Post
V_N
сообщение Jul 31 2018, 07:31
Сообщение #12


Частый гость
**

Группа: Свой
Сообщений: 162
Регистрация: 12-01-09
Из: Харьков
Пользователь №: 43 270



Добавлю свои пять копеек. STM32L476 - SDIO . Упорно не работали карты емкостью более 4 ГВ . Проблема решилась установкой резистора 30 ом в линию SDIO_CLK . с тех пор не встречал карт которые не работают.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 31 2018, 07:31
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

Зачем VERY_HIGH-то? Чтобы гарантированно не работало?
Go to the top of the page
 
+Quote Post
Alechek
сообщение Jul 31 2018, 07:33
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Для 10 МГц да, 10 см провод уже длинноват.
Но речь то о 700 кГц!
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 31 2018, 07:40
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

Да хоть 32кГц, без разницы: это всего лишь частота запуска лютой скорости фронта в линию.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th April 2024 - 14:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.01508 секунд с 7
ELECTRONIX ©2004-2016