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

 
 
> 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
3 страниц V   1 2 3 >  
Start new topic
Ответов (1 - 30)
Flexz
сообщение Jul 28 2011, 09:12
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797



Кхм.. а клоки на SDIO действительно не включаете?
Go to the top of the page
 
+Quote Post
Vladimir Prokofi...
сообщение Jul 28 2011, 10:08
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 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.
Go to the top of the page
 
+Quote Post
Flexz
сообщение Jul 28 2011, 10:37
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797



Вообще-то да, на любую периферию клоки надо включать предварительно. F103 помнится вообще HardFault влетал, если начать настраивать что-то не включая клок.
А примеры внимательнее читать надо sm.gif (либо может они у вас старо-глючные)

вот код деинита из сэмплов
Код
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
Go to the top of the page
 
+Quote Post
Vladimir Prokofi...
сообщение Jul 28 2011, 10:41
Сообщение #5


Участник
*

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



Цитата(Flexz @ Jul 28 2011, 14:37) *
У вас отладочная плата есть или только своя?


Своя только) Есть отладочная на 103...
Да, вы правы, ошибочка вышла, ща попробуем...

Сообщение отредактировал Vladimir Prokofiev - Jul 28 2011, 10:41
Go to the top of the page
 
+Quote Post
Flexz
сообщение Jul 28 2011, 10:46
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797



Попробовал сейчас у себя, да клок начинает выдываться сразу после SDIO_ClockCmd(ENABLE);
Go to the top of the page
 
+Quote Post
Vladimir Prokofi...
сообщение Jul 28 2011, 11:01
Сообщение #7


Участник
*

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



Цитата(Flexz @ Jul 28 2011, 14:46) *
Попробовал сейчас у себя, да клок начинает выдываться сразу после SDIO_ClockCmd(ENABLE);

Нет все равно клока нету)
Я открыл шаблон, добавил в него пример про микроСД, в настройках проекта указал 215 контроллер. А клока все равно нет... А у вас какой контроллер?

Сообщение отредактировал Vladimir Prokofiev - Jul 28 2011, 11:04
Go to the top of the page
 
+Quote Post
Flexz
сообщение Jul 28 2011, 11:13
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797



stm32f217zgt6, пользую отладочную плату от стартеркита, пока свои ждут комплектации.
Еще один шальной комент у вас в коде заметил

//SDIO_InitStructure2.SDIO_ClockDiv = 0x76;

но, вроде бы и без него клок должен быть, хотя и слишком быстрый для инициализации
Go to the top of the page
 
+Quote Post
Vladimir Prokofi...
сообщение Jul 28 2011, 12:29
Сообщение #9


Участник
*

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



Спаял новую плату, с новым мк, на всякий случай. На плате вообще ничего нет, контроллер только и все.
Запускаем пример uSDCard клока на 53 ноге ( PC12 ) нету все равно...
Go to the top of the page
 
+Quote Post
Flexz
сообщение Jul 28 2011, 13:34
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797



У меня мыслей больше нету..
Я там скосячил несколькими постами выше, неглядя скопипастил не то
должно быть
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SDIO, ENABLE);
а не
RCC_AHB1PeriphClockCmd(SD_SDIO_DMA_CLK, ENABLE);

Кстати, насчет новых МК, с f103 были преценденты - вроде рабочий код, а глючит, перепаиваем другой проц - работает. Толи непропай, толи проц битый, но было несколько раз.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 28 2011, 18:32
Сообщение #11


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

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



А тактирование AFIO в 2xx разве не надо включать?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Flexz
сообщение Jul 29 2011, 06:11
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797



не, F2xx нету такой штуки как AFIO. Точнее коммутация альтернативных функций теперь встроена в контроллер GPIO, где ей и место.
Go to the top of the page
 
+Quote Post
Vladimir Prokofi...
сообщение Aug 12 2011, 13:23
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Vladimir Prokofi...
сообщение Aug 15 2011, 08:36
Сообщение #14


Участник
*

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



