pvvx
Активный участник сообщества
И ещё с UART в TLSR8266.
DMA к UART привязано через некую китайскую "фичу". Это для мягкости выражения. Да и сам контроллер UART имеет ещё "фичи" - типа FIFO в 4 байта, в одном 32-х битном регистре. В этот регистр входные биты (RX) укладываются как в кольцевой буфер, с выработкой побайтного сигнала прерываний. Биты в принимаемых байтах в нем живые – сдвигаются по мере поступления и если считать байт до сигнала готовности, то получите неполные и сдвигаемые биты текущего принимаемого байта
Т.е. при работе по прерываниям с UART имеем 3 байта FIFO и 4-й - текущий неполноценный = задвигаемый в данный момент и всё более менее.
Но вот с DMA…
DMA задается тупо – просто считывает этот регистр в 32 бита по назначенному счетчику тиков у UART и кладет куда указано.
Если межсимвольный интервал на RX UART не равен нулю или не совпадает с тактом считывания DMA, то в буфере DMA получаем “незрелые входные байты” (с). Такова китай-фича у TLSR8266 c UART.
Для нормальной работы UART-DMA у TLSR8266 требуется передача в RX пакета без межсимвольных разрывов. Это ограничивает область применимости RX-UART-DMA в TLSR8266.
PS: Так-же, к примеру, не все терминалы на PC умеют работать с обычным UART. Прошли десятилетия, но многие так и не научились...
К не умеющим можно отнести https://sites.google.com/site/terminalbpp/ и многие другие “ТЕРМИНАЛЫ”. Конкретно указанный “Терминалище!” не умеет и не правильно выставляет межсимвольную паузу на TX. В среднем, от погоды(!), он ставит межсимвольную паузу в 1 ms, чем ограничивает трафик себе и создает проблемы для устройств отслеживающих размер блока по появлению межсимвольной паузы. Кроме межсимвольной паузы он ещё имеет стихийную задержку между блоками, возникающую от кратности сдвига Луны - размера буфера у дров UART…
Короче в помойку его и многие другие так горячо любимые в народе детсадовские программульки...
DMA к UART привязано через некую китайскую "фичу". Это для мягкости выражения. Да и сам контроллер UART имеет ещё "фичи" - типа FIFO в 4 байта, в одном 32-х битном регистре. В этот регистр входные биты (RX) укладываются как в кольцевой буфер, с выработкой побайтного сигнала прерываний. Биты в принимаемых байтах в нем живые – сдвигаются по мере поступления и если считать байт до сигнала готовности, то получите неполные и сдвигаемые биты текущего принимаемого байта
Т.е. при работе по прерываниям с UART имеем 3 байта FIFO и 4-й - текущий неполноценный = задвигаемый в данный момент и всё более менее.
Но вот с DMA…
DMA задается тупо – просто считывает этот регистр в 32 бита по назначенному счетчику тиков у UART и кладет куда указано.
Если межсимвольный интервал на RX UART не равен нулю или не совпадает с тактом считывания DMA, то в буфере DMA получаем “незрелые входные байты” (с). Такова китай-фича у TLSR8266 c UART.
Для нормальной работы UART-DMA у TLSR8266 требуется передача в RX пакета без межсимвольных разрывов. Это ограничивает область применимости RX-UART-DMA в TLSR8266.
PS: Так-же, к примеру, не все терминалы на PC умеют работать с обычным UART. Прошли десятилетия, но многие так и не научились...
К не умеющим можно отнести https://sites.google.com/site/terminalbpp/ и многие другие “ТЕРМИНАЛЫ”. Конкретно указанный “Терминалище!” не умеет и не правильно выставляет межсимвольную паузу на TX. В среднем, от погоды(!), он ставит межсимвольную паузу в 1 ms, чем ограничивает трафик себе и создает проблемы для устройств отслеживающих размер блока по появлению межсимвольной паузы. Кроме межсимвольной паузы он ещё имеет стихийную задержку между блоками, возникающую от кратности сдвига Луны - размера буфера у дров UART…
Короче в помойку его и многие другие так горячо любимые в народе детсадовские программульки...