Перейти к содержанию
    

SPI на stm32f2xx и прерывания

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

 

Пытаюсь реализовать обмен по 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?

 

Спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

А да можно еще сделать блокируемое чтение - посылку.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не совсем понятно, в чем вопрос. Все 4 пункта верные, так дело и происходит. Если данные по прерыванию RXNE считывать долго, (так, что уже примется следующий байт), то они потеряются.

DMA на stm32f2xx использовать просто, но, к сожалению, CS к нему не подключается и им все равно придется управлять по прерываниям.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Или же я все же что-то недопонял?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

DMA на stm32f2xx использовать просто, но, к сожалению, CS к нему не подключается и им все равно придется управлять по прерываниям.

Вот почему оно не подключается, вот в чём вопрос? И фифо на SPI в стм наверняка нету... :(

Почему всё так обрезано???

В LPC-ках, к примеру, и фифо есть и CS-ом рулить по DMA можно (хоть не всегда гуд).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот почему оно не подключается, вот в чём вопрос? И фифо на SPI в стм наверняка нету... :(

Почему всё так обрезано???

В LPC-ках, к примеру, и фифо есть и CS-ом рулить по DMA можно (хоть не всегда гуд).

 

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

 

Я видел, как CS подключен к DMA на AVR32 и это был обычный костыль - бит CS указывался в старших битах 32-х разрядного регистра данных. Т.е. чтобы передавать 8-ми битные данные с поддержкой CS, DMA нужно было настроить на 32 бита и в поток данных искусственно вставлять биты CS.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И фифо на SPI в стм наверняка нету... :(

 

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

Сделали бы они хотя б 2-байтное fifo на прием, было бы здорово...

 

 

 

Я видел, как CS подключен к DMA на AVR32 и это был обычный костыль - бит CS указывался в старших битах 32-х разрядного регистра данных. Т.е. чтобы передавать 8-ми битные данные с поддержкой CS, DMA нужно было настроить на 32 бита и в поток данных искусственно вставлять биты CS.

 

Ну а как по другому то сделать? Надо ж где-то сообщать, когда изменять CS. Кстати интересный вопрос - у CS же еще и задержка должна быть. А она как настраивается в таком случае?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я видел, как CS подключен к DMA на AVR32 и это был обычный костыль - бит CS указывался в старших битах 32-х разрядного регистра данных. Т.е. чтобы передавать 8-ми битные данные с поддержкой CS, DMA нужно было настроить на 32 бита и в поток данных искусственно вставлять биты CS.

Хорошая вещь. В OMAP-L137/138 примерно такая же возможность есть. И там не одним, а несколькими CS-ами так рулить можно через один регистр. Т.е. - одной DMA-транзакцией несколько разных устройств на SPI шине обслужить.

В LPC по-другому.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Именно так и делаю, как в ТС.

Так как принятый байт 0 приходит в момент, когда заканчивается отправка байта 0, то е вас есть еще целое время на передачу байта 1 до того, как произойдет переполнение. При этом насколько я помню при срабатывании интерапта по приему байта 0, уже можно писать в DR байт 2, так как байт 1 уже оттуда ушел в буффер передачи.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Другими словами в функции отправки перед отправкой байта данных надо проверить нет ли принятого байта, и если есть просто сложить его в память. Прерывание отправки сместить не на буфер пуст, а байт отправлен, потеряете пару тактов на символ, зато все надежно...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Другими словами в функции отправки перед отправкой байта данных надо проверить нет ли принятого байта, и если есть просто сложить его в память. Прерывание отправки сместить не на буфер пуст, а байт отправлен, потеряете пару тактов на символ, зато все надежно...

 

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот почему оно не подключается, вот в чём вопрос? И фифо на SPI в стм наверняка нету... :(

Почему всё так обрезано???

В LPC-ках, к примеру, и фифо есть и CS-ом рулить по DMA можно (хоть не всегда гуд).

 

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

 

Откуда у народа тяга к STM32?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

LPC(1343, 1114) .... удачные процессоры.

Откуда у народа тяга к STM32?

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...