Page 1 of 1

RMT transmission synchronization to input pin state

Posted: Thu Jan 04, 2024 9:10 am
by Captain.Chode
I have a 125 kbit/sec multi-master bus. It takes 8 microseconds to transfer 1 bit. The initial state of the bus is high. In order to transmit a message we need to listen on the bus and if there were no low state on the bus for 16*8 microseconds then we can start transmitting. This might be solved by installing an interrupt on my RX pin and start a timer. But the problem is that I need to stop the transmission immediately when I detect a mismatch on the state of the TX and RX pins (basically when I receive a 0 but I just sent 1). Because that means that another peripheral is started sending in the meanwhile (0 is a dominant state over 1). How is it possible with the RMT peripheral?

Re: RMT transmission synchronization to input pin state

Posted: Thu Jan 04, 2024 5:24 pm
by Captain.Chode
EDIT: the following text was a reply for an answer which has been deleted. The user was registered after I opened my topic, and the answer was very ChatGPT-like (it cited the api reference in a slightly modified way)

Can you show me an example how to set up detecting a mismatch?

The api reference is talking about loop count, but nothing about a condition on when to stop the transmit: https://docs.espressif.com/projects/esp ... ransaction

The technical reference manual states this on page 402:
The data structure in RAM is shown in Figure 15-2. Each 32-bit value contains two 16-bit entries, with two fields
in every entry, ”level” and ”period”. ”Level” indicates whether a high-/low-level value was received or is going to be
sent, while ”period” points out the divider-clock cycles for which the level lasts. A zero period is interpreted as an
end-marker: the transmitter will stop transmitting once it has read this, and the receiver will write this, once it has
detected that the signal it received has gone idle.
So it says that it stops transmitting when the period is set to 0. Again, nothing about conditional stop.

As I said I would like to stop is the transmit part not the receive part (what you seem to referring to)

I am afraid it can't be done because as I understand I send data to the RMT like this:
the line is 0 for 8us,
the line is 1 for 24us,
the line is 0 for 8us,
the line is 1 for 8us.

And I might want to stop the transmission in the middle of the data.

See the picture below: We want to transmit -8, 24, -8, 8 but on the input pin we need to detect at 8+16us (basically at the 3rd bit - remember I said one bit is 8us long) that the line went low in the meanwhile (someone else also started transmitting) so we drop the rest of the data to be transmitted (stop immediately)
collision.jpg
collision.jpg (20.79 KiB) Viewed 5341 times

Re: RMT transmission synchronization to input pin state

Posted: Fri Jan 05, 2024 9:34 am
by ESP_Sprite
Captain.Chode wrote:
Thu Jan 04, 2024 5:24 pm
EDIT: the following text was a reply for an answer which has been deleted. The user was registered after I opened my topic, and the answer was very ChatGPT-like (it cited the api reference in a slightly modified way)
Yep, user was a spammer; they later edited a spam-link into the post.

Re: RMT transmission synchronization to input pin state

Posted: Fri Jan 05, 2024 12:28 pm
by MicroController
Maybe check if the "collision detection" feature of the UART in RS485 mode would work for your case.