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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> uart+dma
zltigo
сообщение Feb 7 2016, 17:46
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (Огурцов @ Feb 7 2016, 18:33) *
это очень медленный интерфейс с огромных оверхедом

Это потрясающая новость! Можно сказать открытие!!!
Вообще то Ethernet и какая нибудь взятая Вами без разбору кривая реализация IP, есть РАЗНЫЕ вещи.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Огурцов
сообщение Feb 7 2016, 18:42
Сообщение #17


Гуру
******

Группа: Участник
Сообщений: 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
mantech
сообщение Feb 7 2016, 18:48
Сообщение #18


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(Огурцов @ Feb 7 2016, 19:33) *
это очень медленный интерфейс с огромных оверхедом
мне надо 62.5 килопакета в секунду, а на эзернете реально получается где-то 25, при 100% загрузке
и ещё его нет в бюджетных камнях


Опа! Что-то не то в датском королевстве biggrin.gif

Что означает 62килопакета, в граммах - непонятно, пакет-то какой длины будет?? В езернете есть ограничения только на макс. длину, 64кб и минимальную, то-ли 64 байта или 48 не помню уже laughing.gif

Причем вся обработка пакета, т.е. преамбула, CRC и т.д. делается самим контроллером, с дма и всякими плюшками...

И не путайте протокол(IP) и интерфейс. rolleyes.gif Кстати, IP можно и по уарту гнать, как и просто пакеты по эзернету

В бюджетных камнях нет, только зачем 10 мегабит в бюджетке??

ЗЫ. И да, есть еще CAN. Тоже встроенный обработчик пакетов, приличные скорости...

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


Гуру
******

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



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

Сообщение отредактировал Огурцов - Feb 7 2016, 19:29
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 7 2016, 20:23
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (Огурцов @ Feb 7 2016, 20:42) *
будете сравнивать вес uart c ethernet ?

Не умеете работотать с uart используейте ГОТОВЫЙ пакетный интерфейс. Размеры чипов не отличаются, как и их вес sm.gif


QUOTE (mantech @ Feb 7 2016, 20:48) *
минимальную, то-ли 64 байта или 48 не помню уже laughing.gif

Зачастую и его можно обойти, причем совершено безболезненно при соединении точка-точка, где нет коллизий.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Feb 7 2016, 21:09
Сообщение #21


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Я бы сделал циклический буфер, заполняемый DMA, с прерыванием по наполовину заполненному буферу и таймаут на случай недостаточно длинного пакета. В приемнике обрабатывать как непрерывный поток.
Таймаут от прерывания таймера считать. Ну это очевидно.

Ну разумеется второе (вернее основное) назначение таймаута -- синхронизация на начало пакета.

Недостаток по сравнению с прерыванием на каждый принятый байт -- необходимость иметь более длинный таймаут. Без DMA на 115200 одной миллисекунды достаточно.
Go to the top of the page
 
+Quote Post
evgen2
сообщение Feb 7 2016, 21:24
Сообщение #22


Местный
***

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



Цитата(Огурцов @ Feb 7 2016, 01:18) *
как наименьшими телодвижениями организовать приём пакетов ?


О, а у меня противоположный вопрос - как с наименьшими движениями организовать передачу по DMA из памяти в uart на lpc17xx.
Пример из code.bundle работает замечательно, но сцуко, только до 16 байт.
Пример из новейшего супер-пупер cmsis \lpc175x_6x_cmsis_driver_library\Examples\UART\DMA\uart_dma_test.c
вообще напрочь как-то не адаптируется под вариант "послать на uart3" - не происходит прерывания DMA_IRQ, хотя вроде бы всё такое же..
Может у кого есть работающий пример?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 8 2016, 03:53
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 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
Огурцов
сообщение Feb 8 2016, 06:33
Сообщение #24


Гуру
******

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



Цитата(jcxz @ Feb 8 2016, 03:53) *
Или у Вас оверсэмплинг = 8?

конечно

Go to the top of the page
 
+Quote Post
mantech
сообщение Feb 8 2016, 07:20
Сообщение #25


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(jcxz @ Feb 8 2016, 06:53) *
10 МБит/с - это ведь как минимум 160МГц тактовой на входе UART-периферии.


Разогнал наверно biggrin.gif

ЗЫ. Вообще посмотрел соседнюю тему, товарищ Огурцов вообще интересными вещами занимается, например, езернет без мак контроллера, по спи... Так что 10 мег по уарту уже не удивляет laughing.gif

Сам считаю, что для каждой задачи нужно свое решение, если нужен эзернет - так и надо брать мк с ним, а если мегабитные скорости - ИМХО уарт не для этого был разработан...

Сообщение отредактировал mantech - Feb 8 2016, 07:22
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 8 2016, 07:54
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (mantech @ Feb 8 2016, 09:20) *
ЗЫ. Вообще посмотрел соседнюю тему, товарищ Огурцов вообще интересными вещами занимается, например, езернет без мак контроллера, по спи... Так что 10 мег по уарту уже не удивляет laughing.gif

Не занимается, а есть к русском языке хорошее слово - мается. Он еще на 100% умолчал, что ему все это "нужно" в количестве 999 точек на 9999 метров. В общем в обычном своем стиле sad.gif писать что попало.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
evgen2
сообщение Feb 8 2016, 08:21
Сообщение #27


Местный
***

Группа: Участник
Сообщений: 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
Огурцов
сообщение Feb 8 2016, 08:27
Сообщение #28


Гуру
******

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



Цитата(mantech @ Feb 8 2016, 07:20) *
Разогнал

нет, затормозил

Цитата(mantech @ Feb 8 2016, 07:20) *
10 мег по уарту

не только 10, в не самом бюджетном камне от 40..50 до 100 должно
ещё тут недавно тема была, про нейросети, точнее про сотни бюджетных камней на одной плате, как им общаться ?

Цитата(mantech @ Feb 8 2016, 07:20) *
если нужен эзернет

нам такой футбол не нужен http://electronix.ru/forum/index.php?showt...t&p=1402440

Цитата(mantech @ Feb 8 2016, 07:20) *
ИМХО уарт не для этого был разработан...

а для чего ? а для чего был телефон придуман, для adsl, наверно ?

Сообщение отредактировал Огурцов - Feb 8 2016, 08:28
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 8 2016, 08:55
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #30


Местный
***

Группа: Участник
Сообщений: 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

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

 


RSS Текстовая версия Сейчас: 17th June 2025 - 01:44
Рейтинг@Mail.ru


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