zltigo 2 7 февраля, 2016 Опубликовано 7 февраля, 2016 · Жалоба это очень медленный интерфейс с огромных оверхедом Это потрясающая новость! Можно сказать открытие!!! Вообще то Ethernet и какая нибудь взятая Вами без разбору кривая реализация IP, есть РАЗНЫЕ вещи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VCucumber 0 7 февраля, 2016 Опубликовано 7 февраля, 2016 (изменено) · Жалоба Так включите и это прерывание, одно другому не мешает. так я не нашёл в общем, попробую три варианта если idle принимается каждым слейвом, независимо от текущего адреса, буду генерить его один раз в конце пакета если idle относится только к текущему слейву, буду генерить его на каждый субпакет если уж совсем ничего не поможет - придется дополнительно задействовать прерывание exti спаду сигнала data_valid, который я совсем упустил SPI синхронизироваться сложно кривая будете сравнивать вес uart c ethernet ? Изменено 7 февраля, 2016 пользователем Огурцов Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 7 февраля, 2016 Опубликовано 7 февраля, 2016 (изменено) · Жалоба это очень медленный интерфейс с огромных оверхедом мне надо 62.5 килопакета в секунду, а на эзернете реально получается где-то 25, при 100% загрузке и ещё его нет в бюджетных камнях Опа! Что-то не то в датском королевстве Что означает 62килопакета, в граммах - непонятно, пакет-то какой длины будет?? В езернете есть ограничения только на макс. длину, 64кб и минимальную, то-ли 64 байта или 48 не помню уже :laughing: Причем вся обработка пакета, т.е. преамбула, CRC и т.д. делается самим контроллером, с дма и всякими плюшками... И не путайте протокол(IP) и интерфейс. :rolleyes: Кстати, IP можно и по уарту гнать, как и просто пакеты по эзернету В бюджетных камнях нет, только зачем 10 мегабит в бюджетке?? ЗЫ. И да, есть еще CAN. Тоже встроенный обработчик пакетов, приличные скорости... Изменено 7 февраля, 2016 пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VCucumber 0 7 февраля, 2016 Опубликовано 7 февраля, 2016 (изменено) · Жалоба дюжина байт войдёт был бы ещё uart хотя бы на 25 мегабит - вообще супер почему нет - кнопочку нажал, лампочку включил а десятка - на камеру, при том, что физика общая, не тянуть же по зданию десятки линий can == 1 мегабит, это очень небыстро Изменено 7 февраля, 2016 пользователем Огурцов Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 7 февраля, 2016 Опубликовано 7 февраля, 2016 · Жалоба будете сравнивать вес uart c ethernet ? Не умеете работотать с uart используейте ГОТОВЫЙ пакетный интерфейс. Размеры чипов не отличаются, как и их вес :) минимальную, то-ли 64 байта или 48 не помню уже :laughing: Зачастую и его можно обойти, причем совершено безболезненно при соединении точка-точка, где нет коллизий. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tarbal 4 7 февраля, 2016 Опубликовано 7 февраля, 2016 · Жалоба Я бы сделал циклический буфер, заполняемый DMA, с прерыванием по наполовину заполненному буферу и таймаут на случай недостаточно длинного пакета. В приемнике обрабатывать как непрерывный поток. Таймаут от прерывания таймера считать. Ну это очевидно. Ну разумеется второе (вернее основное) назначение таймаута -- синхронизация на начало пакета. Недостаток по сравнению с прерыванием на каждый принятый байт -- необходимость иметь более длинный таймаут. Без DMA на 115200 одной миллисекунды достаточно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
evgen2 0 7 февраля, 2016 Опубликовано 7 февраля, 2016 · Жалоба как наименьшими телодвижениями организовать приём пакетов ? О, а у меня противоположный вопрос - как с наименьшими движениями организовать передачу по DMA из памяти в uart на lpc17xx. Пример из code.bundle работает замечательно, но сцуко, только до 16 байт. Пример из новейшего супер-пупер cmsis \lpc175x_6x_cmsis_driver_library\Examples\UART\DMA\uart_dma_test.c вообще напрочь как-то не адаптируется под вариант "послать на uart3" - не происходит прерывания DMA_IRQ, хотя вроде бы всё такое же.. Может у кого есть работающий пример? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 8 февраля, 2016 Опубликовано 8 февраля, 2016 · Жалоба синхронизироваться сложно А вот вопрос - что это за бюджетный камень такой у STM позволяющий 10МБит/с по UART??? Озвучьте! 10 МБит/с - это ведь как минимум 160МГц тактовой на входе UART-периферии. Или у Вас оверсэмплинг = 8? Но всё равно... О, а у меня противоположный вопрос - как с наименьшими движениями организовать передачу по DMA из памяти в uart на lpc17xx. А что именно вызывает затруднения? Поставить бит в SSP.DMACR и написать 5 строчек инициализации DMA-канала??? Подсказка: чтобы хоть что-то организовать, надо первым делом открыть даташит. Или этот шаг пропустили и сразу в примеры полезли? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VCucumber 0 8 февраля, 2016 Опубликовано 8 февраля, 2016 · Жалоба Или у Вас оверсэмплинг = 8? конечно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 8 февраля, 2016 Опубликовано 8 февраля, 2016 (изменено) · Жалоба 10 МБит/с - это ведь как минимум 160МГц тактовой на входе UART-периферии. Разогнал наверно ЗЫ. Вообще посмотрел соседнюю тему, товарищ Огурцов вообще интересными вещами занимается, например, езернет без мак контроллера, по спи... Так что 10 мег по уарту уже не удивляет :laughing: Сам считаю, что для каждой задачи нужно свое решение, если нужен эзернет - так и надо брать мк с ним, а если мегабитные скорости - ИМХО уарт не для этого был разработан... Изменено 8 февраля, 2016 пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 8 февраля, 2016 Опубликовано 8 февраля, 2016 · Жалоба ЗЫ. Вообще посмотрел соседнюю тему, товарищ Огурцов вообще интересными вещами занимается, например, езернет без мак контроллера, по спи... Так что 10 мег по уарту уже не удивляет :laughing: Не занимается, а есть к русском языке хорошее слово - мается. Он еще на 100% умолчал, что ему все это "нужно" в количестве 999 точек на 9999 метров. В общем в обычном своем стиле :( писать что попало. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
evgen2 0 8 февраля, 2016 Опубликовано 8 февраля, 2016 (изменено) · Жалоба А что именно вызывает затруднения? Поставить бит в 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); } Изменено 8 февраля, 2016 пользователем evgen2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VCucumber 0 8 февраля, 2016 Опубликовано 8 февраля, 2016 (изменено) · Жалоба Разогнал нет, затормозил 10 мег по уарту не только 10, в не самом бюджетном камне от 40..50 до 100 должно ещё тут недавно тема была, про нейросети, точнее про сотни бюджетных камней на одной плате, как им общаться ? если нужен эзернет нам такой футбол не нужен http://electronix.ru/forum/index.php?showt...t&p=1402440 ИМХО уарт не для этого был разработан... а для чего ? а для чего был телефон придуман, для adsl, наверно ? Изменено 8 февраля, 2016 пользователем Огурцов Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 8 февраля, 2016 Опубликовано 8 февраля, 2016 · Жалоба Зачем мне для передачи из памяти в uart ставить бит в SSP.DMACR ? нелогично вроде. Кстати, SSP.DMACR - read/write регистр, а UnFCR, куда нужно писать соответствующие биты для DMA - write only, что придает некоторую сексуальность в сравнении "тут работает, тут не работает". Фу-ты - конечно UART.FCR. Просто думал параллельно об SSP. ... 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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
evgen2 0 8 февраля, 2016 Опубликовано 8 февраля, 2016 · Жалоба Вот моя инициализация 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 байт) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться