|
|
  |
uart+dma |
|
|
|
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
|
|
|