มีเคล็ดลับเรียบร้อยที่คุณสามารถทำได้หากการสื่อสารเป็นไปในทิศทางเดียวเท่านั้นในแต่ละครั้ง (เช่นการสื่อสารแบบ half-duplex) มันจะไม่ทำงานถ้าทั้งสองฝ่ายคุยกันในเวลาเดียวกัน (full duplex) แต่ถ้าเป็นเรื่องปกติของคุณ "ทำสิ่งนี้" "ตกลงนี่คือคำตอบ" "ตอนนี้ทำสิ่งนี้" "ตกลงนี่คือการตอบสนองใหม่" ประเภทการสื่อสาร มันใช้งานได้ค่อนข้างดี
เนื่องจากลิงก์ UART ใช้สภาพที่ไม่ได้ใช้งานของเครื่องส่งสัญญาณในระดับตรรกะสูง (1) คุณจะต้องใช้ 2-input AND gate และเชื่อมต่อ TX จากแต่ละด้านเข้ากับ AND ผลลัพธ์ของเกท AND คืออินพุตของคุณไปยัง UART ของดมกลิ่น (คือ RX pin) ตอนนี้ใช้สาย TX ของอุปกรณ์ B และนำไปยังพอร์ต I / O บนดมกลิ่น คุณจะกำหนดค่าดมกลิ่นเพื่อสร้างการขัดจังหวะเมื่อพินนี้ไปจากสูงไปต่ำ
ในการสรุป: อุปกรณ์ A UART TX -> AND อินพุตเกต อุปกรณ์ B UART TX -> อื่น ๆ และอินพุตเกทและดมกลิ่น GPIO เอาต์พุตของ AND gate -> บรรทัดดมกลิ่น UART RX
การสื่อสาร UART ประกอบด้วยบิตเริ่มต้นบิตข้อมูลจำนวนหนึ่งบิตพาริตี้เสริมและบิตหยุดหนึ่งบิตขึ้นไป เนื่องจากสถานะว่างเป็นลอจิกสูง (1) การเริ่มต้นของทุก ๆ ไบต์จะเป็นลอจิกต่ำ (0) และการขัดจังหวะบนดมกลิ่นจะเริ่มขึ้น ในขณะที่ดมกลิ่นของคุณกำลังดำเนินการขัดจังหวะ I / O ฮาร์ดแวร์ UART จะรวบรวมบิตจากประตูและ เมื่อถึงเวลาที่ UART ได้รับบิตหยุดการขัดจังหวะ I / O จะเสร็จสิ้นนานและการขัดจังหวะโดย UART RX จะเริ่มขึ้น
รูทีน interrupt-on-IO-change จะตั้งค่าตัวแปร "direction" เพื่อระบุว่าการสื่อสารอยู่ในทิศทาง "B-> A" UART ของ sniffer ที่ได้รับอินเตอร์รัปต์จะดูที่ตัวแปร "direction" นี้และเขียนไบต์ที่เพิ่งได้รับไปยังบัฟเฟอร์ที่เหมาะสม การขัดจังหวะ UART RX จะตั้งค่าตัวแปร "direction" กลับไปเป็นสถานะ "A-> B" เริ่มต้น:
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 */
}
รหัสนี้เขียนขึ้นเพื่อความชัดเจนและไม่จำเป็นต้องเป็นสิ่งที่คุณเขียนในสถานการณ์จริง โดยส่วนตัวแล้วฉันจะ "ชี้" ตัวชี้ไปยังโครงสร้าง FIFO ที่เหมาะสม แต่นั่นเป็นการออกกำลังกายอื่นทั้งหมด :-)
เมื่ออุปกรณ์ A กำลังพูดสาย I / O ไม่ขยับ (มันยังคงอยู่ที่ตรรกะ '1' เนื่องจากอุปกรณ์ส่งสัญญาณ UART ของอุปกรณ์ B ไม่ได้ใช้งาน) และการขัดจังหวะ UART RX จะได้รับไบต์ดูว่าทิศทางคือ A-> B และเก็บข้อมูลไว้ในบัฟเฟอร์นั้น เมื่ออุปกรณ์ B กำลังพูดสาย I / O จะลดลงทันทีที่อุปกรณ์ B เริ่มขยับข้อมูลออกและรูทีนการขัดจังหวะ I / O จะกำหนดทิศทางเพื่อระบุว่าอุปกรณ์ B กำลังพูดถึง การขัดจังหวะของ UART RX จะเริ่มขึ้นในที่สุดหลังจากรวบรวมบิตทั้งหมดและเนื่องจาก I / O ขัดจังหวะได้รับการดูแลการตั้งค่าทิศทางการลงทะเบียนอย่างเหมาะสมไบต์ที่ได้รับจะถูกเก็บไว้ในบัฟเฟอร์ที่ถูกต้อง
Presto: การสื่อสารฮาล์ฟดูเพล็กซ์ระหว่างอุปกรณ์สองเครื่องที่จับด้วยสาย UART และ I / O เดี่ยวบนดมกลิ่นโดยไม่มีการสื่อสาร UART แบบกระแทกเล็กน้อย