vprokofiev 0 28 июля, 2011 Опубликовано 28 июля, 2011 (изменено) · Жалоба Собственная плата на 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); Изменено 28 июля, 2011 пользователем Vladimir Prokofiev Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flexz 0 28 июля, 2011 Опубликовано 28 июля, 2011 · Жалоба Кхм.. а клоки на SDIO действительно не включаете? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vprokofiev 0 28 июля, 2011 Опубликовано 28 июля, 2011 · Жалоба Кхм.. а клоки на SDIO действительно не включаете? Вы об //RCC_APB2PeriphClockCmd( RCC_APB2Periph_SDIO, ENABLE ); ? И так и так пробовал, разницы нет. Оно должно быть выключено? Для эвалборды у СТ вызывается функция Деинит в которой они включают клоки и сразу выключают. Но я запускал и собственно пример, тоже самое. Если в бесконечном цикле вызывать SI_Init() то на этих ногах что-то есть, но странное. D0 и D1 5 раз переходят в разное состояние, потом выходят на верхний уровень (подтяжка к VCC ) D2 B D3 В этот же момент переключаются в нижний уровень, потом выходят на верхний. А вот клока все одно нет и все. При этом если вызвать только один раз SI_Init() то все ноги в покое -- все кроме клока в 1, клок в 0. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flexz 0 28 июля, 2011 Опубликовано 28 июля, 2011 (изменено) · Жалоба Вообще-то да, на любую периферию клоки надо включать предварительно. 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); без этого не работает. У вас отладочная плата есть или только своя? Изменено 28 июля, 2011 пользователем Flexz Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vprokofiev 0 28 июля, 2011 Опубликовано 28 июля, 2011 (изменено) · Жалоба У вас отладочная плата есть или только своя? Своя только) Есть отладочная на 103... Да, вы правы, ошибочка вышла, ща попробуем... Изменено 28 июля, 2011 пользователем Vladimir Prokofiev Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flexz 0 28 июля, 2011 Опубликовано 28 июля, 2011 · Жалоба Попробовал сейчас у себя, да клок начинает выдываться сразу после SDIO_ClockCmd(ENABLE); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vprokofiev 0 28 июля, 2011 Опубликовано 28 июля, 2011 (изменено) · Жалоба Попробовал сейчас у себя, да клок начинает выдываться сразу после SDIO_ClockCmd(ENABLE); Нет все равно клока нету) Я открыл шаблон, добавил в него пример про микроСД, в настройках проекта указал 215 контроллер. А клока все равно нет... А у вас какой контроллер? Изменено 28 июля, 2011 пользователем Vladimir Prokofiev Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flexz 0 28 июля, 2011 Опубликовано 28 июля, 2011 · Жалоба stm32f217zgt6, пользую отладочную плату от стартеркита, пока свои ждут комплектации. Еще один шальной комент у вас в коде заметил //SDIO_InitStructure2.SDIO_ClockDiv = 0x76; но, вроде бы и без него клок должен быть, хотя и слишком быстрый для инициализации Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vprokofiev 0 28 июля, 2011 Опубликовано 28 июля, 2011 · Жалоба Спаял новую плату, с новым мк, на всякий случай. На плате вообще ничего нет, контроллер только и все. Запускаем пример uSDCard клока на 53 ноге ( PC12 ) нету все равно... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flexz 0 28 июля, 2011 Опубликовано 28 июля, 2011 · Жалоба У меня мыслей больше нету.. Я там скосячил несколькими постами выше, неглядя скопипастил не то должно быть RCC_APB2PeriphClockCmd(RCC_APB2Periph_SDIO, ENABLE); а не RCC_AHB1PeriphClockCmd(SD_SDIO_DMA_CLK, ENABLE); Кстати, насчет новых МК, с f103 были преценденты - вроде рабочий код, а глючит, перепаиваем другой проц - работает. Толи непропай, толи проц битый, но было несколько раз. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 28 июля, 2011 Опубликовано 28 июля, 2011 · Жалоба А тактирование AFIO в 2xx разве не надо включать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flexz 0 29 июля, 2011 Опубликовано 29 июля, 2011 · Жалоба не, F2xx нету такой штуки как AFIO. Точнее коммутация альтернативных функций теперь встроена в контроллер GPIO, где ей и место. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vprokofiev 0 12 августа, 2011 Опубликовано 12 августа, 2011 (изменено) · Жалоба Начал сначала. Собрал все в одну функцию -- переписывал из примера, чтобы понятней было. Когда доходим до while(1) на этой ноге все так же отсутствует клок. При этом я сначала ее инициализирую как OUT и я вижу что она дергается, работает типо. После while(1) она в нуле постоянно... Что делать? Совсем беда... 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. Т.е это бит не выставляется, почему-то... Есть идеи? Изменено 12 августа, 2011 пользователем Vladimir Prokofiev Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vprokofiev 0 15 августа, 2011 Опубликовано 15 августа, 2011 (изменено) · Жалоба После SDIO_SetPowerState(SDIO_PowerState_ON); Соответствующие биты в регистре питания тоже не выставляются. Регистр нулевой до и после подачи питания, хотя эта функция как раз и выставляет эти биты. Я ждал после записи в регистр Delay(100) так как в даташите написано что перед новой записью надо подождать определенное время. Не могу понять почему не получается записывать в регистры... Таким образом удается записать новое значение в регистр только внутри SDIO_Init... Изменено 15 августа, 2011 пользователем Vladimir Prokofiev Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TAran87 0 14 июня, 2012 Опубликовано 14 июня, 2012 · Жалоба У меня такая же проблема с SDIO, но на МК stm32f417zg. Подскажи ты ее смог решить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться