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

 
 
> STM32F215 sdio, нет клока
Vladimir Prokofi...
сообщение Jul 28 2011, 08:03
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Taran87
сообщение Jun 14 2012, 11:43
Сообщение #2


Участник
*

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



У меня такая же проблема с SDIO, но на МК stm32f417zg. Подскажи ты ее смог решить?
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Oct 25 2014, 02:17
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



Кто-нибудь разобрался с настройкой SDIO ?

У меня , при попытке передать cmd команду, на линиях CMD и CK тишина.
Процессор STM32L151RDT
Мысли такие:
1)Не совсем уверен, что номер периферии, которую надо включить на ногах, на самом деле 12. В документации не очень понятно написано.
2) Не понятно, какая именно последовательность действий нужна для передачи CMD. Записать что-то в регистр ARG , записать что-тов регистр CMD , и команда сразу должна начать передаваться ? Или ещё есть какой-нибудь бит запуска передачи ?


CODE
//////
//настраиваем порт
RCC->AHBENR |= RCC_AHBENR_GPIOCEN;
RCC->AHBENR |= RCC_AHBENR_GPIODEN;

GPIOC->OSPEEDR|= GPIO_OSPEEDER_OSPEEDR8|GPIO_OSPEEDER_OSPEEDR9|GPIO_OSPEEDER_OSPEEDR10|GPIO_OSPEE
DER_OSPEEDR11| GPIO_OSPEEDER_OSPEEDR11;
GPIOD->OSPEEDR|= GPIO_OSPEEDER_OSPEEDR2;

GPIOC->MODER &= ~GPIO_MODER_MODER8;
GPIOC->MODER |= GPIO_MODER_MODER8_1;
GPIOC->MODER &= ~GPIO_MODER_MODER9;
GPIOC->MODER |= GPIO_MODER_MODER9_1;
GPIOC->MODER &= ~GPIO_MODER_MODER10;
GPIOC->MODER |= GPIO_MODER_MODER10_1;
GPIOC->MODER &= ~GPIO_MODER_MODER11;
GPIOC->MODER |= GPIO_MODER_MODER11_1;
GPIOC->MODER &= ~GPIO_MODER_MODER12;
GPIOC->MODER |= GPIO_MODER_MODER12_1;

GPIOD->MODER &= ~GPIO_MODER_MODER2;
GPIOD->MODER |= GPIO_MODER_MODER2_1;

GPIOC->AFR[1]|=(12<<0);
GPIOC->AFR[1]|=(12<<4);
GPIOC->AFR[1]|=(12<<8);
GPIOC->AFR[1]|=(12<<12);
GPIOC->AFR[1]|=(12<<16);

GPIOD->AFR[0]|=(12<<8);

///////Настраиваем SDIO
RCC->APB2ENR|=RCC_APB2ENR_SDIOEN; // включаем тактирование

RCC->APB2RSTR|=RCC_APB2RSTR_SDIORST;
RCC->APB2RSTR&=~RCC_APB2RSTR_SDIORST; //сброс настроек

SDIO->CLKCR|=SDIO_CLKCR_HWFC_EN; //HW Flow Control is enabled
SDIO->CLKCR|=SDIO_CLKCR_WIDBUS_0; // 4-wide bus mode: SDIO_D[3:0] used
SDIO->CLKCR|=SDIO_CLKCR_PWRSAV; //SDIO_CK is only enabled when the bus is active
SDIO->CLKCR|=SDIO_CLKCR_CLKEN; //SDIO_CK is enabled

SDIO->CLKCR|=SDIO_CMD_CPSMEN; //Command path state machine (CPSM) Enable bit
SDIO->CLKCR|=SDIO_CMD_WAITPEND; //CPSM Waits for ends of data transfer

SDIO->DTIMER=400000; //Data timeout period

SDIO->DLEN=512; //Data length value

SDIO->DCTRL|=SDIO_DCTRL_SDIOEN;
SDIO->DCTRL|=SDIO_DCTRL_DTMODE; //SDIOEN=1 and DTMODE=1, the peripheral enables an SDIO multibyte transfer. //Непонятно, что это
SDIO->DCTRL|=SDIO_DCTRL_RWMOD; //Read Wait control using SDIO_CK ///Непонятно, что это
SDIO->DCTRL|=SDIO_DCTRL_DBLOCKSIZE_0 | SDIO_DCTRL_DBLOCKSIZE_3; // размер блока 512

