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

 
 
> 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
 
Start new topic
Ответов
__inline__
сообщение Jul 31 2018, 01:34
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 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
aaarrr
сообщение Jul 31 2018, 07:31
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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
__inline__
сообщение Jul 31 2018, 09:27
Сообщение #4


Местный
***

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



Цитата(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__ - Jul 31 2018, 09:31
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- __inline__   STM32H743 и SDIO   Jul 30 2018, 10:06
- - nanorobot   Цитата(__inline__ @ Jul 30 2018, 15:06) П...   Jul 30 2018, 10:12
|- - __inline__   Цитата(nanorobot @ Jul 30 2018, 10:12) У ...   Jul 30 2018, 10:14
|- - nanorobot   Цитата(__inline__ @ Jul 30 2018, 15:14) Н...   Jul 30 2018, 10:24
- - __inline__   Удалось запустить SD карту SD HC 10-й класс скорос...   Jul 30 2018, 13:52
|- - Obam   Цитата(__inline__ @ Jul 30 2018, 16:52) У...   Jul 30 2018, 16:21
- - MasterElectric   Цитата(nanorobot @ Jul 30 2018, 13:12) У ...   Jul 30 2018, 15:44
|- - nanorobot   Цитата(MasterElectric @ Jul 30 2018, 20:4...   Jul 30 2018, 16:25
|- - Alechek   Цитата(__inline__ @ Jul 31 2018, 06:34) П...   Jul 31 2018, 06:14
- - Integro   Косячат тут не STшники Если нужны большие скорости...   Jul 31 2018, 06:32
- - V_N   Добавлю свои пять копеек. STM32L476 - SDIO . Упорн...   Jul 31 2018, 07:31
- - Alechek   Для 10 МГц да, 10 см провод уже длинноват. Но речь...   Jul 31 2018, 07:33
|- - aaarrr   Цитата(Alechek @ Jul 31 2018, 10:33) Для ...   Jul 31 2018, 07:40
|- - Alechek   Цитата(aaarrr @ Jul 31 2018, 12:40) Да хо...   Jul 31 2018, 08:44
|- - aaarrr   Цитата(Alechek @ Jul 31 2018, 11:44) ...к...   Jul 31 2018, 08:50
- - __inline__   Заимплементировал SDIO в работе декодера видео + F...   Aug 2 2018, 10:38
- - __inline__   Ферритовую бусину на SDIO CLK убрал на печатной пл...   Sep 27 2018, 09:42


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

 


RSS Текстовая версия Сейчас: 23rd August 2025 - 16:23
Рейтинг@Mail.ru


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