Hal_spi_transmitreceive


  • Главное меню
  • SPI (перевод из книги Mastering STM32)
  • Using the SPI interface on STM32 devices
  • How to use SPI with STM32
  • Setting up an STM32F4 as an SPI device with FreeRTOS and STM32MXCube
  • Программирование STM32. Часть 10: SPI + DMA
  • Главное меню

    К сожалению, ребята завязли в рутине и мы вряд ли в скором времени увидим перевод полностью, поэтому буду выкладывать свои куски перевода. Описание SPI Serial Peripheral Interface SPI — это последовательный, синхронный, полнодуплексный протокол передачи данных между главным master контроллером обычно микроконтроллером или другими устройством с программируемой функциональностью и несколькими ведомыми slave устройствами.

    Как мы увидим далее, SPI позволяет передавать данные как в полнодуплексном, так и в полудуплексном режиме. Спецификация SPI стандарт в протоколах передачи данных и была разработана в конце х компанией Motorola и на данный широко используется как протокол передачи данных для многих цифровых микросхем. В отличие от протокола I2C, SPI не задает жестких условий в протоколе передачи данных по шине, давая ведомым slave устройствам полную свободу в структуре сообщений обмена данными.

    Рисунок 1: Архитектура типовой SPI шины. Типовая шина SPI содержит 4 сигнала, как показано на рисунке 1, даже, если возможно управлять некоторыми SPI устройствами, используя лишь 3 сигнала в таком случае мы говорим о 3-проводном SPI. Генерируется master устройством и это означает, что каждая передача по шине SPI всегда начинается по инициативе master устройства.

    В отличие от I2C SPI более быстрый интерфейс передачи данных и тактовая частота обычно в районе нескольких мегагерц. Более того, протокол SPI позволяет работать в одной шине на различных скоростях в одно и то же время. MOSI: расшифровывается как Master Output Slave Input и используется для передачи данных от главного master устройства к ведомому slave. В отличие от I2C, где для обмена между устройствами используется лишь один провод, в SPI предусмотрено две линии передачии данных.

    MISO: расшифровывается как Master Input Slave Output и используется для передачи данных от ведомого slave устройства к главному master. В отличие от I2C, SPI не использует адреса ведомых slave устройств, а использует физические линии адресации, которые устанавливаются в низкий логический уровень для выбора устройства. В типовой SPI шине только одно ведомое slave устройство может быть активно в одно время путем установки линии SS в низкий уровень.

    В этом причина того, что в одной и той же шине могут быть устройства с разной скоростью передачи данных. Имея две раздельные шины данных, MOSI и MISO, SPI по сути является полнодуплексным интерфейсом передачи данных, таким образом ведомое slave устройство может отдавать данные главному master пока одновременно принимает данные от него же.

    В таком случае мы говорим о двухпроводном SPI, хотя по существу он конечно же трехпроводной. Рисунок 2: Как передаются данные по шине SPI в полнодуплексном режиме Каждая транзакция в шине начинается с подачи тактирования в линию SCK в соответствии с допустимой тактовой частотой ведомого slave устройства. В то же время главное master устройство устанавливает LOW уровень на линии SS и передача данных начинается.

    Обычно обмен данными подразумевает использование двух регистров в основном 8-битные, хотя некоторые slave устройства поддерживают битный размер слова , одного в главном master устройстве и один в ведомом slave. Данные побитно сдвигаются в сдвиговом регистре, начиная со старшего бита, пока младший бит сдвигается в этот же самый регистр. В это же самое время, данные от ведомого slave устройства сдвигаются в младший бит регистра данных.

    Когда все биты регистра будут сдвинуты в одну и другую сторону обмен данными будет осуществлен. Если необходимо передать более одного слова данных, сдвиговые регистры обнуляются и процесс повторяется.

    Обмен данными может продолжаться сколько угодно большое количество циклов тактового генератора. Когда обмен завершен master выключает тактовый сигнал и линия SS возвращается в исходное состояние высокого логического уровня.

    Рисунок 2 показывает процесс обмена данными в полнодуплексном режиме, рисунок 3 же демонстрирует процесс в полудуплексном режиме. Рисунок 3: Как передаются данные по шине SPI в полудуплексном режиме Полярность и фаза тактового сигнала Clock Polarity and Phase В дополнение к настройкам тактирования шины, master и slave должны «договориться» о полярности и фазе тактового сигнала.

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

    Наиболее общие и часто используемые режимы это 0 и 3, большинство ведомых slave устройств поддерживают как минимум пару режимов. Давайте проанализируем их. В данном режиме доступны две конфигурации NSS выхода: — NSS выход включен: данная настройка используется только, когда устройство работает в режиме master.

    Стоит заметить, что этот режим возможно использовать, когда лишь одно ведомое slave устройство в шине и ее SS пин подключен к сигнальной линии NSS. В режиме TI полярность и фаза тактового сигнала SPI автоматически устанавливаются в соответствии с требованиями протокола Texas Instruments вне зависимости от того какие настройки были выбраны до этого.

    Для более подробной информации можете обратиться в референс мануалу соответствующего микроконтроллера. Таблица 2 демонстрирует наличие интерфейсов всех плат Nucleo, рассматриваемых в рамках этой книги. Темными строками выделены альтернативные пины, которые могут быть использованы благодаря соответствующей разводке платы. Instance: указатель на дескриптор SPI, который мы будем использовать.

    Они используются, когда SPI работает в режиме прерывания и не могут быть изменены из программы пользователя. DataSize: параметр, задающий размер данных, передаваемых по шине SPI. Значение CRC может передаваться последним байтом в режиме передачи или автоматическая проверка на ошибку CRC может быть произведена с последним принятым байтом данных.

    Значение CRC вычисляется с использованием нечетного программируемого многочлена на каждом бите. Вычисленное CRC проверяется автоматически в конце блока данных. Когда появляется ошибка между вычисленным значением CRC от принятых данных и CRC, переданной от передающего устройства, устанавливается состояние ошибки. Для более подробной информации рекомендуется ознакомиться с референс мануалом на конкретный микроконтроллер. Обмен сообщениями с использованием SPI Как только SPI интерфейс сконфигурирован, мы можем начать обмен данными с ведомыми slave устройствами.

    Так как SPI спецификации не описывает конкретный протокол для передаваемых данных, то и нет особой разницы между master и slave при настройке через CubeHAL.

    Используя прерывания или DMA, мы должны быть готовы к тому, что в конце передачи мы получим ассинхронный запрос об этом. Возможно шесть различных вызовов перечисленных в таблице 3.

    В этой главе не будет рассмотрено практическое применение SPI, но в последующих главах мы будем использовать SPI для программирования Ethernet контроллера. Этот предделитель принимает значения от 21 до Тем не менее, как уже несколько раз ранее было замечено, CubeHAL добавляет неизбежный расход ресурсов на управление периферией. И это также применимо и к SPI. Далее выбрать необходимый режим работы, как показано на рисунке 5. Далее, необходимо настроить поведение сигнала NSS. После настройки этих двух параметров можно продолжить конфигурацию во вкладке Configuration CubeMX.

    Рисунок 5: Как выбрать режим работы SPI в CubeMX Если статья показалась вам полезной подписывайтесь на мой канал в telegram , чтобы не пропустить анонсы новых статей и другую интересную информацию для разработчиков.

    SPI (перевод из книги Mastering STM32)

    Обратите внимание, что для проверки окончания передачи используется конструкция if state! Это надо учитывать, когда UART может одновременно принимать и передавать данные. Относительно них справедливо все выше сказанное про аналогичные функции для передачи.

    Зарегистрируйтесь и оплатите. Всего 60 руб. Очень важное замечание. Например, нам необходимо получать пакеты из 10 данных. Сами пакеты могут приходить в любое время, а данные пакета передаются подряд, без значительных задержек. Алгоритм приема может быть таким. После его приема инициируем прием 9 байтов уже с контролем времени. Ниже я приведу пример разработки подобного алгоритма обмена.

    Callback-функции функции обратного вызова. В предыдущих примерах урока как-то не чувствовалось особого преимущества применения функций HAL с использованием прерываний. Может быть, эффективно выглядела только передача пакета данных. Инициировали ее и продолжили выполнение основной программы.

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

    Основной цикл while был пустым. Подобные программы, работающие в фоновом режиме, могут быть реализованы с использованием callback-функций. Проблема предыдущих программ урока была в том, что мы постоянно контролировали состояние работы UART с помощью циклических опросов. Мы могли чередовать опросы с короткими действиями. Но все равно на опросы уходила масса времени. Проблему можно решить с помощью функций обратного вызова или callback-функций.

    Переходы на них происходят по определенным событиям. Например, закончилась передача данных или произошла ошибка и т. Инициирует вызовы callback-функций HAL-библиотека. Это своеобразные программные прерывания. Вызовы callback-функций происходят в обработчиках аппаратных прерываний UART.

    Более того, callback-функция это часть обработчика прерывания, ее выполнение — удлинение обработчика. Только при выходе из callback-функции управление вернется в обработчик прерывания, и оно будет завершено. Callback-функции удлиняют время обработки прерываний. Они должны выполняться за минимально короткое время. Обычно это установка флага или инициация процесса. Ожидание какого-либо флага циклическим опросом, так как мы делали в предыдущих примерах урока, совершенно недопустимо.

    Проще говоря, если встретится функция с таким же именем, но без атрибута weak, то она заменит функцию, объявленную с атрибутом weak. Для нас это означает, что для определения callback-функции достаточно создать свое определение без атрибута weak. И наша функция заменит функцию HAL-библиотеки.

    Using the SPI interface on STM32 devices

    После его приема инициируем прием 9 байтов уже с контролем времени. Ниже я приведу пример разработки подобного алгоритма обмена. Callback-функции функции обратного вызова. В предыдущих примерах урока как-то не чувствовалось особого преимущества применения функций HAL с использованием прерываний.

    Может быть, эффективно выглядела только передача пакета данных. Инициировали ее и продолжили выполнение основной программы.

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

    Основной цикл while был пустым. Подобные программы, работающие в фоновом режиме, могут быть реализованы с использованием callback-функций. Проблема предыдущих программ урока была в том, что мы постоянно контролировали состояние работы UART с помощью циклических опросов. Мы могли чередовать опросы с короткими действиями. Но все равно на опросы уходила масса времени. Проблему можно решить с помощью функций обратного вызова или callback-функций.

    How to use SPI with STM32

    Переходы на них происходят по определенным событиям. Например, закончилась передача данных или произошла ошибка и т.

    SPI peripheral with STM32 and PCM1792 audio DAC - VIDEO27

    Инициирует вызовы callback-функций HAL-библиотека. Но, по идее, все описанное ниже справедливо и для других чипов этой серии. Пожалуй, наиболее очевидное преимущество чипов AT45DBxx перед рассмотренными ранее 24Cxx заключается в существенно большем объеме памяти. Вторые же предлагают максимум Кб. То есть, чипы AT45DBxx позволяют передавать данные намного быстрее.

    Setting up an STM32F4 as an SPI device with FreeRTOS and STM32MXCube

    Но при этом следует учитывать время выполнения конкретных операций. Например, операция очистки и записи одной страницы в случае AT45DBxx занимает десятки миллисекунд. Даташит 24LC64 [PDF] сообщает, что чип переживает более 1 миллиона циклов очистки-записи, и что данные будут хранится более лет. Для сравнения, согласно даташиту AT45DBE, гарантируется только циклов очистки-записи, и данные хранятся лишь 20 лет. Кроме того, чипы 24Cxx заметно дешевле.

    Розничные цены в России на них начинаются где-то от 0. Наконец, как мы скоро убедимся, работать с AT45DBxx несколько сложнее, хотя эта сложность и может быть завернута в библиотеку. Для своих экспериментов я все также использую отладочную плату Nucleo-FRE. Если у вас другая отладочная плата, отличия в настройке будут минимальными.

    Программирование STM32. Часть 10: SPI + DMA

    В этом режиме периферии нужен пин PA5, который по умолчанию управляет светодиодом на отладочной плате. Он будет использоваться для выбора SPI устройства, с которым мы хотим поговорить так называемый «chip select» или «slave select». Далее генерируем проект, правим немного Makefile — все как обычно.


    STM32CubeMX basics: 11.3 STM32Cube HAL labs SPI - Lab SPI DMA



    Другие теги: сезон животных вино яйца крем армию карты снять моды

    6 Комментарии к “Hal_spi_transmitreceive

    Добавить комментарий

    Ваш e-mail не будет опубликован. Обязательные поля помечены *