|
|
  |
Пауза между байтами в SPI DMA, STM32F4xx |
|
|
|
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 на один байт? А зачем он тогда нужен? Ысчо разз!!! Вы точно в теме???
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|