Easyelectronics.ru

Электроника для всех
Текущее время: 05 июн 2020, 15:47

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 23 ] 
Автор Сообщение
 Заголовок сообщения: [РЕШЕНО]Непонятки с SPI на stm32l476rg
СообщениеДобавлено: 01 апр 2020, 19:00 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 08 апр 2013, 13:16
Сообщения: 110
Добрый день, форумчане.
Возникли проблемы с конфигурацией SPI.
Код:
    RCC->CR |= RCC_CR_HSION;
    while(!(RCC->CR & RCC_CR_HSIRDY)) {}

    RCC->CFGR = (RCC->CFGR & ~RCC_CFGR_SW) | RCC_CFGR_SW_0; // hsi16
    while((RCC->CFGR & RCC_CFGR_SWS_1) && !(RCC->CFGR & RCC_CFGR_SWS_0)) {}

    RCC->CR &= ~RCC_CR_MSION;
    while((RCC->CR & RCC_CR_MSIRDY)) {}

    RCC->AHB2ENR |= RCC_AHB2ENR_GPIOAEN;

    GPIOA->MODER = (GPIOA->MODER & ~(GPIO_MODER_MODE5 | GPIO_MODER_MODE6 |
                    GPIO_MODER_MODE7 | GPIO_MODER_MODE9)) |
                    (GPIO_MODER_MODE5_1 | GPIO_MODER_MODE6_1 |
                     GPIO_MODER_MODE7_1 | GPIO_MODER_MODE9_0);
    GPIOA->OTYPER |= GPIO_OTYPER_OT5 | GPIO_OTYPER_OT6 | GPIO_OTYPER_OT7;
    GPIOA->OSPEEDR |= (GPIO_OSPEEDR_OSPEED5 | GPIO_OSPEEDR_OSPEED6 |
                       GPIO_OSPEEDR_OSPEED7 | GPIO_OSPEEDR_OSPEED9);
    GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPD5 | GPIO_PUPDR_PUPD6 | GPIO_PUPDR_PUPD7 |
                      GPIO_PUPDR_PUPD9);
    GPIOA->AFR[0] = (GPIOA->AFR[0] & ~(GPIO_AFRL_AFRL5 |
                     GPIO_AFRL_AFRL6 | GPIO_AFRL_AFRL7)) |
                     ((5UL << GPIO_AFRL_AFSEL5_Pos) | (5UL << GPIO_AFRL_AFSEL6_Pos) |
                     (5UL << GPIO_AFRL_AFSEL7_Pos));

    RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;

    SPI1->CR1 = (SPI1->CR1 & ~(SPI_CR1_BR | SPI_CR1_CPHA | SPI_CR1_CPOL |
                 SPI_CR1_BIDIMODE | SPI_CR1_LSBFIRST | SPI_CR1_CRCEN)) |
                 SPI_CR1_SSM | SPI_CR1_SSI | SPI_CR1_MSTR | SPI_CR1_BR | SPI_CR1_CPOL;
    SPI1->CR2 = (SPI1->CR2 & ~(SPI_CR2_DS)) | SPI_CR2_DS_2 | SPI_CR2_DS_1 |
                 SPI_CR2_DS_0;
    SPI1->CR1 |= SPI_CR1_SPE;

    GPIOA->BSRR |= GPIO_BSRR_BR9;
    *(uint8_t*)&SPI1->DR = 0x01;
    while((SPI1->SR & SPI_SR_BSY));
    GPIOA->BSRR |= GPIO_BSRR_BS9;


В итоге получаю какие-то непонятки на линии если смотреть по ЛА, плюс единственный делитель, при котором есть клоки 256, т.е. скорость 62.5кГц...
Флаг BSY вроде бы как раньше скидывается, чем были переданы данные.
Пните плиз, где накосячил...
Спасибо.


Вложения:
spi.png
spi.png [ 47.92 Кб | Просмотров: 554 ]