После
SDIO_SetPowerState(SDIO_PowerState_ON);
Соответствующие биты в регистре питания тоже не выставляются. Регистр нулевой до и после подачи питания, хотя эта функция как раз и выставляет эти биты.
Я ждал после записи в регистр Delay(100) так как в даташите написано что перед новой записью надо подождать определенное время.
Не могу понять почему не получается записывать в регистры...

Таким образом удается записать новое значение в регистр только внутри SDIO_Init...

Сообщение отредактировал Vladimir Prokofiev - Aug 15 2011, 08:37
Go to the top of the page
 
+Quote Post
Taran87
сообщение Jun 14 2012, 11:43
Сообщение #15


Участник
*

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



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


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #17


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

Группа: Свой
Сообщений: 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
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 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
Golikov A.
сообщение Oct 26 2014, 05:02
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
Так сказано где-то в документации ?

у NXP в доках перед каждым мдулем процедура его включения именно с такой последовательностью.
включение модуля,
клоки,
порты,
прерывания

наверное хороший тон, вряд ли есть зависимость от последовательности, вернее от места настройки портов...


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

не очень понятно зачем оно тут, мне кажется это все для случаев переключения контекстов (прерывания, операционки и подобное), я не прав?


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

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


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

Группа: Свой
Сообщений: 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
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 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
AHTOXA
сообщение Oct 26 2014, 14:04
Сообщение #22


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

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



Цитата(MiklPolikov @ Oct 26 2014, 16:42) *
В STM32L обращение к регистрам включенной периферии не вызывает зависание, просто в регистры не пишется.

И что, это пустяки, не страшно? sm.gif


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


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(Golikov A. @ Oct 26 2014, 09:02) *
у NXP в доках перед каждым мдулем процедура его включения именно с такой последовательностью.
включение модуля,
клоки,
порты,
прерывания

Цитату можете привести?
Видел что-то вроде этого
Код
The UART pins must be configured in the IOCON block before the UART clock can be enabled
in the in the SYSAHBCLKCTRL register (Table xx) for parts LPCxxxx....

The sequence of configuring the UART pins and the UART clock has no effect for
parts LPCxxxx/01 and ....

Описание периферийного модуля XXX:

2. Power: In the SYSAHBCLKCTRL register, set bit xx (Table xx).
3. Peripheral clock: Enable the UART peripheral clock by writing to the UARTCLKDIV
register (Table xx).

Удивила только взаимосвязь Power и SYSAHBCLKCTRL, который, судя по названию, отвечает за клок.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 27 2014, 06:08
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
Цитату можете привести?

LPC1768 UM10360
в начале главы про любую периферию

The UART1 peripheral is configured using the following registers:
1. Power: In the PCONP register (Table 46), set bits PCUART1.
Remark: On reset, UART1 is enabled (PCUART1 = 1).
2. Peripheral clock: In the PCLKSEL0 register (Table 40), select PCLK_UART1.
3. Baud rate: In register U1LCR (Table 298), set bit DLAB =1. This enables access to
registers DLL (Table 292) and DLM (Table 293) for setting the baud rate. Also, if
needed, set the fractional baud rate in the fractional divider register (Table 305).
4. UART FIFO: Use bit FIFO enable (bit 0) in register U0FCR (Table 297) to enable
FIFO.
5. Pins: Select UART pins through PINSEL registers and pin modes through the
PINMODE registers (Section 8.5).
Remark: UART receive pins should not have pull-down resistors enabled.
6. Interrupts: To enable UART interrupts set bit DLAB =0 in register U1LCR (Table 298).
This enables access to U1IER (Table 294). Interrupts are enabled in the NVIC using
the appropriate Interrupt Set Enable register.
7. DMA: UART1 transmit and receive functions can operated with the GPDMA controller
(see Table 543).

