|
STM32F215 sdio, нет клока |
|
|
|
Jul 28 2011, 08:03
|
Участник

Группа: Участник
Сообщений: 47
Регистрация: 9-03-11
Пользователь №: 63 481

|
Собственная плата на 215 контроллере, SD_Init возвращает ошибку -- истек таймаут.
На ноге клок не видно вообще ничего, земля и все. На этом контроллере sdio как и на всех, на порте C и D висит.
Подтягивающие резисторы припаяны всюду, кроме клока.
В чем может быть проблема? И должен ли я видеть клок после SDIO_ClockCmd(ENABLE); если в настройках указано
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD, ENABLE); //RCC_APB2PeriphClockCmd( RCC_APB2Periph_SDIO, ENABLE );
GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_SDIO); GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_SDIO); GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_SDIO); GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_SDIO); GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_SDIO); GPIO_PinAFConfig(GPIOD, GPIO_PinSource2, GPIO_AF_SDIO);
// Configure PC.08, PC.09, PC.10, PC.11 pins: D0, D1, D2, D3 pins GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOC, &GPIO_InitStructure);
// Configure PD.02 CMD line GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_Init(GPIOD, &GPIO_InitStructure);
// Configure PC.12 pin: CLK pin GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOC, &GPIO_InitStructure); //!< Power ON Sequence --------------------------------------------------- //!< Configure the SDIO peripheral //!< SDIOCLK = HCLK, SDIO_CK = HCLK/(2 + SDIO_INIT_CLK_DIV //!< on STM32F2xx devices, SDIOCLK is fixed to 48MH //!< SDIO_CK for initialization should not exceed 400 KHz //SDIO_InitStructure2.SDIO_ClockDiv = 0x76; SDIO_InitStructure2.SDIO_ClockEdge = SDIO_ClockEdge_Rising; SDIO_InitStructure2.SDIO_ClockBypass = SDIO_ClockBypass_Disable; SDIO_InitStructure2.SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable; SDIO_InitStructure2.SDIO_BusWide = SDIO_BusWide_1b; SDIO_InitStructure2.SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable; SDIO_Init(&SDIO_InitStructure2);
//!< Set Power State to ON */ SDIO_SetPowerState(SDIO_PowerState_ON);
SDIO_ClockCmd(ENABLE); while( 1);
Сообщение отредактировал Vladimir Prokofiev - Jul 28 2011, 08:04
|
|
|
|
|
Jul 28 2011, 10:08
|
Участник

Группа: Участник
Сообщений: 47
Регистрация: 9-03-11
Пользователь №: 63 481

|
Цитата(Flexz @ Jul 28 2011, 13:12)  Кхм.. а клоки на SDIO действительно не включаете? Вы об //RCC_APB2PeriphClockCmd( RCC_APB2Periph_SDIO, ENABLE ); ? И так и так пробовал, разницы нет. Оно должно быть выключено? Для эвалборды у СТ вызывается функция Деинит в которой они включают клоки и сразу выключают. Но я запускал и собственно пример, тоже самое. Если в бесконечном цикле вызывать SI_Init() то на этих ногах что-то есть, но странное. D0 и D1 5 раз переходят в разное состояние, потом выходят на верхний уровень (подтяжка к VCC ) D2 B D3 В этот же момент переключаются в нижний уровень, потом выходят на верхний. А вот клока все одно нет и все. При этом если вызвать только один раз SI_Init() то все ноги в покое -- все кроме клока в 1, клок в 0.
|
|
|
|
|
Jul 28 2011, 10:37
|
Местный
  
Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797

|
Вообще-то да, на любую периферию клоки надо включать предварительно. F103 помнится вообще HardFault влетал, если начать настраивать что-то не включая клок. А примеры внимательнее читать надо  (либо может они у вас старо-глючные) вот код деинита из сэмплов Код void SDIO_DeInit(void) { RCC_APB2PeriphResetCmd(RCC_APB2Periph_SDIO, ENABLE); RCC_APB2PeriphResetCmd(RCC_APB2Periph_SDIO, DISABLE); } вкл-выкл что? резет, а не клоки. А перед деинитом вызывается SD_LowLevel_Init() который настраивает ноги и включает клок на SDIO: RCC_AHB1PeriphClockCmd(SD_SDIO_DMA_CLK, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_SDIO, ENABLE); без этого не работает. У вас отладочная плата есть или только своя?
Сообщение отредактировал Flexz - Jul 28 2011, 13:35
|
|
|
|
|
Jul 28 2011, 10:41
|
Участник

Группа: Участник
Сообщений: 47
Регистрация: 9-03-11
Пользователь №: 63 481

|
Цитата(Flexz @ Jul 28 2011, 14:37)  У вас отладочная плата есть или только своя? Своя только) Есть отладочная на 103... Да, вы правы, ошибочка вышла, ща попробуем...
Сообщение отредактировал Vladimir Prokofiev - Jul 28 2011, 10:41
|
|
|
|
|
Jul 28 2011, 11:01
|
Участник

Группа: Участник
Сообщений: 47
Регистрация: 9-03-11
Пользователь №: 63 481

|
Цитата(Flexz @ Jul 28 2011, 14:46)  Попробовал сейчас у себя, да клок начинает выдываться сразу после SDIO_ClockCmd(ENABLE); Нет все равно клока нету) Я открыл шаблон, добавил в него пример про микроСД, в настройках проекта указал 215 контроллер. А клока все равно нет... А у вас какой контроллер?
Сообщение отредактировал Vladimir Prokofiev - Jul 28 2011, 11:04
|
|
|
|
|
Jul 28 2011, 12:29
|
Участник

Группа: Участник
Сообщений: 47
Регистрация: 9-03-11
Пользователь №: 63 481

|
Спаял новую плату, с новым мк, на всякий случай. На плате вообще ничего нет, контроллер только и все. Запускаем пример uSDCard клока на 53 ноге ( PC12 ) нету все равно...
|
|
|
|
|
Jul 28 2011, 13:34
|
Местный
  
Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797

|
У меня мыслей больше нету.. Я там скосячил несколькими постами выше, неглядя скопипастил не то должно быть RCC_APB2PeriphClockCmd(RCC_APB2Periph_SDIO, ENABLE); а не RCC_AHB1PeriphClockCmd(SD_SDIO_DMA_CLK, ENABLE);
Кстати, насчет новых МК, с f103 были преценденты - вроде рабочий код, а глючит, перепаиваем другой проц - работает. Толи непропай, толи проц битый, но было несколько раз.
|
|
|
|
|
Aug 12 2011, 13:23
|
Участник

Группа: Участник
Сообщений: 47
Регистрация: 9-03-11
Пользователь №: 63 481

|
Начал сначала. Собрал все в одну функцию -- переписывал из примера, чтобы понятней было. Когда доходим до while(1) на этой ноге все так же отсутствует клок. При этом я сначала ее инициализирую как OUT и я вижу что она дергается, работает типо. После while(1) она в нуле постоянно... Что делать? Совсем беда... CODE void mySDInit( void ){ uint32_t regSDIO_CLKCR;
GPIO_InitTypeDef GPIO_InitStructure; SDIO_InitTypeDef SDIO_InitStructure;
/* GPIOC and GPIOD Periph clock enable */ RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD, ENABLE ); /* Enable the SDIO APB2 Clock */ RCC_APB2PeriphClockCmd( RCC_APB2Periph_SDIO, ENABLE );
/* Configure PC.12 pin: CLK pin */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIOC->BSRRL = GPIO_Pin_12; GPIOC->BSRRH = GPIO_Pin_12; GPIOC->BSRRL = GPIO_Pin_12; GPIOC->BSRRH = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_Init(GPIOC, &GPIO_InitStructure); /* Configure PD.02 CMD line */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOD, &GPIO_InitStructure);
/* Configure PC.08, PC.09, PC.10, PC.11 pins: D0, D1, D2, D3 pins */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_SDIO); GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_SDIO); GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_SDIO); GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_SDIO); GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_SDIO); GPIO_PinAFConfig(GPIOD, GPIO_PinSource2, GPIO_AF_SDIO);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_SDIO, ENABLE); RCC_APB2PeriphResetCmd(RCC_APB2Periph_SDIO, DISABLE); SDIO_InitStructure.SDIO_ClockDiv = SDIO_INIT_CLK_DIV; SDIO_InitStructure.SDIO_ClockEdge = SDIO_ClockEdge_Rising; SDIO_InitStructure.SDIO_ClockBypass = SDIO_ClockBypass_Enable; SDIO_InitStructure.SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable; SDIO_InitStructure.SDIO_BusWide = SDIO_BusWide_1b; SDIO_InitStructure.SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable; SDIO_Init(&SDIO_InitStructure);
/*!< Set Power State to ON */ SDIO_SetPowerState(SDIO_PowerState_ON);
/*!< Enable SDIO Clock */ SDIO_ClockCmd(ENABLE); regSDIO_CLKCR = SDIO->CLKCR; while( 1 ); } Прошу прощение за отсутствие форматирования. Если добавлять с форматированием, то видно не весь код, почему-то Посмотрел регистр SDIO->CLKCR = 1142. Т.е. бит клока реально не выставлен. Если ему руками написать что-то типо SDIO->CLKCR = SDIO->CLKCR | ( 1 << 8 ); а потом прочитать, то увижу опять 1142 а не 1398. Т.е это бит не выставляется, почему-то... Есть идеи?
Сообщение отредактировал Vladimir Prokofiev - Aug 12 2011, 12:57
|
|
|
|
|
Aug 15 2011, 08:36
|
Участник

Группа: Участник
Сообщений: 47
Регистрация: 9-03-11
Пользователь №: 63 481

|
После SDIO_SetPowerState(SDIO_PowerState_ON); Соответствующие биты в регистре питания тоже не выставляются. Регистр нулевой до и после подачи питания, хотя эта функция как раз и выставляет эти биты. Я ждал после записи в регистр Delay(100) так как в даташите написано что перед новой записью надо подождать определенное время. Не могу понять почему не получается записывать в регистры...
Таким образом удается записать новое значение в регистр только внутри SDIO_Init...
Сообщение отредактировал Vladimir Prokofiev - Aug 15 2011, 08:37
|
|
|
|
|
Jun 14 2012, 11:43
|
Участник

Группа: Участник
Сообщений: 22
Регистрация: 12-05-09
Пользователь №: 48 986

|
У меня такая же проблема с SDIO, но на МК stm32f417zg. Подскажи ты ее смог решить?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|