///Пытаемся передать команту
char cmd=CMD0
while(1)
{
SDIO->CLKCR|=SDIO_CMD_WAITRESP_0; //Short response, expect CMDREND or CCRCFAIL flag
SDIO->CLKCR &=~ SDIO_CMD_WAITRESP_1;

SDIO->CLKCR|=SDIO_CMD_CPSMEN; //Command path state machine (CPSM) Enable bit

SDIO->CLKCR &=~ SDIO_CMD_CMDINDEX;
SDIO->CLKCR |=(cmd & SDIO_CMD_CMDINDEX);
SDIO->ARG=0;

}


Сообщение отредактировал IgorKossak - Oct 25 2014, 20:16
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 25 2014, 06:21
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(MiklPolikov @ Oct 25 2014, 08:17) *
Кто-нибудь разобрался с настройкой SDIO ?

  1. 12 - правильно, по крайней мере для F4 так;
  2. Сначала включайте тактирование SDIO, а уже потом - подключайте ножки к альтернативным функциям;
  3. В настройке ног у вас два раза GPIO_OSPEEDER_OSPEEDR11 (и нет GPIO_OSPEEDER_OSPEEDR12);
  4. После включения тактирования добавьте __DSB();
  5. SDIO->CLKCR нужно обнулить перед тем как делать ему SDIO->CLKCR |= ...;
  6. Для инициализации используется однобитная шина и медленная скорость (не более 400 КГц);
  7. Пока хватитsm.gif

ЗЫ. Чтобы не раскапывать всё это самостоятельно, посмотрите вот эти примеры. Там всё сделано не в пример проще, чем в примерах от ST.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Oct 26 2014, 00:59
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702




АНТОХА, спасибо, примеры очень хорошие, у меня всё заработало. Напишу осмысленный код, и выложу тут.

Цитата
[*] Сначала включайте тактирование SDIO, а уже потом - подключайте ножки к альтернативным функциям;

Так сказано где-то в документации ? Мне всегда казалось, что порт и периферия ни как не связаны в плане тактирования, и их можно включать и настраивать в любой последовательности. Всегда сначала включал тактирование порта и настраивал его, потом то же самое с периферией. Сейчас с SDIO так же сделал и работает.


Цитата
[*] После включения тактирования добавьте __DSB();

Здравая мысль. Но каким-то образом у меня всё всегда работало без этого __dsb();

Цитата
[*] SDIO->CLKCR нужно обнулить перед тем как делать ему SDIO->CLKCR |= ...;

Зачем ? Там после ресета и так 0.






--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 26 2014, 07:07
Сообщение #6


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(MiklPolikov @ Oct 26 2014, 05:59) *
Так сказано где-то в документации ? Мне всегда казалось, что порт и периферия ни как не связаны в плане тактирования, и их можно включать и настраивать в любой последовательности. Всегда сначала включал тактирование порта и настраивал его, потом то же самое с периферией. Сейчас с SDIO так же сделал и работает.

Я не помню, откуда я это взял. Возможно, мне подсознательно кажется, что нельзя подключать ноги к неработающему модулю. (И, вроде бы, на F1xx при попытке включить remap до включения тактирования происходило зависание, но не уверен). В общем, если заработало в ином порядке - хорошо, замечание снимаетсяsm.gif
Цитата(MiklPolikov @ Oct 26 2014, 05:59) *
Здравая мысль. Но каким-то образом у меня всё всегда работало без этого __dsb();

В 99% случаев сработает и без __DSB(), но в 1% - зависнет. Такие глюки тяжелее всего ловить.
Объясню, отчего так происходит. Может случиться так, что матрица шин загружена, запись в AHBENR задержится, и следующая после включения тактирования команда выполнится раньше, чем собственно включится тактирование. И если эта следующая команда обратится к периферии модуля, то произойдёт сбой. Команда __DSB() приостанавливает выполнение кода до тех пор, пока все записи по всем шинам не завершатся.
(В либах от ST из-за их "многословности" такое практически исключено, там между включением тактирования и обращением к модулю гарантированно выполнится ещё десяток команд).
Цитата(MiklPolikov @ Oct 26 2014, 05:59) *
Зачем ? Там после ресета и так 0.

Ну, может быть, вы захотите вызывать свою процедуру инициализации не только после резета.
Вы же точно знаете, что в начале вашей процедуры инициализации SDIO->CLKCR должен быть 0. Вот и задаёте его значение явно, это придаст вашему коду дополнительную надёжность. (И к тому же сократит кодsm.gif ( "=" вместо "|=") ).


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Oct 26 2014, 11:42
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



