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