การ Interface กับ Serial Port (Part V)

วันที่โพสต์: Oct 03, 2010 3:12:47 PM

การ Interface กับ Serial Port (Part V)

Interrupt Identification Register (IIR)

IIR เป็น register แบบ read only เราไม่สามารถเขียนเข้าไปได้ Table 8. ข้างล่างแสดงถึงหน้าที่ของ bit ต่าง ๆ ใน register นี้

Table 8. Interrupt Identification Register.

 

Bit6 และ bit7 เป็นตัวบอกสภาวะของ FIFO buffer เมื่อทั้ง 2 bit มีค่าเป็น “0” แสดงว่าไม่มี FIFO buffer ที่ active อยู่ ซึ่ง UART เบอร์ 8250 และ 16450 จะเป็นกรณีนี้ได้เพียงกรณีเดียวเท่านั้น ไม่สามารถเป็นอย่างอื่นได้ ถ้า bit7 มีค่าเป็น “1” แต่ bit6 มีค่าเป็น “0” มีความหมายว่า FIFO buffer ได้ถูก enable แต่ไม่ทำงาน ซึ่งเกิดในกรณีของ UART เบอร์ 16550 เพราะมีข้อผิดพลาด(bug)ในตัวมัน จึงต้องมีการแก้ไขและเปลี่ยนมาเป็นเบอร์ 16550A และถ้าทั้ง bit7 กับ bit6 มีค่าเป็น “1” แสดงว่ามี FIFO buffer อยู่และใช้งานได้อย่างสมบูรณ์ สำหรับ bit4 และ bit5 สำรองไว้ไม่ได้ใช้งาน ส่วน bit3 เป็นตัวแสดงสภาวะของ time-out interrupt ของ UART ตั้งแต่เบอร์ 16550 ขึ้นไป bit0 เป็นตัวบอกว่ามี interrupt เกิดขึ้นหรือไม่ ถ้ามี interrupt เกิดขึ้น bit1 และ bit2 จะเป็นตัวบอกว่าเป็น interrupt ของอะไรตามลำดับความสำคัญ(priority) โดย line status interrupt จะมี priority สูงสุด และ modem status interrupt จะมี priority ต่ำสุด

First In/First Out Control Register (FCR)

Table 9. แสดงรายละเอียดของ FIFO Control Register

Table 9. FIFO Control Register.

 

FIFO Control Register เป็นชนิด write only และจะใช้ควบคุม FIFO buffers ซึ่งมีใน UART เบอร์ 16550 ขึ้นไปเท่านั้น

Bit 0 เป็นตัว enable ให้ FIFO buffer ของทั้ง Tx และ Rx ให้ทำงาน ถ้าสั่งให้ Bit นี้มีค่าเป็น “0” จะทำให้ disable ตัว FIFO buffer ของทั้ง Tx และ Rx และทำให้ข้อมูลที่อยู่ใน FIFO buffers ทั้ง 2 สูญหายไป

Bit 1 และ 2 ควบคุมการ clear ข้อมูลใน FIFO buffer ของ Tx หรือ Rx แต่จะไม่เกี่ยวกับ shift registers และเมื่อสั่งให้มีค่าเป็น “1” เพื่อ Clear ข้อมูลใน FIFO buffer แล้วมันจะกลับเป็น “0” เองหลังจากได้ clear ข้อมูลใน FIFO buffer แล้ว

Bit 3 เป็นตัว enable ตัว DMA Mode Select ซึ่งมีใน UART เบอร์ 16550 ขึ้นไปและจะกล่าวถึงภายหลัง ส่วน Bit 4 และ 5 ไม่ได้ใช้จึง Reserved ไว้

Bit 6 และ 7 ใช้กำหนด triggering level ของ Receiver FIFO buffer เช่น ถ้ากำหนดให้ Bit 7 มีค่าเป็น “1” และ Bit 6 มีค่าเป็น “0” จะเป็นการกำหนดให้ FIFO buffer มีขนาด 8 bytes และเมื่อมีข้อมูลเข้ามาใน FIFO buffer ได้ 8 bytes จะทำให้ Received Data Available Interrupt ทำงาน (ดูรายละเอียดในเรื่อง IIR ประกอบ)

Line Control Register (LCR)

Table 10. แสดงรายละเอียดของ Line Control Register.

Table 10. Line Control Register.

หมายเหตุ X = Don’t care

Line Control Register เป็นตัวกำหนด Parameter พื้นฐานของการสื่อสาร

bit 7 เป็น DLAB (ดูหัวข้อเกี่ยวกับ DLAB ประกอบ)

