Доброе время суток продолжаем серию статей про микроконтроллеры stm32f4, сегодня будем осваивать SPI протокол, а поможет нам в этом хорошая девайсина – гироскоп L3GD20. Что такое гироскоп – это датчик измеряющий изменение угла ориентации тела в пространстве (p.s. кого интересую построение беспилотных летательных аппаратов рекомендую почитать замечательную книгу по данной тематики автора Распопов В.Я – микросистемная авионика). Будем юзать данную девайсину на борде stm32f401C-disco (stm32f401VC — LQFP100), данная микросхема также присутствует на отладочной плате stm32f4-discovery и stm32f429i-disco. Как обычно будем использовать HAL — Hardware Abstraction Layer, то есть слой аппаратной абстракции. Как работает SPI?
SPI (Serial Peripheral Interface, SPI bus — последовательный периферийный интерфейс, шина SPI) — последовательный синхронный стандарт передачи данных в режиме полного дуплекса, хотя режим передачи можно выбирать, так например полу дупликс, либо односторонняя передача в режимах мастер и слейв. SPI является синхронным интерфейсом, за счет линии синхронизации SCLK. Микроконтроллер с помощью сигнала Select chip – CS выбирает ведомое устройство и начинается с ним обмениваться информацией. Обмен информацией осуществляется по каналам MOSI(Master Out Slave In) и MISO(Master In Slave Out).

Передача осуществляется пакетами либо 8 бит либо 16 бит. В нашем случае пакет состоит из 16 бит. Причем первых 2 бита отвечаю за вид передачи данных (запись либо чтение).

Бит 0 – RW бит, если 0 –тогда пишем в устройство, 1 читаем из устройства.
Бит 1 – MS, 0 – адрес остается неизменным, 1 – автоматическое инкрементирование адреса
Биты 2 – 7 – адреса полей
Биты 8 – 15 – биты данных

Регистры девайсины
И конечно код нашей программы:
main.c

stm32f4xx_hal_msp.c


Проект целиком.
В следующей части про интерфейс SPI рассмотрим хардварные особенности его применения. На сегодня все, всем пока!), увидимся на просторах mcu.by.

15
Отправить ответ

avatar
9 Comment threads
6 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
7 Comment authors
KraftSkaldВладимирДенисВладимирHugoStiglits Recent comment authors

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

  Subscribe  
Самый новый Самый старый Наиболее проголосовали
Уведомлять о
Иван
Гость
Иван

Я новичек микроконтроллерах, потому могу ошибаться но мне кажется в примере ошибка:
Сначала вы пишите: «В нашем случае пакет состоит из 16 бит. »
А потом в коде где происходит инициализация SPI :
«hspi1.Init.DataSize = SPI_DATASIZE_8BIT;»

или все верно ?

HugoStiglits
Гость
HugoStiglits

Я Вас категорически приветствую! Я пошагово изучаю Ваш код, первое , что мне не понятно — 4-ый аргумент функции HAL_SPI_TransmitReceive, в Reference Manual, он описан как Size — amount of data to be sent, т.е. как я понял, количество данных для отправки, тогда почему вы передаете sizeof(data), резмер буфера для принимаемых данных?

Владимир
Гость
Владимир

Спасибо за приведённый пример работы с SPI на HAL Drivers. Как раз занялся изучением этой тематики и могу точно сказать, примеры кода найти сложно.
Нашёл небольшую опечатку в тексте, перепутаны определения в скобках: … осуществляется по каналам MISO(Master Out Slave In) и MOSI(Master In Slave Out)…

Денис
Гость
Денис

Хороший пример, спасибо. Я сейчас решаю похожую задачу для акселерометра LIS3DSH, который установлен на плате STM32F4. Поясните, будьте добры, зачем Вы используете функции translate, ms. Примерно понимаю зачем они, но чем это обусловлено не ясно.

Владимир
Гость
Владимир

Здравствуйте. Прерывания здесь на используются?

Владимир
Гость
Владимир

И вопрос. Большой код инициализации GPIO — это ещё для каких-то целей? Мне куб 10 строк выдал в этом месте.

KraftSkald
Гость
KraftSkald

Добрый день,
Столкнулся с непонятным явлением. Функция HAL_SPI_TransmitReceive() иногда возвращает HAL_TIMEOUT. Совершенно непонятно как это может быть, если мое устройство — Master, и оно само выдает клокирующие сигналы и само защелкивает в сдвиговом регистре какие-то принятые данные. Как при этих условиях я, Master, вдруг могу _не_получить_ байт и ждать его в течение таймаута? Возможно, это глюк HAL’а ?