You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
In my project I tested several method to make duplex communication. But for some reasons, they are all imperfect.
FYI,
Rate: 1Mbps
Power: Max
Length: dynamic
(fill here later)
TX-RX swapping
I pulled down CE when switching mode
Seq#
Device 1
Device 2
Comment
0
Configure as PRX
Configure as PRX
Initialize
1
Configure as PTX
Device 1 wants to send message to Device 2
2
Write TX payload, then pulse CE
3
TX_DS
RX_DR
4
Return RX mode
Enter TX mode
Device 2 sends responses
5
Write TX payload, then pulse CE
6
RX_DR
TX_DS
7
Return RX mode
In my case, this schema works. But once I burst some packets from device 1 to device 2, the connection breaks. Even if the traffic is pretty low (1 packet per second), the communication does not last ever.
The reason was that, the device 1 failed to initiate the communication. In phase 3, device 1 receives MAX_RT because the packet was not transmitted successfully.
My guess is, the phase 4 and phase 7 may fail unpredictably. I have periodically fetched the config register and found that the during these phases, the device stays in PTX longer than I expected (maybe more than 5 seconds).
Ack with payload
In this mode I decide to make the device 2 as slave, which will only respond to device 1 but never initiate the session.
Seq#
Device 1
Device 2
Comment
0
Configure as PTX
Configure as PRX
Initialize
1
Configure as PTX
Device 1 wants to send message to Device 2
2
Write TX payload, then pulse CE
3
TX_DS
RX_DR
4
Prepare something and send to ACK_PAYLOAD
See *
5
RX_DR
TX_DS
In documentation, it is recommended to prepare the packet BEFORE RX_DR. However, I found if I write the payload in time (direct respond in ISR), it still works.
In this case, something bad may happen in phase 4-5. I tracked the FIFO_STATUS register. Ideally, after each cycle, the FIFO_STATUS of device 2 should be 0x11 (TX empty, RX empty). However, when it goes down, the status is 0x01 (TX not empty). I guess the device 1 fails to get to RX (internally) to get the returned packet.
I suspect my boards are fake (hardware malfunction); If there is someone can give an example, that can ping-pong in high frequency (~10 packets / second) while being stable for long time (hours).
Thank you
The text was updated successfully, but these errors were encountered:
In my project I tested several method to make duplex communication. But for some reasons, they are all imperfect.
FYI,
TX-RX swapping
In my case, this schema works. But once I burst some packets from device 1 to device 2, the connection breaks. Even if the traffic is pretty low (1 packet per second), the communication does not last ever.
The reason was that, the device 1 failed to initiate the communication. In phase 3, device 1 receives MAX_RT because the packet was not transmitted successfully.
My guess is, the phase 4 and phase 7 may fail unpredictably. I have periodically fetched the config register and found that the during these phases, the device stays in PTX longer than I expected (maybe more than 5 seconds).
Ack with payload
In this mode I decide to make the device 2 as slave, which will only respond to device 1 but never initiate the session.
In this case, something bad may happen in phase 4-5. I tracked the FIFO_STATUS register. Ideally, after each cycle, the FIFO_STATUS of device 2 should be 0x11 (TX empty, RX empty). However, when it goes down, the status is 0x01 (TX not empty). I guess the device 1 fails to get to RX (internally) to get the returned packet.
I suspect my boards are fake (hardware malfunction); If there is someone can give an example, that can ping-pong in high frequency (~10 packets / second) while being stable for long time (hours).
Thank you
The text was updated successfully, but these errors were encountered: