|
|
  |
Пауза между байтами в SPI DMA, STM32F4xx |
|
|
|
Sep 19 2013, 13:30
|
Знающий
   
Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840

|
Цитата(adnega @ Sep 19 2013, 12:15)  Это какие, например? например CMX608/CMX618/CMX638 tNXT Inter-Byte time 200 – – ns Не пойму причем тут таймер, если Вы передаете через DMA. Таймером можно запустить передачу, но не вставить паузу между байтами в пакете. Это работа модуля SPI - поддержка защитных интервалов между байтами, пакетами и пр.
|
|
|
|
|
Sep 19 2013, 14:22
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(Rash @ Sep 19 2013, 17:52)  это зависимости на какой частоте запустить SPI. При частотах > 4МГц, этого значения не будет хватать. adnega, Вопрос не в том как обойти какие либо ограничения, а в том возможно ли сделать поддержку защитных интервалов между байтами при использовании DMA С помощью таймера, SPI, DMA и какой-то матери конечно можно сделать. Но тут вопрос в другом: интерфейс SPI настолько "дубовый", что делать какие-либо задержки между байтами, это на мой взгляд нарушение основной его идеологии. Пока не видел ни одного устройства (и которые Вы привели в пример тоже к ним относятся), которым бы требовалась задержка ежду байтами. Чисто формально можно называть такие интерфейсы не SPI, а например C-Bus, но в SPI никаких задержек не требуется. Если один интерфейс для управляемый светодиодных лент, где пауза соответствует защелкиванию данных, но между байтами поток непрерывный. Так как будем интерфейс называть? Цитата(DmitryM @ Sep 19 2013, 17:55)  Нужно как минимум один такт клока, а SPI может передавать байты сплошным потоком бит без всякой задержки. Повторяю, задержка не нужна - посмотрите внимательно, что такое tNXT по диаграмме (а не по переводу с английского). Добавлю: тут недавно обсуждали DMA + SPI на STM. Картина не такая уж и радужная. Гарантировать интервал в 200нс с помощью DMA, таймеров и прочего, по-моему, не получится. Относитесь к DMA как сущности, которая может быстро и без участия CPU передать БОЛЬШОЙ кусок данных. Как только речь заходит о единичных транзакциях начинаются проблемы. Время между DMA-запросом и DMA-транзакцией далеко не ноль, "но это еще пол беды, вся беда в том, что" это время не постоянно.
|
|
|
|
|
Sep 19 2013, 14:36
|
Знающий
   
Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840

|
Цитата(adnega @ Sep 19 2013, 18:22)  Повторяю, задержка не нужна - посмотрите внимательно, что такое tNXT по диаграмме (а не по переводу с английского). Задержка нужна, проверено на собственно опыте, иначе мсх (в моем случае CMX638) не дает верные данные. Да можно понизить частоту клока и тем самым выдержать эти несчастные 200нс. В моем случа все решалось просто, у атмела sam7s все это умеет делать модуль SPI, задал параметры и все. В случае с стм32 этого сделать нельзя при работе через DMA, а поллингом как-то некузяво, итак есть чем заниматься. Здесь по-моему только снижением частоты клока. ЗЫ. Разработчики мсх специально указали Inter-Byte time, могли бы вообще не указывать, tCK сказали, что не меньше такого то и все, ан нет, указали, обратили внимание.
|
|
|
|
|
Sep 19 2013, 15:08
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(Rash @ Sep 19 2013, 18:42)  А теперь давайте по существу вопроса. Я просил рассказать какие есть возможности сделать задержку между байтами (если они есть), а не разъяснить как работать с какой либо микрой. Я таких возможностей пока не нашёл. У STM я таких возможностей не видел. Добавлю: сейчас посмотрел на STM32F3xx (у них SPI другой) Цитата SPI special features 26.4.1 NSS pulse mode This mode is activated by the NSSP bit in the SPIx_CR1 register and it takes effect only if the SPI interface is configured as Motorola SPI master with capture on the first edge (SPIx_CR1 CPHA = 0). When activated, an NSS pulse is generated between two consecutive data frame transfers when NSS stays at high level for the duration of one clock period at least. This mode allows the slave to latch data. NSSP pulse mode is designed for applications with a single master-slave pair. На картинке таки вставляет один пробел в SCK, но не знаю будет ли работать с DMA. Могу как-нить попробовать, или F3 для Вас не вариант.
Эскизы прикрепленных изображений
|
|
|
|
|
Sep 19 2013, 19:45
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Попробовал. Получилось)) Правда, на STM32F303 (с новым SPI). Код void init_SPI2(void) { SPI2->CR1 = (1 << SPI_CR1_SSM) | (1 << SPI_CR1_SSI) | (0 << SPI_CR1_SPE) | (2 << SPI_CR1_BR) | (1 << SPI_CR1_MSTR);
SPI2->CR2 = (1 << SPI_CR2_SSOE) | (7 << SPI_CR2_DS) | (0 << SPI_CR2_FRF) | (1 << SPI_CR2_NSSP) // ВСТАВИТЬ ПАУЗЫ | (0 << SPI_CR2_TXDMAEN);
SPI2->CR1 = (1 << SPI_CR1_SSM) | (1 << SPI_CR1_SSI) | (1 << SPI_CR1_SPE) | (2 << SPI_CR1_BR) | (1 << SPI_CR1_MSTR); }
Передача: SPI2->CR2 = (1 << SPI_CR2_SSOE) | (7 << SPI_CR2_DS) | (0 << SPI_CR2_FRF) | (1 << SPI_CR2_NSSP) | (0 << SPI_CR2_TXDMAEN);
DMA1_Channel5->CCR = (DMA_PL_HIGH << DMA_CCR_PL) | (DMA_SIZE_BYTE << DMA_CCR_MSIZE) | (DMA_SIZE_BYTE << DMA_CCR_PSIZE) | (1 << DMA_CCR_DIR) | (1 << DMA_CCR_MINC) | (0 << DMA_CCR_EN);
DMA1_Channel5->CPAR = (DWORD)&SPI2->DR8; DMA1_Channel5->CMAR = (DWORD)&val; DMA1_Channel5->CNDTR = 8;
DMA1->IFCR = (0x0F << 16);
DMA1_Channel5->CCR = (DMA_PL_HIGH << DMA_CCR_PL) | (DMA_SIZE_BYTE << DMA_CCR_MSIZE) | (DMA_SIZE_BYTE << DMA_CCR_PSIZE) | (1 << DMA_CCR_DIR) | (1 << DMA_CCR_MINC) | (1 << DMA_CCR_EN);
SPI2->CR2 = (1 << SPI_CR2_SSOE) | (7 << SPI_CR2_DS) | (0 << SPI_CR2_FRF) | (1 << SPI_CR2_NSSP) | (1 << SPI_CR2_TXDMAEN); Частота SPI 72Мгц/8/2 = 4.5МГц. Пауза между битами 540нс.
Эскизы прикрепленных изображений
|
|
|
|
|
Sep 19 2013, 20:07
|
Знающий
   
Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840

