📱 Подписаться
IT и цифровая трансформация

Пуск SPI трансивера на STM32

📰 Habr 👁️ 1 просмотров

danil_123451 час назад

Пуск SPI трансивера на STM32

Уровень сложностиПростойВремя на прочтение6 минОхват и читатели2.9KПрограммирование микроконтроллеров*Системы связи*Электроника для начинающихПроизводство и разработка электроники*Программирование*ТуториалПролог

SPI это цифровой, последовательный, относительно высокоскоростной, полнодуплексный, синхронный физический интерфейс передачи данных в пределах одной электронной платы PCB. Этот интерфейс служит для обмена данными между микросхемами в пределах одной электронной платы. Ранее в эпоху ARV микроконтроллеров интерфейс SPI и вовсе использовался для пере прошивки микроконтроллеров вместо SWD, как сейчас. По SPI обычно подключают внешние ASIC-и. Это могут быть ADC, акселерометры, дисплеи, DAC, Flash память, CAN трансиверы и прочее. SPI много надежнее, чем его собрат I2C. I2C может зависать, в то время в как SPI просто нечему зависать.

При разработке электроники практически на всех платах нужно передавать данные по интерфейсу SPI.

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

Постановка задачиНастроить SPI2 трансивер на работу в режиме DMA. Сделать функцию передачи данных в режиме полного дуплекса. В качестве отладочной платы использовать учебно-тренировочную электронную плату JZ-F407VET6. Выбрать GPIO пины PB10, PC2, PC3.

PinMCU pinGPIODirSCK47PB10outMISO17PC2inMOSI5PC3outРеализация

Настройка SPI передачи данных - это комплекс мер. Надо настроить регистры тактирования, GPIO, SPI, DMA и прерывания.Настроить тактирование (clock)--Подать тактирование на используемые GPIO пины.--Подать тактирование на SPI трансивер. --Подать тактирование на DMA.

Активировать прерывания (NVIC)1--Активировать прерывания глобально на уровне процессорного ядра.2--Определить приоритет прерывания SPI. В случае с SPI2 NVIC номер равен 363--Активировать прерывания для каналов DMA (14 и 15).

ПотокIRQnDMAstreamchannelSPI2_TX15DMA1stream_4channel_0SPI2_RX14DMA1stream_3channel_04--Определить функции обработчики прерываний для DMA каналов. Тут важный момент. Как сделать так, чтобы и отправка по SPI2 и прием по SPI2 работали в режиме DMA одновременно (полный дуплекс режим)? Ведь у них один и тот же корневой DMA: DMA1. У каждого DMA потока должен быть свой собственный и отдельный экземпляр структуры DMA_HandleTypeDef. Для каждого потока надо вызывать DMA_Init для каждого экземпляра потока. Даже вопреки тому, что они ссылаются на один DMA1.5--Определить функцию обработчик прерываний для SPI.

Активировать GPIO

--Надо физически подключить SPI блок к GPIO пинам микроконтроллера. Для этого надо сконфигурировать 3 GPIO пина на альтернативную функцию SPI2. Переключить внутренний мультиплексор.

PinMCU pinGPIODirPinMuxPullConnectorSCK47PB10out5airP3.5MISO17PC2in5upP3.7MOSI5PC3out5upP3.6Активировать SPI

1--Подать тактирование на SPI трансивер.2--Активировать прерывание для конкретного SPI трансивера3--написать обработчик прерывания для SPI4--Задать приоритет SPI прерывания5--Выбрать роль трансивера: master или slave.6--Задать битовую скорость.7--Задать фазу тактирования.8--Задать размер сдвигового регистра: 8 бит или 16 бит.9--Задать порядок передачи бит.10--Задать событие захвата бита: положительный перепад или отрицательный перепад.

Активировать DMADMA хорош тем, что позволяет уменьшить количество прерываний при работе SPI и тем самым снизить нагрузку на центральный процессор. Поэтому, по возможности, надо использовать SPI трансивер именно в режиме DMA. Надо подать тактирование на DMA c которым будет работать SPI. В моем случает это DMA1

Активировать DMA каналы--Выбрать Номер DMA, поток и канал на конкретный экземпляр поток передачи. Это указано в спецификации на микроконтроллер.

ПотокIRQnDMAstreamchannelSPI2_TX15DMA1stream_4channel_0SPI2_RX14DMA1stream_3channel_0--Активировать канал DMA ассоциированный с SPI отправкой--Ассоциировать SPI трансивер с DMA каналом отправки

__HAL_LINKDMA(&Node->handle,hdmatx,(DmaCh->dma_h));

--Активировать канал DMA ассоциированный с SPI приёмом--Ассоциировать SPI трансивер с потоком DMA отправки.

  __HAL_LINKDMA(&Node->handle,hdmarx,DmaCh->dma_h);

--Активировать два прерывания DMA для работы SPI в режиме DMA.

ПотокIRQnDMA_streamSPI2_TX15DMA1_stream_4SPI2_RX14DMA1_stream_3--Назначить разный приоритет всем каналам DMA.--настроить источник канала: адрес, выравнивание, инкремент.--настроить приемник канала: адрес, выравнивание, инкремент.--Указать сколько байт будем передавать по DMA.Опрос SPI трансивера

Когда SPI уже сконфигурирован, то можно периодически вычитывать статусный регистр и следить за здоровьем SPI трансивера. Так можно выявить события аварий и принять меры. Например пере инициализировать SPI-трансивер.