Цитата(AHTOXA @ Oct 26 2014, 11:07) *
В 99% случаев сработает и без __DSB(), но в 1% - зависнет. Такие глюки тяжелее всего ловить.
Объясню, отчего так происходит. Может случиться так, что матрица шин загружена, запись в AHBENR задержится, и следующая после включения тактирования команда выполнится раньше, чем собственно включится тактирование. И если эта следующая команда обратится к периферии модуля, то произойдёт сбой. Команда __DSB() приостанавливает выполнение кода до тех пор, пока все записи по всем шинам не завершатся.
(В либах от ST из-за их "многословности" такое практически исключено, там между включением тактирования и обращением к модулю гарантированно выполнится ещё десяток команд).

Ну, может быть, вы захотите вызывать свою процедуру инициализации не только после резета.
Вы же точно знаете, что в начале вашей процедуры инициализации SDIO->CLKCR должен быть 0. Вот и задаёте его значение явно, это придаст вашему коду дополнительную надёжность. (И к тому же сократит кодsm.gif ( "=" вместо "|=") ).


В STM32L обращение к регистрам включенной периферии не вызывает зависание, просто в регистры не пишется.

Перед настройкой периферии я всегда делаю ресет этой периферии. И вот это-хороший тон.


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Vladimir Prokofiev   STM32F215 sdio   Jul 28 2011, 08:03
- - Flexz   Кхм.. а клоки на SDIO действительно не включаете?   Jul 28 2011, 09:12
|- - Vladimir Prokofiev   Цитата(Flexz @ Jul 28 2011, 13:12) Кхм.. ...   Jul 28 2011, 10:08
- - Flexz   Вообще-то да, на любую периферию клоки надо включа...   Jul 28 2011, 10:37
|- - Vladimir Prokofiev   Цитата(Flexz @ Jul 28 2011, 14:37) У вас ...   Jul 28 2011, 10:41
- - Flexz   Попробовал сейчас у себя, да клок начинает выдыват...   Jul 28 2011, 10:46
|- - Vladimir Prokofiev   Цитата(Flexz @ Jul 28 2011, 14:46) Попроб...   Jul 28 2011, 11:01
- - Flexz   stm32f217zgt6, пользую отладочную плату от стартер...   Jul 28 2011, 11:13
|- - Vladimir Prokofiev   Спаял новую плату, с новым мк, на всякий случай. Н...   Jul 28 2011, 12:29
- - Flexz   У меня мыслей больше нету.. Я там скосячил несколь...   Jul 28 2011, 13:34
|- - AHTOXA   А тактирование AFIO в 2xx разве не надо включать?   Jul 28 2011, 18:32
- - Flexz   не, F2xx нету такой штуки как AFIO. Точнее коммута...   Jul 29 2011, 06:11
|- - Vladimir Prokofiev   Начал сначала. Собрал все в одну функцию -- перепи...   Aug 12 2011, 13:23
|- - Vladimir Prokofiev   После SDIO_SetPowerState(SDIO_PowerState_ON); С...   Aug 15 2011, 08:36
|- - AHTOXA   Цитата(MiklPolikov @ Oct 26 2014, 16:42) ...   Oct 26 2014, 14:04
- - Golikov A.   ЦитатаТак сказано где-то в документации ? у NXP в ...   Oct 26 2014, 05:02
|- - GetSmart   Цитата(Golikov A. @ Oct 26 2014, 09:02) у...   Oct 26 2014, 22:17
- - Golikov A.   ЦитатаЦитату можете привести? LPC1768 UM10360 в на...   Oct 27 2014, 06:08
|- - GetSmart   Цитата(Golikov A. @ Oct 27 2014, 10:08) L...   Oct 28 2014, 03:25
- - Golikov A.   ну наверное это верно. Надо читать мануал и делать...   Oct 28 2014, 05:30
|- - MiklPolikov   Цитата(Golikov A. @ Oct 28 2014, 09:30) н...   Oct 29 2014, 14:31
- - Golikov A.   а не по этой команде определяется тип карты?   Oct 29 2014, 14:42
- - hd44780   Таймаут на CMD17 и у меня регулярно вылетает на F4...   Oct 29 2014, 16:12
- - MiklPolikov   Цитата(hd44780 @ Oct 29 2014, 20:12) Тайм...   Oct 29 2014, 18:01
- - MiklPolikov   Со всем разобрался. Выложил свой код тут http://el...   Nov 1 2014, 18:00


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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 20:54
Рейтинг@Mail.ru


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