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

 
 
> uart+dma
Огурцов
сообщение Feb 6 2016, 22:18
Сообщение #1


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



как наименьшими телодвижениями организовать приём пакетов ?
пока видится только один вариант - сделать все пакеты одинаковой длины
но даже он не решает полностью - может прийти полпакета или наоборот, больше
после чего остальные пакеты перестанут попадать на границу и прерывание будет вызываться не по концу пакета, а где-то по середине
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Огурцов
сообщение Feb 7 2016, 16:33
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



тут вопрос в другом - будет ли генерироваться idle, если внутри пакета придёт новый адреса слейва ?
было бы правильнее иметь прерывание именно по смене адреса, что абсолютно однозначно указывает на конец пакета


Цитата(mantech @ Feb 7 2016, 14:45) *
Ethernet?

это очень медленный интерфейс с огромных оверхедом
мне надо 62.5 килопакета в секунду, а на эзернете реально получается где-то 25, при 100% загрузке
и ещё его нет в бюджетных камнях

Цитата(mantech @ Feb 7 2016, 14:45) *
фиксированной длины

потенциально это можно, если бы оно только решало


Цитата(ViKo @ Feb 7 2016, 14:30) *
передавайте сначала заголовок пакета, в нем размер. По нему настройте ПДП. А затем передавайте сам пакет.

нет

Сообщение отредактировал Огурцов - Feb 7 2016, 16:34
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 7 2016, 17:45
Сообщение #3


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Огурцов @ Feb 7 2016, 21:33) *
тут вопрос в другом - будет ли генерироваться idle, если внутри пакета придёт новый адреса слейва ?
было бы правильнее иметь прерывание именно по смене адреса, что абсолютно однозначно указывает на конец пакета

Так включите и это прерывание, одно другому не мешает.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Огурцов
сообщение Feb 7 2016, 18:42
Сообщение #4


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



Цитата(AHTOXA @ Feb 7 2016, 18:45) *
Так включите и это прерывание, одно другому не мешает.

так я не нашёл

в общем, попробую три варианта
если idle принимается каждым слейвом, независимо от текущего адреса, буду генерить его один раз в конце пакета
если idle относится только к текущему слейву, буду генерить его на каждый субпакет
если уж совсем ничего не поможет - придется дополнительно задействовать прерывание exti спаду сигнала data_valid, который я совсем упустил

Цитата(jcxz @ Feb 7 2016, 17:37) *
SPI

синхронизироваться сложно


Цитата(zltigo @ Feb 7 2016, 18:46) *
кривая

будете сравнивать вес uart c ethernet ?

Сообщение отредактировал Огурцов - Feb 7 2016, 18:42
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 8 2016, 03:53
Сообщение #5


Гуру
******

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



Цитата(Огурцов @ Feb 8 2016, 00:42) *
синхронизироваться сложно

А вот вопрос - что это за бюджетный камень такой у STM позволяющий 10МБит/с по UART??? Озвучьте!
10 МБит/с - это ведь как минимум 160МГц тактовой на входе UART-периферии.
Или у Вас оверсэмплинг = 8? Но всё равно...

Цитата(evgen2 @ Feb 8 2016, 03:24) *
О, а у меня противоположный вопрос - как с наименьшими движениями организовать передачу по DMA из памяти в uart на lpc17xx.

А что именно вызывает затруднения? Поставить бит в SSP.DMACR и написать 5 строчек инициализации DMA-канала???
Подсказка: чтобы хоть что-то организовать, надо первым делом открыть даташит. Или этот шаг пропустили и сразу в примеры полезли?
Go to the top of the page
 
+Quote Post
evgen2
сообщение Feb 8 2016, 08:21
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688



Цитата(jcxz @ Feb 8 2016, 06:53) *
А что именно вызывает затруднения? Поставить бит в SSP.DMACR и написать 5 строчек инициализации DMA-канала???
Подсказка: чтобы хоть что-то организовать, надо первым делом открыть даташит. Или этот шаг пропустили и сразу в примеры полезли?

