-
-
Notifications
You must be signed in to change notification settings - Fork 8.3k
esp32/machine_uart: Change sendbreak()
implementation to simply pull the pin low for the break period
#17698
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
esp32/machine_uart: Change sendbreak()
implementation to simply pull the pin low for the break period
#17698
Conversation
@hmaerki FYI this should fix the final issue with octoprobe/testbed_micropython#36 |
Codecov ReportAll modified and coverable lines are covered by tests ✅
Additional details and impacted files@@ Coverage Diff @@
## master #17698 +/- ##
=======================================
Coverage 98.37% 98.37%
=======================================
Files 171 171
Lines 22210 22210
=======================================
Hits 21849 21849
Misses 361 361 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
There is a testrun against this PR: https://reports.octoprobe.org/github_selfhosted_testrun_189/octoprobe_summary_report.html Please merge this PR. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks like a good improvement.
The only practical difference I can think of between doing it this way and using the UART HAL break function is that the break signal length will be exact if the peripheral hardware generates it whereas mp_hal_delay_us
may delay longer than break_delay_us
due to interrupts or a context switch. However, as the UART break signal is defined as a minimum pulse length this doesn't seem like a problem for correctness.
Yes, that's also my understanding, that the break is a minimum low pulse, so it's OK for it to be longer than 13 bits. |
741d38b
to
47db522
Compare
Currently, `UART.sendbreak()` on esp32 will reconfigure the UART to a slower baudrate and send out a null byte, to synthesise a break condition. That's not great because it changes the baudrate of the RX path as well, which could miss incoming bytes while sending the break. This commit changes the sendbreak implementation to just reconfigure the TX pin as GPIO in output mode, and hold the pin low for the required duration. Signed-off-by: Damien George <damien@micropython.org>
This is no longer needed, the esp32 port can now pass this test using just a single UART. Signed-off-by: Damien George <damien@micropython.org>
47db522
to
1ab1f85
Compare
Summary
Currently,
UART.sendbreak()
on esp32 will reconfigure the UART to a slower baudrate and send out a null byte, to synthesise a break condition. That's not great because it changes the baudrate of the RX path as well, which could miss incoming bytes while sending the break.This PR changes the sendbreak implementation to just reconfigure the TX pin as GPIO in output mode, and hold the pin low for the required duration.
Testing
Existing test is updated (simplified) and works well on ESP32_GENERIC.
Also tested that RPI_PICO_W still passes this test.
Trade-offs and Alternatives
There's
uart_write_bytes_with_break()
but that requires at least 1 byte to be sent before the break, so we can't use that.There's also the lower level
uart_hal_tx_break()
but I'm not sure how to use that properly in conjunction with the higher level driver.