или
The Timer 0, 1, 2, and 3 peripherals are configured using the following registers:
1. Power: In the PCONP register (Table 46), set bits PCTIM0/1/2/3.
Remark: On reset, Timer0/1 are enabled (PCTIM0/1 = 1), and Timer2/3 are disabled
(PCTIM2/3 = 0).
2. Peripheral clock: In the PCLKSEL0 register (Table 40), select PCLK_TIMER0/1; in the
PCLKSEL1 register (Table 41), select PCLK_TIMER2/3.
3. Pins: Select timer pins through the PINSEL registers. Select the pin modes for the
port pins with timer functions through the PINMODE registers (Section 8.5).
4. Interrupts: See register T0/1/2/3MCR (Table 429) and T0/1/2/3CCR (Table 430) for
match and capture events. Interrupts are enabled in the NVIC using the appropriate
Interrupt Set Enable register.
5. DMA: Up to two match conditions can be used to generate timed DMA requests, see
Table 543.

понятно что это список регистров, но последовательность во всех модулях единая. А главное что когда я писал функции их конфигурации я просто по пунктам настраивал то что надо, и у меня возникла именно такая последовательность
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Oct 28 2014, 03:25
Сообщение #25


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(Golikov A. @ Oct 27 2014, 10:08) *
LPC1768 UM10360
в начале главы про любую периферию

Зря обобщаете. Во всех (мелких) процах (LPC11xx, LPC12xx, LPC13xx), в которых пины настраиваются через регистры IOCON написано выделенным шрифтом -
Код
Remark: The XXX pins must be configured in the corresponding IOCON registers before the XXX clocks are enabled.

Хотя я проверял и так и эдак, т.к. поздно заметил эту ремарку. В обоих случаях работает. Но долговременной гарантии конечно же нет. Например в новых ревизиях чипов.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 28 2014, 05:30
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



ну наверное это верно. Надо читать мануал и делать как написано для каждого конкретного случая...
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Oct 29 2014, 14:31
Сообщение #27


Гуру
******

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



Цитата(Golikov A. @ Oct 28 2014, 09:30) *
ну наверное это верно. Надо читать мануал и делать как написано для каждого конкретного случая...


Может кто подскажет :
1) Карта проходит инициальзацию. Отвечает на CMD2, CMD3 . Но после этого не хочет отвечать на CMD17 , CMD18 . Выставляется бит SDIO_STA_CTIMEOUT.
В примерах https://github.com/yigiter/Sample-STM32F4-c...OLib/src/SDIO.c после посылки CMD17 почему-то нет проверки получен ответ или нет. В чём может быть причина ?
2) Почему флаг SDIO_STA_CTIMEOUT выставляется мгновенно ? Казалось бы, если в регистре SDIO_DTIMER значение 0xFFFFFFFF , а частота шины 400КГц , то тайм-аут должен случится через 0xffffffff / 400КГц = 10737 секунд


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


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



а не по этой команде определяется тип карты?
Go to the top of the page
 
+Quote Post
hd44780
сообщение Oct 29 2014, 16:12
Сообщение #29


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



Таймаут на CMD17 и у меня регулярно вылетает на F439. На F407 (дискавери) всё идеально. Карта одна и та же.


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Oct 29 2014, 18:01
Сообщение #30


Гуру
******

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



Цитата(hd44780 @ Oct 29 2014, 20:12) *
Таймаут на CMD17 и у меня регулярно вылетает на F439. На F407 (дискавери) всё идеально. Карта одна и та же.

Глюк можно списать на нехорошую разводку.
Вопрос в другом : почему вообще происходит тайм-аут, если значение в регистре SDIO_DTIMER = 0xffffffff и частота клока 400КГц должны давать время тайм-аута 10000 секунд ? Можно было бы предположить, что процессор принимает что-то совсем несуразное, что даже нельзя интерпретировать как ответ с неправильным CRC , но вот только при отсутствии карты тайм-аут происходит так же быстро.


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


Гуру
******

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




Со всем разобрался. Выложил свой код тут http://electronix.ru/forum/index.php?showt...=0#entry1289164
AHTOXA , ещё раз спасибо за ссылку на примеры.


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

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

 


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


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