Зачем мне для передачи из памяти в uart ставить бит в SSP.DMACR ? нелогично вроде.
Кстати, SSP.DMACR - read/write регистр, а UnFCR, куда нужно писать соответствующие биты для DMA - write only, что придает некоторую сексуальность в сравнении "тут работает, тут не работает".

И на 5 строчек тоже как-то не хватает, но пофиг, пусть будет больше, лишь бы работало
Код
/* зовем один раз */
  LPC_SC->PCONP |= (1 << 29);    /* Enable GPDMA clock */
  LPC_SC->DMAREQSEL = 0x0000;  /* Select primary function(UART0/1/2/3) in DMA channels,  secondary is timer 0/1/2/3. */
/*.....*/
/* str - строка для передачи в uart длиной len */
/* всё работает , если len <= 16, если больше - в порт уходит только 16 байт */
   DMA_Init( M2P, str, 0, len);
   LPC_GPDMACH0->DMACCConfig |= 0x08001|0x380;    /* Enable channel and IE bit */
/* [b]UPDATE[/b]: а так всё работает, как надо (chanel tranfer type был установлен в memory to memory)  */
   LPC_GPDMACH0->DMACCConfig |= 0x08001|0x380|(1<<11);    /* Enable channel and IE bit */
/*.....*/        

int DMA_Init( int DMAMode, char *src_addr, char *dest_addr, int dsize)
{
    if ( DMAMode == M2P ) {

      /* Ch0 set for M2P transfer from mempry to UART. */
      LPC_GPDMACH0->DMACCSrcAddr  = (uint32_t) src_addr;
      LPC_GPDMACH0->DMACCDestAddr = (uint32_t) LPC_UART3_BASE;

      /* The burst size is set to 1, source and dest transfer width is 32 bits(word), Terminal Count Int enable */
      LPC_GPDMACH0->DMACCControl = (dsize & 0x0FFF)|(0x00 << 12) |(0x00 << 15)
        |(0x00 << 18)|(0x00 << 21) | (1 << 26)| (0 << 27) | 0x80000000;
    }        
    LPC_GPDMA->DMACConfig = 0x01;    /* Enable DMA channels, little endian */
    while ( !(LPC_GPDMA->DMACConfig & 0x01) );    

   NVIC_EnableIRQ(DMA_IRQn);
   return (TRUE);
}


Сообщение отредактировал evgen2 - Feb 8 2016, 09:58
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 8 2016, 08:55
Сообщение #7


Гуру
******

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



Цитата(evgen2 @ Feb 8 2016, 14:21) *
Зачем мне для передачи из памяти в uart ставить бит в SSP.DMACR ? нелогично вроде.
Кстати, SSP.DMACR - read/write регистр, а UnFCR, куда нужно писать соответствующие биты для DMA - write only, что придает некоторую сексуальность в сравнении "тут работает, тут не работает".

Фу-ты - конечно UART.FCR. Просто думал параллельно об SSP.

Цитата(evgen2 @ Feb 8 2016, 14:21) *
...
NVIC_EnableIRQ(DMA_IRQn);

А где установка регистра channel.config? А, вижу.
А где установка UART.FCR? И зачем |= для LPC_GPDMACH0->DMACCConfig?

Вот моя инициализация DMA для UART.tx (перед этим ещё устанавливается UART.FCR, SYSCFG.DMAREQSEL, DMA.SYNC и DMA.CFG):
Код
static void SetTxDMA(void *data, uint n)
{
  DMA.IntTCClr = 1 << DMA_CH_bt;
  DMA.IntErrClr = 1 << DMA_CH_bt;
  HwRegsDMA::T_CH volatile *ch = &DMA.CH[DMA_CH_bt];
  ch->DST = (void *)&concatAB(UART, nUART_bt).THR;
  ch->SRC = data;
  ch->LLI = NULL;
  ch->CTL = n | 0 << 15 | B26 | B31;
  __DMB();
  ch->CFG = B0 | (DMA_REQ_bt_TX >> 4) << 6 | 1 << 11 | B14 | B15;
}
Go to the top of the page
 
+Quote Post
evgen2
сообщение Feb 8 2016, 09:53
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688



Цитата(jcxz @ Feb 8 2016, 11:55) *
Вот моя инициализация DMA для UART.tx (перед этим ещё устанавливается UART.FCR, SYSCFG.DMAREQSEL, DMA.SYNC и DMA.CFG):
Код
  ch->CFG = B0 | (DMA_REQ_bt_TX >> 4) << 6 | 1 << 11 | B14 | B15;

Нашел.
Всё дело в волшебных пузырьках битиках. 1 << 11
Это transfer type. Если 0 - то memory to memory, если 1 - memory to peripheral. Если поставить 0, то всё работает до размера 16 байт (или, возможно, длины FIFO?, FIFO у меня 16 байт)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Огурцов   uart+dma   Feb 6 2016, 22:18
- - AHTOXA   Если это STM32, то добавьте прерывание по IDLE.   Feb 7 2016, 05:52
|- - Огурцов   Цитата(AHTOXA @ Feb 7 2016, 06:52) Если э...   Feb 7 2016, 09:14
|- - mantech   Цитата(Огурцов @ Feb 7 2016, 12:14) UART ...   Feb 7 2016, 13:45
|- - AHTOXA   Цитата(Огурцов @ Feb 7 2016, 14:14) а буд...   Feb 7 2016, 15:08
- - ViKo   Задавайте в начале каждого пакета его длину.   Feb 7 2016, 06:48
|- - jcxz   Для любого МК: При старте rx-DMA, кроме разрешения...   Feb 7 2016, 07:09
- - scifi   А лучше без всяких DMA передавать человеческим тек...   Feb 7 2016, 07:36
|- - Огурцов   Цитата(scifi @ Feb 7 2016, 08:36) лучше б...   Feb 7 2016, 08:47
||- - ViKo   Цитата(Огурцов @ Feb 7 2016, 11:47) т.е. ...   Feb 7 2016, 13:30
|- - jcxz   Цитата(scifi @ Feb 7 2016, 13:36) А лучше...   Feb 7 2016, 08:58
- - scifi   Можно посмотреть на LIN. Там есть Break.   Feb 7 2016, 09:41
|- - jcxz   Цитата(Огурцов @ Feb 7 2016, 22:33) мне н...   Feb 7 2016, 16:37
||- - zltigo   QUOTE (Огурцов @ Feb 7 2016, 20:42) будет...   Feb 7 2016, 20:23
||- - Огурцов   Цитата(jcxz @ Feb 8 2016, 03:53) Или у Ва...   Feb 8 2016, 06:33
||- - mantech   Цитата(jcxz @ Feb 8 2016, 06:53) 10 МБит/...   Feb 8 2016, 07:20
|||- - zltigo   QUOTE (mantech @ Feb 8 2016, 09:20) ЗЫ. В...   Feb 8 2016, 07:54
|||- - Огурцов   Цитата(mantech @ Feb 8 2016, 07:20) Разог...   Feb 8 2016, 08:27
||- - jcxz   Цитата(evgen2 @ Feb 8 2016, 15:53) Нашел....   Feb 10 2016, 13:24
|- - zltigo   QUOTE (Огурцов @ Feb 7 2016, 18:33) это о...   Feb 7 2016, 17:46
|- - mantech   Цитата(Огурцов @ Feb 7 2016, 19:33) это о...   Feb 7 2016, 18:48
- - Огурцов   дюжина байт войдёт был бы ещё uart хотя бы на 25 м...   Feb 7 2016, 19:18
- - Tarbal   Я бы сделал циклический буфер, заполняемый DMA, с ...   Feb 7 2016, 21:09
- - evgen2   Цитата(Огурцов @ Feb 7 2016, 01:18) как н...   Feb 7 2016, 21:24
- - Огурцов   погонял idle - ерунда, работает не так, как мне на...   Feb 10 2016, 12:55
|- - scifi   Цитата(Огурцов @ Feb 10 2016, 15:55) пого...   Feb 10 2016, 15:30
- - Огурцов   break работает только с lin или не только ?   Feb 10 2016, 15:55
|- - scifi   Цитата(Огурцов @ Feb 10 2016, 18:55) brea...   Feb 10 2016, 19:58
- - Огурцов   а не получилось вероятно, остановлюсь на любимом f...   Feb 10 2016, 21:17


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

 


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


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