Последний раз редактировалось gruffi 04 апр 2020, 23:31, всего редактировалось 1 раз.
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с SPI на stm32l476rg
СообщениеДобавлено: 01 апр 2020, 19:16 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1182
Ноги SPI в Open-drain без подтяжек?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с SPI на stm32l476rg
СообщениеДобавлено: 01 апр 2020, 19:21 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 08 апр 2013, 13:16
Сообщения: 110
Да, подтяжек нет...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с SPI на stm32l476rg
СообщениеДобавлено: 01 апр 2020, 21:32 
Старожил
Аватара пользователя

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 4787
Откуда: Кемеровская область, Киселевск
Код:
GPIOA->MODER = (GPIOA->MODER & ~(GPIO_MODER_MODE5 | GPIO_MODER_MODE6 |
                    GPIO_MODER_MODE7 | GPIO_MODER_MODE9)) |
                    (GPIO_MODER_MODE5_1 | GPIO_MODER_MODE6_1 |
                     GPIO_MODER_MODE7_1 | GPIO_MODER_MODE9_0);

GPIOA->AFR[0] = (GPIOA->AFR[0] & ~(GPIO_AFRL_AFRL5 |
                     GPIO_AFRL_AFRL6 | GPIO_AFRL_AFRL7)) |
                     ((5UL << GPIO_AFRL_AFSEL5_Pos) | (5UL << GPIO_AFRL_AFSEL6_Pos) |
                     (5UL << GPIO_AFRL_AFSEL7_Pos));



Нормально напиши код.
Типо так

Код:
GPIOB->MODER =
   _VAL2FLD(GPIO_MODER_MODER12, 1)     //OUTPUT PB12 SPI2_NSS
   | _VAL2FLD(GPIO_MODER_MODER10, 2)    //AF PB10 SPI2_SCK
   | _VAL2FLD(GPIO_MODER_MODER14, 2)    //AF PB14 SPI2_MISO
   | _VAL2FLD(GPIO_MODER_MODER15, 2);   //AF PB15 SPI2_MOSI


   GPIOB->AFR[1] =
    _VAL2FLD(GPIO_AFRH_AFRH1, 5)
   | _VAL2FLD(GPIO_AFRH_AFRH5, 5)
   | _VAL2FLD(GPIO_AFRH_AFRH6, 5);

_________________
RADIOWOLF.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с SPI на stm32l476rg
СообщениеДобавлено: 01 апр 2020, 21:38 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 08 апр 2013, 13:16
Сообщения: 110
Код:
GPIOA->MODER = (GPIOA->MODER & ~(GPIO_MODER_MODE5 | GPIO_MODER_MODE6 | GPIO_MODER_MODE7 | GPIO_MODER_MODE9)) | (GPIO_MODER_MODE5_1 | GPIO_MODER_MODE6_1 | GPIO_MODER_MODE7_1 | GPIO_MODER_MODE9_0);

Так?
Вроде бы все правильно...Пины 5,6,7 как альтернативные с открытым коллектором, а 9й push-pull...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с SPI на stm32l476rg
СообщениеДобавлено: 01 апр 2020, 21:45 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 08 апр 2013, 13:16
Сообщения: 110
В изначальном варианте у меня выглядит так:
Код:
    Gpio gpio_sck(GPIOA, PIN_5, GPIO_ALT_OD, GPIO_SPEED_VERY_HIGH, GPIO_AF_5);
    Gpio gpio_miso(GPIOA, PIN_6, GPIO_ALT_OD, GPIO_SPEED_VERY_HIGH, GPIO_AF_5);
    Gpio gpio_mosi(GPIOA, PIN_7, GPIO_ALT_OD, GPIO_SPEED_VERY_HIGH, GPIO_AF_5);
    Gpio gpio_rst(GPIOB, PIN_6, GPIO_OUTPUT_PP, GPIO_SPEED_VERY_HIGH);
    Gpio gpio_dc(GPIOC, PIN_7, GPIO_OUTPUT_PP, GPIO_SPEED_VERY_HIGH);
    Gpio gpio_cs(GPIOA, PIN_9, GPIO_OUTPUT_PP, GPIO_SPEED_VERY_HIGH);

Это я потом проверял, где косяк и развернул....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с SPI на stm32l476rg
СообщениеДобавлено: 01 апр 2020, 23:24 
Старожил
Аватара пользователя

Зарегистрирован: 17 дек 2014, 23:08
Сообщения: 602
Откуда: Nowhere
А почему OD?
Всегда на L4 юзал PP для ног SPI, для интереса код LL из куба глянул - там OTYPER регистры не трогают при ините, подразумевают дефолтный PP.

