|
uart+dma |
|
|
|
Feb 7 2016, 08:47
|
Гуру
     
Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588

|
Цитата(scifi @ Feb 7 2016, 08:36)  лучше без всяких DMA на 10 мегабит прерывания уже зашиваются Цитата(ViKo @ Feb 7 2016, 07:48)  Задавайте в начале каждого пакета его длину. т.е. я должен запустить дма, принять второй-третий байт, остановить, дма, перепрограммировать счётчики, запустить дма... ? за это время уже не один пакет проскочит и ведь главное, это никак не защищает от битых пакетов и зависоне на ожидании "всех" данных
|
|
|
|
|
Feb 7 2016, 08:58
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(scifi @ Feb 7 2016, 13:36)  А лучше без всяких DMA передавать человеческим текстом "var=val" и разделять "\r\n". Так отлаживать удобнее: подцепил терминал - и всё сразу видно. a) избыточный траффик; б) избыточные траты на парсинг. Да и вопрос был не про уровень протокола, а про уровень взаимодействия с железом. Цитата(Огурцов @ Feb 7 2016, 14:47)  на 10 мегабит прерывания уже зашиваются UART - не лучший выбор для 10-мегабитного потока. Ещё поди и на STM, где никакого FIFO и в помине нет.....
|
|
|
|
|
Feb 7 2016, 09:14
|
Гуру
     
Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588

|
Цитата(AHTOXA @ Feb 7 2016, 06:52)  Если это STM32, то добавьте прерывание по IDLE. а будет ли работать в многопроцессорном режиме ? когда в один пакет заряжено несколько субпакетов для слейвов ? Цитата(jcxz @ Feb 7 2016, 09:58)  UART - не лучший выбор для 10-мегабитного потока. какой же лучший ? Цитата(jcxz @ Feb 7 2016, 09:58)  Ещё поди и на STM, где никакого FIFO и в помине нет..... поди stm как-то считал, что пара регистров у него таки есть, в один принимает, другой в это время читаем - чем не фифо ? Цитата(Огурцов @ Feb 7 2016, 10:05)  а будет ли работать в многопроцессорном режиме ? а чего бы ему и не работать, надо попробовать прерывания по смене адреса не хватает, вот тогда бы да
Сообщение отредактировал Огурцов - Feb 7 2016, 09:06
|
|
|
|
|
Feb 7 2016, 15:08
|

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

|
Цитата(Огурцов @ Feb 7 2016, 14:14)  а будет ли работать в многопроцессорном режиме ? когда в один пакет заряжено несколько субпакетов для слейвов ? Разлеплять склеенные пакеты и собирать пакеты из кусочков - это уже другой уровень. IDLE просто позволяет не зависнуть в ожидании пакета, если байтов поступило меньше, чем ожидается. В принципе, это просто частный случай тайм-аута. Буфер побольше, прерывания на пол-буфера, на полный буфер, и на IDLE. По любому из этих прерываний - разгребаем принятое. Вот тут коллега выкладывал пример. Я применял такой подход на скорости 5МБит, сбоев не было. На 10 МБит были редкине сбои, возможно, проблемы линии связи. Выяснять не стал, спустился на 5МБит, хватило. Вот мой вариант.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Feb 7 2016, 16:33
|
Гуру
     
Группа: Участник
Сообщений: 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
|
|
|
|
|
Feb 7 2016, 18:42
|
Гуру
     
Группа: Участник
Сообщений: 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
|
|
|
|
|
Feb 7 2016, 18:48
|
Гуру
     
Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143

|
Цитата(Огурцов @ Feb 7 2016, 19:33)  это очень медленный интерфейс с огромных оверхедом мне надо 62.5 килопакета в секунду, а на эзернете реально получается где-то 25, при 100% загрузке и ещё его нет в бюджетных камнях Опа! Что-то не то в датском королевстве Что означает 62килопакета, в граммах - непонятно, пакет-то какой длины будет?? В езернете есть ограничения только на макс. длину, 64кб и минимальную, то-ли 64 байта или 48 не помню уже Причем вся обработка пакета, т.е. преамбула, CRC и т.д. делается самим контроллером, с дма и всякими плюшками... И не путайте протокол(IP) и интерфейс.  Кстати, IP можно и по уарту гнать, как и просто пакеты по эзернету В бюджетных камнях нет, только зачем 10 мегабит в бюджетке?? ЗЫ. И да, есть еще CAN. Тоже встроенный обработчик пакетов, приличные скорости...
Сообщение отредактировал mantech - Feb 7 2016, 18:52
|
|
|
|
|
Feb 7 2016, 20:23
|

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

|
QUOTE (Огурцов @ Feb 7 2016, 20:42)  будете сравнивать вес uart c ethernet ? Не умеете работотать с uart используейте ГОТОВЫЙ пакетный интерфейс. Размеры чипов не отличаются, как и их вес  QUOTE (mantech @ Feb 7 2016, 20:48)  минимальную, то-ли 64 байта или 48 не помню уже  Зачастую и его можно обойти, причем совершено безболезненно при соединении точка-точка, где нет коллизий.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Feb 7 2016, 21:24
|
Местный
  
Группа: Участник
Сообщений: 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, хотя вроде бы всё такое же.. Может у кого есть работающий пример?
|
|
|
|
|
Feb 8 2016, 03:53
|
Гуру
     
Группа: Свой
Сообщений: 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-канала??? Подсказка: чтобы хоть что-то организовать, надо первым делом открыть даташит. Или этот шаг пропустили и сразу в примеры полезли?
|
|
|
|
|
Feb 8 2016, 07:20
|
Гуру
     
Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143

|
Цитата(jcxz @ Feb 8 2016, 06:53)  10 МБит/с - это ведь как минимум 160МГц тактовой на входе UART-периферии. Разогнал наверно ЗЫ. Вообще посмотрел соседнюю тему, товарищ Огурцов вообще интересными вещами занимается, например, езернет без мак контроллера, по спи... Так что 10 мег по уарту уже не удивляет  Сам считаю, что для каждой задачи нужно свое решение, если нужен эзернет - так и надо брать мк с ним, а если мегабитные скорости - ИМХО уарт не для этого был разработан...
Сообщение отредактировал mantech - Feb 8 2016, 07:22
|
|
|
|
|
Feb 8 2016, 07:54
|

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

|
QUOTE (mantech @ Feb 8 2016, 09:20)  ЗЫ. Вообще посмотрел соседнюю тему, товарищ Огурцов вообще интересными вещами занимается, например, езернет без мак контроллера, по спи... Так что 10 мег по уарту уже не удивляет  Не занимается, а есть к русском языке хорошее слово - мается. Он еще на 100% умолчал, что ему все это "нужно" в количестве 999 точек на 9999 метров. В общем в обычном своем стиле  писать что попало.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Feb 8 2016, 08:21
|
Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Feb 8 2016, 08:27
|
Гуру
     
Группа: Участник
Сообщений: 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
|
|
|
|
|
Feb 8 2016, 08:55
|
Гуру
     
Группа: Свой
Сообщений: 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; }
|
|
|
|
|
Feb 8 2016, 09:53
|
Местный
  
Группа: Участник
Сообщений: 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 байт)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|