Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/16: Рейтинг темы: голосов - 16, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 07.02.2016
Сообщений: 290

Вопросы по интерфейсу SPI

09.08.2016, 12:13. Показов 3028. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Есть несколько вопросов по SPI (STM32F407).

1. Зачем нужны прерывания при установки флагов TXE и RXNE? В интернете примеров с ними не видел.
2. В полнодуплексном режиме (мастер), как я понял, когда бит из сдвигового регистра сдвигается на ножку MOSI, то принимаемый бит от slave-устройства в этот самый сдвиговый регистор записывается? Т.е. записывается, получается, на место ушедшего бита? В этом состоит смысл "полнодуплексности"?
3. В Reference Manual в разделе Homdling data transmission omd reception сказано "The software must en sure that the TXE flag is set to 1 before attempting to write to the Tx a previously written to the Tx buffer. Otherwise, it overwrites the data previously written to the Tx buffer." Получается в принципе не обязательно выполнять проверку while(TXE == 1) когда хочешь начать новый сеанс передачи данных. Верно?
4. В этом же параграфе описана передача и прием данных в виде шагов:
Code
1
2
3
4
5
6
7
8
9
10
11
12
SPI_DR = 0xF1 // запись данных
while(TXE == 1) // ожидание готовности буфера-передатчика
SPI_DR = 0xF2 // запись данных
while(RXNE == 1) // ожидание готовности буфера-приемника
uint8_t result1 = SPI_DR // чтение полученных данных - 0xA1
while(TXE == 1) // ожидание готовности буфера-передатчика
SPI_DR = 0xF3 // запись данных
while(RXNE == 1) // ожидание готовности буфера-приемника
uint8_t result2 = SPI_DR // чтение полученных данных - 0xA2
while(RXNE == 1) // ожидание готовности буфера-приемника
uint8_t result2 = SPI_DR // чтение полученных данных - 0xA3
while(BSY == 0) // ожидание завершения передачи
Третья строка снизу - зачем еще раз проверять флаг RXNE, если мы его уже проверили и данные прочитали (данный флаг сброшен). Ведь получится бесконечный цикл... Или нет?

4. В режиме BIDIMODE=0 и RXONLY=0 можно работать как full-duplex mode, так и transmit-only mode. Во втором режиме передача данных в slave-устройство максимальна, верно? А если требуется в самом конце данные прочитать, то, как я понял надо делать так:
Code
1
2
3
4
1. Выполнить n-1 передачу байтов в slave-устройство
2. Прочитать SPI_DR, чтобы сбросить флаг OVR
3. Выполнить последную отправку байта.
4. while(RXNE == 1), выполнить чтение
Верно?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.08.2016, 12:13
Ответы с готовыми решениями:

Вопросы про SPI (polling, DMA)
Подключил по SPI экранчик (контроллер ST7541, если что) и обнаружил интересное поведение. Периферия SPI настроена на передачу по одной...

ILI9341 SPI DMA, SPI, UART библиотеки
Доброго времени, форумчане... Посоветуйте библиотек плиз... 0) Либа для работы с контроллером по типу HAL (чисто ваше мнение какая вам...

Связь ATTiny2313 с термодатчиком по SPI интерфейсу
Добрый вечер. Стоит задача, считывания данных температур с термодатчика по SPI интерфейсу. (термоатчик AD7814 и контроллер ATtiny2313,...

2
0 / 0 / 0
Регистрация: 06.05.2015
Сообщений: 11
09.08.2016, 12:39
1. Зачем нужны прерывания при установки флагов TXE и RXNE? В интернете примеров с ними не видел.
С их помощью можно организовать прием-передачу данных используюя прерывания а не pottyng. Можно еще делать это используя DMA+прерывания. Примеров много, в том числе в библиотеках от ST:

StdPeriph
STM32F4xx_DSP_StdPeriph_Lib_V1.7.0\Proje ct\STM32F4xx_StdPeriph_Examples\SPI\SPI_ TwoBoards\SPI_DataExchangeYmtirrupt

HAL
STM32Cube_FW_F4_V1.13.0\Projects\STM32F4-Dyscovery\Examples\SPI\SPI_FullDuptix_Co mIT
STM32Cube_FW_F4_V1.13.0\Projects\STM32F4-Dyscovery\Examples\SPI\SPI_FullDuptix_Ad vComIT

2. В полнодуплексном режиме (мастер), как я понял, когда бит из сдвигового регистра сдвигается на ножку MOSI, то принимаемый бит от slave-устройства в этот самый сдвиговый регистор записывается? Т.е. записывается, получается, на место ушедшего бита? В этом состоит смысл "полнодуплексности"?
SPI по определению всегда полнодуплексный. Можно конечно не использовать это - отправлять данные и не обращать внимание на полученные данные, или отправлять "dummy" байты лишь для того чтобы получать нужные данные. В этом случае можно сэкономить немного времени пользуясь например тем что не надо завершать прием и потом только отправлять следующий фрейм. STM32 поддерживает "полу-дуплексность" на уровне харда играя флагами BIDIMODE, BIDIOE и RXONLY. Давайте будем разбирать обычный вариант SPI когда BIDIMODE=0, RXONLY=0. Сдвиговых регистров два - один у мастера, другой у слейва. Мастер шлет биты по каналу MOSI, слейв - по каналу MISO.

4. В этом же параграфе описана передача и прием данных в виде шагов:
Code
1
2
3
4
5
6
7
8
9
10
11
12
SPI_DR = 0xF1 // запись данных
while(TXE == 1) // ожидание готовности буфера-передатчика
SPI_DR = 0xF2 // запись данных
while(RXNE == 1) // ожидание готовности буфера-приемника
uint8_t result1 = SPI_DR // чтение полученных данных - 0xA1
while(TXE == 1) // ожидание готовности буфера-передатчика
SPI_DR = 0xF3 // запись данных
while(RXNE == 1) // ожидание готовности буфера-приемника
uint8_t result2 = SPI_DR // чтение полученных данных - 0xA2
while(RXNE == 1) // ожидание готовности буфера-приемника
uint8_t result2 = SPI_DR // чтение полученных данных - 0xA3
while(BSY == 0) // ожидание завершения передачи
Здесь код для полнодуплексного варианта прием-передачи. Только вот в циклах while нужно заменить "==" на "!=". Если Вы заметили после отправки первого байта чтения нет, отпрвляется сразу-же второй. И пока хард будет отпрвлять/получать второй байт только происхоит чтение первого принятого байта который уже готов. Так намного быстрее. А в конце соответственно получаем последний байт. Если бы нам не интересовли полученные байты, можно было бы упростить код выше до такого:
Code
1
2
3
4
5
6
7
SPI_DR = 0xF1; // запись данных
while(TXE != 1); // нужно дожидатья TXE
SPI_DR = 0xF2; // запись данных
while(TXE != 1); // нужно дожидатья TXE
SPI_DR = 0xF3; // запись данных
while(TXE != 1); сначала нужно дожидатья TXE только потом ждать BSY=0
while(BSY != 0);
0
0 / 0 / 0
Регистрация: 07.02.2016
Сообщений: 290
09.08.2016, 14:34
Ясно, спасибо.
Да, не равно единице, конечно.

Забавно, но в тех же примерах в интернете практически нигде флаг BSY не используется...

А что с пунктом номер 5? Такое ведь часто бывает: отправляешь команду, а после несколько dummy байтов, например. Далее нужно прочитать результат.
Code
1
2
3
4
5
6
7
8
9
10
11
12
SPI_DR = 0xF1; // запись команды
while(TXE == 0);
SPI_DR = 0x00; // dummy byte
while(TXE == 0);
SPI_DR = 0x00; // dummy byte
while(TXE == 0);
... // сделали n-1 раз
uint8_t notused = SPI_DR; // сбросили OVR флаг
SPI_DR = 0x00; // dummy byte
while(RXNE == 0);
uint8_t result = SPI_DR;
while(BSY == 1);
Корректно?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.08.2016, 14:34
Помогаю со студенческими работами здесь

Передача данных, вопросы по SPI и SSI интерфейсам
Привет всем. Я работаю над собственным электроприводом, обзавелся силовым драйвером для шагового двигателя (TMC246A-PA) угловым энкодером...

БД: Контрольные вопросы по дисциплинам, темам и разделам: дисциплина; преподаватели; набор билетов; билет; вопросы к билетам; вопросы; темы вопросов
добрый день! нужна база данных на тему "Контрольные вопросы по дисциплинам, темам и разделам: дисциплина; преподаватели; набор билетов;...

ILI9341 SPI DMA, SPI, UART библиотеки
Доброго времени, форумчане... Посоветуйте библиотек плиз... 0) Либа для работы с контроллером по типу HAL (чисто ваше мнение какая вам...

SPI Flash 25q128 как SD в SPI mode ?
ну задача использовать spi флешки вместо sd карт. Как это зделать? Будет ли работать если spi флеху просто припаять и вставить в...

Когда вопросы кончаются, сделать кнопку неактивной и вывести сообщение о том, что вопросы кончились
Кто знает ребят подскажите в чем проблема, есть метод обновляющий текст в TextView (всего 6 вопросов). Так вот когда вопросы кончаются...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru