|
|
  |
Пауза между байтами в SPI DMA, STM32F4xx |
|
|
|
Sep 20 2013, 08:34
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(Rash @ Sep 20 2013, 12:13)  не разобрался я как через таймер DMA запускать. Понял пока, что как то через триггерный режим. Все просто: DMA натравливаете на буфер памяти и на SPI->DR. Но выбираете канал, который управляется событием по таймеру, а не канал для SPI_TX. Настраиваете таймер с нужной частотой, разрешаете ему генерировать DMA-запросы. Если CPU у Вас работает на 168МГц, то ничего страшного. Если частота ниже, то будут неприятности связанные с тем, что между DMA-запросом и DMA-транзакцией проходит от 12 тактов. Позже попробую, покажу в чем может быть затык. Какая частота CPU (168МГц), шины для SPI (168/2)? Номер SPI (SPI2)? Какая частота у SPI_SCK (5.25МГц = 168/32)? Какая задержка tNXT (250нс)? Какая длина посылки? Какой таймер свободен?
|
|
|
|
|
Sep 20 2013, 08:51
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(scifi @ Sep 20 2013, 12:46)  Ну да, а чтобы запросы не генерировались бесконечно, нужен второй таймер, чтобы всё это в нужный момент остановилось, причём сделать можно без прерываний и вообще вмешательств процессора: запустил и забыл. Update: Пардон, DMA и сам умеет останавливаться после заданного числа посылок. Все хитрее, по прерыванию DMA_TC разрешаем прерывание от TIM. В прерывании от TIM считаем, что последний байт передан полностью, можно взводить NSS и запрещать TIM. Нужна только передача, как я понял?
|
|
|
|
|
Sep 20 2013, 08:54
|
Знающий
   
Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840

|
Цитата(HHIMERA @ Sep 20 2013, 11:51)  Ысчо разз!!! Вы точно в теме???  Точно. По моему мы разговариваем на разных языках 1. Можно запустить ДМА по таймеру, но нельзя приостановить передачу после каждого байта для выдержки inter-byte time. Т.е. как только SPI TXE будет выставлен, ДМА загрузит новый байт (если есть) и SPI продолжит непрерывную передачу. 2. Можно использовать Single Mode DMA, но смысл? Это ничем не будет отличаться от записи в SPI DR.
|
|
|
|
|
Sep 20 2013, 08:54
|
Знающий
   
Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231

|
Цитата Нужна только передача, как я понял? нужна и передача, и приём. Только прерывания от таймера, это задействование процессорного времени
|
|
|
|
|
Sep 20 2013, 09:04
|
Местный
  
Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126

|
Цитата(adnega @ Sep 20 2013, 11:51)  Все хитрее, по прерыванию DMA_TC разрешаем прерывание от TIM. Не нужны там никакие прерывания... думайте... Цитата(DmitryM @ Sep 20 2013, 11:54)  По моему мы разговариваем на разных языках  Похоже... вы пытаетесь мне что-то объяснить/доказать... а мне не нужно... у меня всё давно работает... Цитата(scifi @ Sep 20 2013, 11:55)  Эти таймеры можно каскадировать самым причудливым образом. Но по возможности надо избегать, иначе голова закружится :-) Это дело привычки... зато какая сила!!! STM'у респект!!!
|
|
|
|
|
Sep 20 2013, 09:05
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(Rash @ Sep 20 2013, 12:54)  нужна и передача, и приём. Только прерывания от таймера, это задействование процессорного времени Всего на посылку будет возникать два прерывания: одно от DMA, второе от таймера. Песле посылки очередного байта прерывания не будет. Прерывание нужно только в самом конце - освободить NSS сразу после передачи последнего байта. Хотя, если делать прием, то завершение посылки можно настроить по второму DMA_TC, настроеному на события SPI_RX. Прерывания от таймера в таком случае не понадобится.
|
|
|
|
|
Sep 20 2013, 09:15
|
Знающий
   
Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840

|
Цитата(HHIMERA @ Sep 20 2013, 13:04)  а мне не нужно... у меня всё давно работает... у меня тоже, но не на СТМ и без использования таймеров, на голом SPI. PS. Собственно все сводится к уменьшению частоты SPI, а отчего запускать ДМА - от таймера или от SPI без разницы.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|