Комбинаторика такова, что у SPI драйвера помимо init должно быть еще минимум 9 функций.

operationmove modemove modemove modeoperationpollinginterruptsDMAreadspi_read_pollingspi_read_interruptspi_read_dmawritespi_write_pollingspi_write_interruptspi_write_dmawrite_readspi_write_read_pollingspi_write_read_interruptspi_write_read_dmaМодульное тестирование SPI трансивера

Я подготовил набор модульных тестов для верификации SPI трансивера

Механизмтип тестаНазвание тестаCLI команда пуска тестаpollingwritespi1_write_pollingtr spi1_write_pollingpollingreadspi1_read_pollingtr spi1_read_pollingpollingwrite_readspi1_write_read_pollingtr spi1_write_read_pollinginterruptwritespi1_write_interrupttr spi1_write_interruptinterruptreadspi1_read_interrupttr spi1_read_interruptreadspi1_misotr spi1_misointerruptwrite_readspi1_write_read_interrupttr spi1_write_read_interruptdmawritespi1_write_dmatr spi1_write_dmadmareadspi1_read_dmatr spi1_read_dmadmawrite_readspi1_write_read_dmatr spi1_write_read_dmaТестирование приёма по SPI

Тест SPI приёма может быть таким:1--Отключить провод от SPI пинв MISO .2--Установить на пине MISO Pull Up.3--Прочитать байт по SPI.4--В приёмном регистре должно быть 0xFF.5--Установить на пине MISO Pull Down.6--Прочитать байт по SPI.7--В приёмном регистре должно быть 0x00.

Если так, то тест пройден. Если нет, то приём по SPI не работает.

Тестирование отправки по SPI

1--В обработчике прерываний по окончании отправки увеличивать счетчик отправленных байт.2--Запустить SPI отправку3--Подождать прерывания окончания отправки4--Убедиться что счетчик отправленных байт увеличился на нужное значение.

Если прерывание произошло, то тест пройден. Если прерывания не было, то интерфейс не работает.

Тестирование полнодуплексной операции по SPI--Можно взять проводную перемычку, соединить пин MOSI и MISO, выполнить полно дуплексную запись-чтение и проверить, что микроконтроллер принял то же самое, что и отправил. Если массив совпал, значит тест пройден.

Тест DMAЧто касается модульного теста DMA, то тут можно просто реализовать функцию memcpy() на основе DMA и прогнать её для всех свободных потоков. Если массив прописался по новому адресу и совпал по значению байт в байт, значит тест пройден.

Итог

Удалость научиться отправлять и принимать массивы по интерфейсу SPI на микроконтроллерах семейства STM32F4x во всех трёх режимах: опрос, прерывания и DMA. Как видите запуск SPI это достаточно громоздкая работа. Надо было настроить CLK, GPIO, NVIC, SPI и DMA. Зато теперь это открывает прямую дорогу для подключения к микроконтроллеру всяческих внешних ASICов: SPI NAND-Flash памяти, микросхем с ADC, RF трансиверы, CAN-трансиверы, SD карты, акселерометры и прочее.

Словарь

СокращениеРасшифровкаPCBprinted circuit boardASICapplication-specific integrated circuitDMADirect Memory AccessMCUmicrocontroller unitSPISerial Peripheral InterfaceMISOMaster In Slave OutMOSIMaster Out Slave InСсылки

При наличии работающего SPI трансивера можно смело подключать к микроконтроллеру разнообразное периферийное оборудование: Flash память, джойстики, SD карты памяти, генераторы сигналов, акселерометры и прочее.

ТекстURLSPI-NOR Flash на примере MX25R6435Fhttps://habr.com/ru/articles/731604/Подключение PlayStation2 Джойстика к Микроконтроллеру (или Переходник между человеком и компьютером)https://habr.com/ru/articles/959628/Подключение SD карты по SPI (Капсула памяти)https://habr.com/ru/articles/974076/Пульт от «Dendy» в любительских конструкцияхhttps://habr.com/ru/articles/191936/Обзор генератора сигналов AD9833https://habr.com/ru/articles/733776/Обзор учебно-тренировочной платы JZ-F407VET6 (или электронная парта)https://habr.com/ru/articles/988494/Обзор Акселерометра LIS3DHhttps://habr.com/ru/articles/851180/Serial Peripheral Interfacehttps://ru.wikipedia.org/wiki/Serial_Peripheral_InterfaceВопросы

1--На шине SPI 2 разных чипа. На оба подали CS-0 вольт и начали читать. Что произойдет: Сгорит/не сгорит/другое?Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.Вы программировали SPI модуль в микроконтролларах?100%да40%нет0Проголосовали 4 пользователя. Воздержавшихся нет.Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.Вы программировали SPI модуль на STM32?100%да40%нет0Проголосовали 4 пользователя. Воздержавшихся нет.Теги:• stm32
• SPI
• dma
• stm32f
• stm32f4
• stm32f407
• stm32f407v
• stm32f407ve
• testing
• spi busХабы:• Программирование микроконтроллеров
• Системы связи
• Электроника для начинающих
• Производство и разработка электроники
• Программирование

Получайте больше инсайтов о систематизации бизнеса

Подписывайтесь на Telegram-канал Business Operations — ежедневные материалы о бизнес-процессах, операционном управлении и повышении эффективности

💬 Подписаться на канал