bit 6 เป็นตัวกำหนด break enable ถ้ามีค่าเป็น “1” จะทำให้สัญญาณ TD มีสถานะเป็น “space” ทำให้ UART ที่ได้รับสัญญาณเกิดการ break ถ้า bit 6 นี้มีค่าเป็น “0” จะไม่มีการ break

bit 3, 4 และ 5 เป็นตัวกำหนด parity bit ถ้าสังเกตให้ดีจะเห็นว่า bit 3 เป็นตัวกำหนดการใช้หรือไม่ใช้ parity เพราะถ้า bit 3 มีค่าเป็น “0” จะไม่ใช้ parity แต่ถ้า bit 3 มีค่าเป็น “1” จะใช้ parity จากนั้นมาดูที่ bit 5 จะเห็นว่าถ้า bit 5 มีค่าเป็น “1” มันจะควบคุมเป็น sticky parity คือมันจะส่งค่าของ parity bit คงที่ตายตัวเช่นถ้า bit 4 เป็น “0” จะทำให้มีการส่ง parity bit เป็น “1” หรือ “high” ตลอด ไม่ว่าข้อมูลจะมี bit pattern เป็นอย่างไรก็ไม่เกี่ยว ดังนั้นถ้ามี error ในการส่งข้อมูลตัว parity bit ก็ยังคงส่งค่าเดิมที่ตั้งไว้คือ “1” หรือ “high” ซึ่งไม่มีประโยชน์ในการตรวจสอบความถูกต้องของข้อมูล แต่จะใช้ในเหตุผลอื่นเช่น เป็นตัวบอก Rx ว่าสิ่งที่รับได้น่าจะเป็นข้อมูลหรือเป็นสัญญาณรบกวน โดยการตรวจสอบที่ parity bit เป็นต้น ซึ่งมักจะใช้กับระบบที่ความถูกต้องของข้อมูลไม่ใช่สาระสำคัญมากนัก เพราะอาจจะมีกระบวนการหรือกลไกอื่นที่ช่วยในการกลั่นกรองเช่น ใช้วิธีหาค่าเฉลี่ยจากค่าสะสมหลาย ๆ ค่า หรือมีค่าเป็นช่วงจำกัดให้เปรียบเทียบ หรือระบบไม่ต้องการค่าที่ละเอียดถูกต้องนัก หรือถึงจะผิดพลาดก็ไม่ได้ก่อให้เกิดความเสียหายอะไรมากนักเป็นต้น แต่ต้องการรู้ว่าสิ่งที่รับได้น่าจะเป็นข้อมูลหรือไม่มากกว่า เพื่อไม่เอาค่าจากสัญญาณรบกวนไปประมวลผล ซึ่งเป็นการกลั่นกรองระดับหนึ่ง เพิ่มเติมจากการตรวจ start bit และ stop bit และถ้า bit 5 เป็น “0” จะปลดจาก sticky คือค่า parity bit จะแปรเปลี่ยนไปตามข้อมูลเช่นถ้า bit 4 เป็น “0” ก็จะเป็น odd parity หมายความว่า parity bit จะมีค่าเป็น “1” หรือ “0” ขึ้นอยู่กับจำนวน “1” ในข้อมูลเมื่อรวมกับ parity bit แล้วต้องมีจำนวนเป็นคี่ เป็นต้น ซึ่งช่วยตรวจความถูกต้องของข้อมูลได้ดีขึ้นระดับหนึ่ง เพราะขณะที่ข้อมูลมาถึง Rx หากมีการเปลี่ยนค่าไปหนึ่ง bit ก็สามารถตรวจพบว่า parity ผิด แต่ถ้าผิดไปสอง bit ก็จะไม่สามารถตรวจได้เพราะ parity ถูก ดังนั้นในการสื่อสารจึงพยายามหาวิธีที่ดีขึ้นในการตรวจและแก้ไขความผิดพลาด (error detection and correction) เช่นการใช้ cyclic redundancy check (CRC) ซึ่งใช้การคำนวณเข้ามาช่วย (จะไม่กล่าวถึงรายละเอียดในที่นี้)

bit 2 เป็นตัวกำหนดจำนวนของ stop bit ถ้า bit 2 มีค่าเป็น “0” จะกำหนดให้มีเพียง 1 stop bit แต่ถ้า bit 2 มีค่าเป็น “1” จำนวน stop bit จะขึ้นอยู่กับขนาดของ word length โดย bit 0 และ bit 1 จะเป็นตัวกำหนดขนาดของ word length อีกทีหนึ่ง ปรกติทาง Rx จะตรวจสอบเพียง bit แรกของ stop bit เท่านั้น

มีคำถามว่า ทำไมจึงต้องมีจำนวน stop bit ต่างกัน ฝากไว้ให้คิดเป็นการบ้านด้วย