|
Цитата(adnega @ Sep 20 2013, 00:01)  Дык, NSS-ом в STM обычно софтово машут. А, я все больше по старинке (FPGA) на железку полагаюсь  Нафига лишний боян. машет nSS, ну и пусть машет. А топикпастреру, следуюший алгоритмтм, но без DMA: послал, узнал что отправилось, взвел таймер, по истечению таймера запустил на один байт и т.д.
|
|
|
|
|
Sep 19 2013, 20:25
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(DmitryM @ Sep 20 2013, 00:07)  А, я все больше по старинке (FPGA) на железку полагаюсь  Нафига лишний боян. )) Сравнили. В МК чем-то нужно жертвовать. Из всех зол, это меньшее. Но ТС вряд ли подойдет, т.к. семейство другое... PS. На большом отрезке любопытно наблюдать динамику в ST. Как переделали AFIO в новых процах (большое за это спасибо), в новых SPI поддерживаются посылки от 4 до 16 бит (и паузы вставлять можно), появились 32-битные таймеры и т.п. Но на мой взгляд плохо, что переделали RTC (навороченный календарь вместо счетчика секунд), плохо что вынесли GPIO из bit-band региона((
|
|
|
|
|
Sep 19 2013, 20:32
|
Знающий
   
Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840

|
Цитата(adnega @ Sep 20 2013, 00:25)  в новых SPI поддерживаются посылки от 4 до 16 бит (и паузы вставлять можно) Как? Именно об этом спрашивает Rash. ЗЫ. Легко это сделал на SAM7
|
|
|
|
|
Sep 19 2013, 22:30
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(DmitryM @ Sep 20 2013, 01:03)  Опять? nSS нельзя снимать. По второму кругу. Не используйте аппаратное управление NSS и будет Вам счастье. Не понимаю, что мешает опустить NSS перед передачей и поднять когда все закончится? Более того, когда будете подключать SD-карту по SPI при чтении сектора данные идут не сразу, нужно засылать FF пока не придет ответ со статусом, затем с помощью DMA можно прочитать сразу сектор. В таких случаях только софтовое управление NSS или я чего-то упустил в этой жизни...
|
|
|
|
|
Sep 20 2013, 06:24
|
Знающий
   
Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840

|
Цитата(adnega @ Sep 20 2013, 02:30)  В таких случаях только софтовое управление NSS или я чего-то упустил в этой жизни... Ой-ёй.  ИМХО, то что можно/нужно сделать аппаратно - нужно делать аппаратно. Незачем программе считать задержки после выставления nSS и перед началом тактирования. Там где нельзя - приходится делать программно. FF для SD карты формируем по прерыванию TXRDY, а потом читаем с помощью DMA. Ногодрыг вещь конечно хорошая, но занимает процессорное время. Зачем?
|
|
|
|
|
Sep 20 2013, 07:34
|
Местный
  
Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126

|
Цитата(Rash @ Sep 20 2013, 09:59)  Вот если бы возможно было бы сделать отправку каждого байт в SPI по тайм-ауту таймера и всё это без использование ресурсов мк, был бы реально мощный SPI в STM (даже пусть ещё таймер один забрался, всё равно их куча ещё). Ещё во втором посте вам выдали самое ценное... идею, реализацию... Потрудитесь хоть немножко поработать головой и руками... там текста... несколько строчек... ничего особенного... Настраиваете таймер, настраиваете ДМА... Запускаете ДМА, запускаете таймер...
|
|
|
|
|
Sep 20 2013, 07:51
|
Местный
  
Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126

|
Цитата(DmitryM @ Sep 20 2013, 10:41)  DMA на один байт? А зачем он тогда нужен? Ысчо разз!!! Вы точно в теме???
|
|
|
|
|
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 без разницы.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|