Вот, нашел свой инит:
Код:
   RCC->AHB2ENR |= RCC_AHB2ENR_GPIOBEN; // SPI2:SCK on PB13
   GPIOB->AFR[1] |= GPIO_AFRH_AFSEL13_0 | GPIO_AFRH_AFSEL13_2; // Set AF5 for Pin13
   GPIOB->MODER &= ~GPIO_MODER_MODE13; // reset mode
   GPIOB->MODER |= GPIO_MODER_MODE13_1; // set AF mode
   GPIOB->PUPDR &= ~GPIO_PUPDR_PUPD13; // No pull-up/down
   GPIOB->OTYPER &= ~GPIO_OTYPER_OT13; // Push-pull
   GPIOB->OSPEEDR |= GPIO_OSPEEDR_OSPEED13; // Speed: very high (or whatever you want)
Здесь конкретно SPI2 SCK, который на PB13. Точно так же другие пины конфигурятся.

ЗЫ: cтало интересно и вместо сброса бита OTYPER сделал его установку, т.е. режм OD - SPI не завелся.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с SPI на stm32l476rg
СообщениеДобавлено: 01 апр 2020, 23:46 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 08 апр 2013, 13:16
Сообщения: 110
LonelyWolf, спасибо большое. Действительно сделал push-pull и spi завелся. Только не пойму почему не могу выдавить больше 1MHz...Тактирование 16MHz и делитель поставил 16, по ЛА видно клоки 1MHz...Если уменьшить делитель , то уже белиберда на линии..


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с SPI на stm32l476rg
СообщениеДобавлено: 02 апр 2020, 00:19 
Старожил
Аватара пользователя

Зарегистрирован: 17 дек 2014, 23:08
Сообщения: 602
Откуда: Nowhere
ХЗ по тактированию - работало всегда, и на любых делителях. Точно помню, что тестил SPI на 62.5кГц, там еще забавный "косяк" вылез: BSY флаг ставится на середине последнего бита, проц на своих мегагерцах успевал отпустить CS, подготовить новые данные и опять потянуть CS, SPI девайс офигевал от такого и отказывался воспринимать переданное. Добавил костыль, который ждал нужного уровня на ноге SCK и только тогда отпускал CS...

А на приведенной выше картинке клок выглядит странно: самый первый период вроде как норм (50% заполнение), а дальше какая-то фигня.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с SPI на stm32l476rg
СообщениеДобавлено: 02 апр 2020, 00:45 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 08 апр 2013, 13:16
Сообщения: 110
Да, я на это обратил внимание. И при увеличение частоты до 1МГц первый период клока сильно отличается от последующих...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с SPI на stm32l476rg
СообщениеДобавлено: 02 апр 2020, 01:09 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 08 апр 2013, 13:16
Сообщения: 110
Ниже три скрина с ЛА на частотах 62.5kHz, 1MHz и 2MHz...При скорости 1MHz длительность первого периода отличается от последующих в 3 раза. На скорости 2MHz уже ничего не работает...


Вложения:
spi_2mhz.png
spi_2mhz.png [ 50.9 Кб | Просмотров: 485 ]
spi_1mhz.png
spi_1mhz.png [ 54.16 Кб | Просмотров: 485 ]
spi_62khz.png
spi_62khz.png [ 52.98 Кб | Просмотров: 485 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с SPI на stm32l476rg
СообщениеДобавлено: 02 апр 2020, 10:11 
Старожил

Зарегистрирован: 13 июл 2016, 11:05
Сообщения: 457
У в L476 работают три канала SPI. На разных тактах - 700кГц, 5МГц и 10 МГц. Никогда не было проблем.
Процессор - 80МГц.
Но инициализация - HAL. :-)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с SPI на stm32l476rg
СообщениеДобавлено: 02 апр 2020, 11:19 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 08 апр 2013, 13:16
Сообщения: 110
Настрою PLL и посмотрю как будет вести себя на 80МГц...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с SPI на stm32l476rg
СообщениеДобавлено: 02 апр 2020, 12:17 
Старожил
Аватара пользователя

Зарегистрирован: 04 окт 2011, 10:19
Сообщения: 2008
serglg писал(а):
У в L476 работают три канала SPI. На разных тактах - 700кГц, 5МГц и 10 МГц. Никогда не было проблем.
Процессор - 80МГц.
Но инициализация - HAL. :-)

