İletişim bir kerede bir yönde ise (yani yarı çift yönlü iletişim) yapabileceğiniz düzgün bir hile vardır. Her iki taraf da aynı anda (tam dubleks) konuşursa işe yaramaz, ancak tipik "bunu yap" "tamam işte yanıt" "şimdi bunu yap" "tamam işte yeni yanıt" iletişim türü oldukça iyi çalışıyor.
UART bağlantısı lojik yüksek (1) seviyede vericinin boşta durumunu kullandığından, 2 girişli bir AND geçidi kullanır ve TX'i her iki taraftan bir AND girişine bağlarsınız. AND geçidinin çıkışı, dinleyicinizin UART'ına (RX pinidir) girişinizdir. Şimdi cihaz B'nin TX hattını alın ve ayrıca sniffer üzerindeki bir G / Ç bağlantı noktasına getirin. Sniffer'ı, bu pim yüksekten düşüğe doğru bir kesme oluşturacak şekilde yapılandıracaksınız.
Özetlemek gerekirse: cihaz A UART TX -> AND geçit girişi. Cihaz B UART TX -> diğer AND geçidi girişi VE sniffer GPIO pimi. AND geçidi -> sniffer UART RX hattının çıkışı.
UART iletişimleri bir başlangıç biti, bazı sayıda veri biti, isteğe bağlı eşlik biti ve bir veya daha fazla durdurma bitinden oluşur. Rölanti durumu bir mantık yüksek (1) olduğundan, HER baytın başlangıcı bir mantık düşük (0) olacaktır ve dinleyicinin kesilmesi tetiklenir. Sniffer I / O kesintisini yürütürken, UART donanımı AND geçidinden bitler toplayacaktır. UART durdurma bitini aldığında, G / Ç kesmesi uzun sürecek ve UART RX kesmesi tetiklenecektir.
IO-değişim kesintisi rutini, iletişimin "B-> A" yönünde olduğunu göstermek için bir "yön" değişkeni ayarlayacaktır. Sniffer'ın UART alma kesmesi bu "yön" değişkenine bakar ve yeni alınan baytı uygun tampona yazar. UART RX kesmesi, "yön" değişkenini varsayılan "A-> B" durumuna geri döndürür:
volatile int direction = 0; /* 0 = A -> B */
void io_interrupt(void)
{
direction = 1; /* switch direction, now B -> A */
}
void uart_interrupt(void)
{
unsigned char b;
b = UART_RX_REG;
if(direction) {
store_byte_to_device_b_sniff_buffer(b);
} else {
store_byte_to_device_a_sniff_buffer(b);
}
direction = 0; /* reset direction to default A -> B */
}
Bu kod, açık bir şekilde yazılmıştır ve gerçek dünyadaki bir durumda yazacağınız şey değildir. Şahsen uygun FIFO yapısına bir "yön" gösterirdim, ama bu tamamen başka bir alıştırma. :-)
A cihazı konuşurken G / Ç hattı hareket etmiyor (cihaz B'nin UART vericisi boşta olduğu için '1' mantığında kalıyor) ve UART RX kesmesi bir bayt alacak, yönün A-> B olduğunu görün ve verileri bu arabelleğe depolar. B cihazı konuşurken, B cihazı veri kaydırmaya başlar başlamaz G / Ç hattı azalır ve G / Ç kesme rutini B cihazının konuştuğunu göstermek için yönü ayarlar. UART RX kesmesi sonunda tüm bitler toplandıktan sonra tetiklenir ve G / Ç kesmesi yön kaydının uygun şekilde ayarlanmasını sağladığından, alınan bayt doğru tamponda saklanır.
Presto: Snifferde tek bir UART ve G / Ç hattı ile yakalanan iki cihaz arasında, bitlerle vurulmuş UART iletişimi olmadan yarı çift yönlü iletişim.