реклама на сайте
подробности

 
 
> SPI на stm32f2xx и прерывания
Непомнящий Евген...
сообщение Jun 11 2013, 17:38
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Здравствуйте

Пытаюсь реализовать обмен по SPI как описано в мануале, на прерываниях:
Цитата
2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE
flag).
3. Wait until TXE=1 and write the second data item to be transmitted. Then wait until
RXNE=1 and read the SPI_DR to get the first received data item (this clears the RXNE
bit). Repeat this operation for each data item to be transmitted/received until the n–1
received data.
4. Wait until RXNE=1 and read the last received data.


По пунктам (жирным - мои действия, курсивом - предположения о работе железа):
1. пишем в DR байт 0 для передачи
2. байт копируется в TX, Срабатывает прерывание по TXE, в котором пишем в DR байт 1. При этом передача из TX возможно еще не завершена
3. Передача TX завершается, при этом в DR оказывается принятый байт 0, а байт 1 копируется в TX
4. Если теперь прерывание по RXNE (в котором читем DR) обработается до окончания передачи байта 1 из TX - все здорово. Но если после, то будет переполнение и один из принятых байтов окажется потерян

Я реализовал передачу только на одном прерывании RXNE, т.е. пишу очередной байт после вычитки предыдущего. Это работает, но дает относительно большие задержки между байтами на шине. Рекомендованный в даташите алгоритм дает меньшие задержки, но иногда вызывает переполнение.

Или я где-то напутал и его все же можно реализовать для случая, когда возможна задержка обработка прерывания по RXNE?

Спасибо!
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 16)
Golikov A.
сообщение Jun 12 2013, 07:21
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



ДМА - универсальное решение. Один момент, надо уточнить нет ли буфера фифо на входе и выходе. В ЛПЦ процах например ставят 16 байтные буферы, не знаю как на этом семействе СТМ.

Если их нет, то единственный шанс сохранности данных это вычитывать байт из буфера до прихода следующего. Тут поможет либо не блокируемое прерывание, либо ДМА. Последние существенно увеличивает скорость обмена без нагрузки на проц.

А да можно еще сделать блокируемое чтение - посылку.
то есть тупо читать по одному байту дожидаясь его прихода в функции чтения, но так уже делать давно не модно...
Go to the top of the page
 
+Quote Post
Dopler
сообщение Jun 12 2013, 13:25
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 437
Регистрация: 23-04-05
Из: Таганрог
Пользователь №: 4 425



Не совсем понятно, в чем вопрос. Все 4 пункта верные, так дело и происходит. Если данные по прерыванию RXNE считывать долго, (так, что уже примется следующий байт), то они потеряются.
DMA на stm32f2xx использовать просто, но, к сожалению, CS к нему не подключается и им все равно придется управлять по прерываниям.
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Jun 13 2013, 05:23
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Да просто полдня ковырялся с spi, пока до меня не дошло, что алгоритм в принципе работать не может sm.gif Захотелось получить независимое подтверждение.

СТМовцы могли бы в даташите и написать об этом...


Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jun 13 2013, 05:40
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



не очень понятно почему не может? Он так и работает на миллионах процовsm.gif...
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Jun 13 2013, 06:20
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



он будет работать, если мы гарантируем отрабатываение прерывания по RXNE до окончания передачи следующего байта. Если такой гарантии нет - алгоритм не работает.

Или же я все же что-то недопонял?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 13 2013, 07:23
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Dopler @ Jun 12 2013, 19:25) *
DMA на stm32f2xx использовать просто, но, к сожалению, CS к нему не подключается и им все равно придется управлять по прерываниям.

Вот почему оно не подключается, вот в чём вопрос? И фифо на SPI в стм наверняка нету... sad.gif
Почему всё так обрезано???
В LPC-ках, к примеру, и фифо есть и CS-ом рулить по DMA можно (хоть не всегда гуд).
Go to the top of the page
 
+Quote Post
Dopler
сообщение Jun 13 2013, 08:09
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 437
Регистрация: 23-04-05
Из: Таганрог
Пользователь №: 4 425



Цитата(jcxz @ Jun 13 2013, 11:23) *
Вот почему оно не подключается, вот в чём вопрос? И фифо на SPI в стм наверняка нету... sad.gif
Почему всё так обрезано???
В LPC-ках, к примеру, и фифо есть и CS-ом рулить по DMA можно (хоть не всегда гуд).


В STM32 DMA довольно простой, указали адрес, количество и вперед, применять очень легко.

Я видел, как CS подключен к DMA на AVR32 и это был обычный костыль - бит CS указывался в старших битах 32-х разрядного регистра данных. Т.е. чтобы передавать 8-ми битные данные с поддержкой CS, DMA нужно было настроить на 32 бита и в поток данных искусственно вставлять биты CS.
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Jun 13 2013, 08:20
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(jcxz @ Jun 13 2013, 11:23) *
И фифо на SPI в стм наверняка нету... sad.gif


Нету, увы. В регистре хранится последний прочитанный байт, плюс есть внутренний регистр, в который идет чтение из шины.
Сделали бы они хотя б 2-байтное fifo на прием, было бы здорово...



Цитата(Dopler @ Jun 13 2013, 12:09) *
Я видел, как CS подключен к DMA на AVR32 и это был обычный костыль - бит CS указывался в старших битах 32-х разрядного регистра данных. Т.е. чтобы передавать 8-ми битные данные с поддержкой CS, DMA нужно было настроить на 32 бита и в поток данных искусственно вставлять биты CS.


Ну а как по другому то сделать? Надо ж где-то сообщать, когда изменять CS. Кстати интересный вопрос - у CS же еще и задержка должна быть. А она как настраивается в таком случае?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 13 2013, 08:45
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Dopler @ Jun 13 2013, 14:09) *
Я видел, как CS подключен к DMA на AVR32 и это был обычный костыль - бит CS указывался в старших битах 32-х разрядного регистра данных. Т.е. чтобы передавать 8-ми битные данные с поддержкой CS, DMA нужно было настроить на 32 бита и в поток данных искусственно вставлять биты CS.

Хорошая вещь. В OMAP-L137/138 примерно такая же возможность есть. И там не одним, а несколькими CS-ами так рулить можно через один регистр. Т.е. - одной DMA-транзакцией несколько разных устройств на SPI шине обслужить.
В LPC по-другому.
Go to the top of the page
 
+Quote Post
syoma
сообщение Jun 13 2013, 08:52
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 817
Регистрация: 14-02-07
Из: наших, которые работают за бугром
Пользователь №: 25 368



Именно так и делаю, как в ТС.
Так как принятый байт 0 приходит в момент, когда заканчивается отправка байта 0, то е вас есть еще целое время на передачу байта 1 до того, как произойдет переполнение. При этом насколько я помню при срабатывании интерапта по приему байта 0, уже можно писать в DR байт 2, так как байт 1 уже оттуда ушел в буффер передачи.
Поэтому передача будет осуществлятсься без пауз. По крайней мере у меня так и все работает стабильно.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jun 13 2013, 12:39
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



вы затрете принятый байт вторым байтом только в том случае если начнете его передавать.

Другими словами в функции отправки перед отправкой байта данных надо проверить нет ли принятого байта, и если есть просто сложить его в память. Прерывание отправки сместить не на буфер пуст, а байт отправлен, потеряете пару тактов на символ, зато все надежно...
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Jun 14 2013, 07:27
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(Golikov A. @ Jun 13 2013, 16:39) *
Другими словами в функции отправки перед отправкой байта данных надо проверить нет ли принятого байта, и если есть просто сложить его в память. Прерывание отправки сместить не на буфер пуст, а байт отправлен, потеряете пару тактов на символ, зато все надежно...


Я так и сделал. Но в даташите описан другой алгоритм. Интересовало - может ли он работать без гарантии момент обработки прерывания на прием.

Go to the top of the page
 
+Quote Post
etoja
сообщение Jun 14 2013, 07:39
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 121
Регистрация: 14-01-05
Из: Москва
Пользователь №: 1 952



Цитата(jcxz @ Jun 13 2013, 11:23) *
Вот почему оно не подключается, вот в чём вопрос? И фифо на SPI в стм наверняка нету... sad.gif
Почему всё так обрезано???
В LPC-ках, к примеру, и фифо есть и CS-ом рулить по DMA можно (хоть не всегда гуд).


Бросается в глаза то, что по LPC(1343, 1114) вопросов у форумчан нет. Действительно удачные процессоры.

Откуда у народа тяга к STM32?
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Jun 15 2013, 15:41
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(etoja @ Jun 14 2013, 11:39) *
LPC(1343, 1114) .... удачные процессоры.
Откуда у народа тяга к STM32?

Там есть свои "прелести". Тот же PWM на 1343 аппаратно сделать не выйдет. По нынешним временам это совсем странно.

Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jun 15 2013, 15:58
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Qwertty @ Jun 15 2013, 18:41) *
Тот же PWM на 1343 аппаратно сделать не выйдет.

Вам PWM какой-то специальный нужен?
PWM выходы каждый из четырёх таймеров имеет.
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Jun 15 2013, 18:30
Сообщение #17


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Обычный. Просто регистры задания коэффициента заполнения доступны по записи в любое время. В нормальных таймерах (или в модуле PWM в более старших моделях) содержимое этих регистров меняется при переполнении счетчика, а запись идет в буферные регистры. С прямой записью результат имеет глитчи. В том же STM32 имеются теневые регистры. Да и в 8 битниках обычно они тоже есть. В тех же АВР тоже.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 21:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.0149 секунд с 7
ELECTRONIX ©2004-2016