Как будто HAL на языке древних шумеров написан и никто его не знает.
:-) :-)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с SPI на stm32l476rg
СообщениеДобавлено: 02 апр 2020, 20:54 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 08 апр 2013, 13:16
Сообщения: 110
Уже не знаю куда лезть, сгенерировал в кубе проект, тактовая 80МГц, делитель 256 и правильно все равно не работает - посылаю 0x01, по ЛА показывает 0x81...первый клок 24.5 мкс, остальные 1.5-2.0 мкс (скачет через 1)...То ли с отладочной платой что-то не то...Завтра попробую тоже самое настроить на stm32f030f4p6 (надо только вывести spi на разъем)...


Вложения:
spi.png
spi.png [ 58.38 Кб | Просмотров: 395 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с SPI на stm32l476rg
СообщениеДобавлено: 03 апр 2020, 19:40 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 08 апр 2013, 13:16
Сообщения: 110
Эх...видать не суждено проверить на STM32F030F4P6, не завелся после вывода spi (вроде и замыканий нет), питание в норме...Неделю назад на ней работал с DS18B20, а сегодня не хочет...Поищу в закромах где-то валялась плата от какого-то проекта на STM32F100C4T6 (6 летней давности), там как раз spi заводился с пол оборота (подключал Nokia 5110)...А так хотелось побыстрей подключить дисплей ILI9341...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с SPI на stm32l476rg
СообщениеДобавлено: 03 апр 2020, 22:38 
Старожил
Аватара пользователя

Зарегистрирован: 04 окт 2011, 10:19
Сообщения: 2008
Какая то тема ужасов !


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с SPI на stm32l476rg
СообщениеДобавлено: 03 апр 2020, 22:46 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 08 апр 2013, 13:16
Сообщения: 110
Ага (такого еще не было - все не работает :)), плату оживил, через ресет только прошивается :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с SPI на stm32l476rg
СообщениеДобавлено: 04 апр 2020, 18:36 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 08 апр 2013, 13:16
Сообщения: 110
Настроил spi на микроконтроллере stm32f030f4p6. Настроил PLL - 48МГц...На самом большом коэффициенте 256 работает, но это скорость 187.5кГц...Выставил делитель 64 (скорость 750кГц) данные еще проходят, но клоки колбасит. На делителе 32 (скорость 1.5МГц) уже ничего не проходит...Не понятно, что не так...Настройки ничем не отличаются от тех, что в первом посте (только чип селект перекинул на PB1)...Может кто увидит, что я делаю не так и где накосячил?


Вложения:
spi_64.png
spi_64.png [ 55.99 Кб | Просмотров: 232 ]
spi_32.png
spi_32.png [ 48 Кб | Просмотров: 232 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с SPI на stm32l476rg
СообщениеДобавлено: 04 апр 2020, 19:01 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 08 апр 2013, 13:16
Сообщения: 110
Сгенерировал в кубе и тоже самое...в голову ничего не приходит, где можно было так накосячить...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с SPI на stm32l476rg
СообщениеДобавлено: 04 апр 2020, 19:18 
Старожил
Аватара пользователя

Зарегистрирован: 11 авг 2016, 20:52
Сообщения: 747
Откуда: GMT+6
А какая частота дискретизации у логического анализатора?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с SPI на stm32l476rg
СообщениеДобавлено: 04 апр 2020, 19:20 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 08 апр 2013, 13:16
Сообщения: 110
Сейчас 12МГц.
Просто не ясно, где и как ошибся, что и на кубе тоже самое. Процы разные: stm32l476rg (nucleo) и самодельная плата на stm32f030f4p6...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с SPI на stm32l476rg
СообщениеДобавлено: 04 апр 2020, 23:30 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 08 апр 2013, 13:16
Сообщения: 110
Тему можно закрывать...От колбасни клока помогла обычная задержка после инициализации пинов (сделал на цикле for), и да, я прозевал с ЛА :), Ув. Kelvin спрашивал про частоту дискретизации и я написал 12 (т.к. перед этим как раз и выставлял), но после проверки оказалось, что сбросило на 2МГц :).


Вложения:
spi.png
spi.png [ 50.45 Кб | Просмотров: 180 ]
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 23 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB