|
uart+dma |
|
|
|
 |
Ответов
|
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 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, 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: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 байт)
|
|
|
|
Сообщений в этой теме
Огурцов 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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|