Hardware Interfacing

  • ขอขอบคุณ บทความเรื่อง การ Interface กับ Serial Port ทั้ง 7 ตอน ของคุณ Moola (นามปากกาใน Electoday) ด้วยครับ 

ตารางสรุปการเชื่อมต่อแบบ Serial communication

โพสต์27 ธ.ค. 2554 20:25โดยวิสิทธิ์ แผ้วกระโทก   [ อัปเดต 18 ม.ค. 2557 07:31 ]

Hardware Interfacing

ตารางสรุปการเชื่อมต่อแบบ Serial communication




  1-Wire I2C SMBus SPI MicroWire/PLUS? M-Bus (EN1434) CAN (ISO11898) LIN Bus
Network Concept single master, multiple slaves multiple masters, multiple slaves multiple masters, multiple slaves single master, multiple slaves single master, multiple slaves single master, multiple slaves multiple masters, multiple slaves single master, multiple slaves
Number of Signal Lines 1 (IO) 2, (SCL, SDA) 2, (SMBCLK, SMBDAT) 4, (active-low CS, SI, SO, SCK) 4, (active-low CS, DI, DO, SK) 2 (lines can be swapped) 2 (CAN_H, CAN_L, terminated) 1 (LIN)
Optional signals N/A N/A SMBSUS#, SMBALERT# N/A N/A N/A 2nd GND, Power, Shield N/A
Network Size Up to 300 m (with suitable master circuit) Limited by max. 400pF bus capacitance requirement Limited by max. 400pF bus capacitance requirement N/A (circuit board level) N/A (circuit board level) Max. 350m per segment of max. 250 slaves; max. 180nF 40m @1M bps1000m @ 50k bps (example) Up to 40m, max. 10nF total load
Network Interface open drain, resistive or active master pull-up open drain, resistive or active master pull-up open drain, resistive or active master pull-up Push-pull with tristate Push-pull with tristate M to S: voltage drive
S to M: current load
Differential open drain/source or open coll./emitter open drain, resistive master pull-up
Network Voltage From 2.8 to 6.0 V, device specific From 1.8 to 5.5V, device specific 2.7V to 5.5V From 1.8V to 5.5V, device specific From 1.8V to 5.5V, device specific ~40V VDD-VD (diode drop); ~4.5V max. 8 to 18V
Logic Thresholds Vary with network voltage Fixed level: >1.5V, >3.0 V VDD-related level: <30%, >70% of VDD <0.8V, >2.1V VDD-related level: <20% (30%), >70% of VDD (inconsistent) Fixed level: <0.8V, >2.0V; VDD-related level: <20% (30%), >70% (80%) of VDD (inconsistent) Master to slave: 24V, 36V nominalSlave to master: <1.5mA, >11mA Differential: <50mV (recessive), >1.5V (dominant); driver specification VDD-related level: <20%, >80% of VDD (driver spec.)<40%, >60% of VDD (receiver spec.)
Transmission LS bit first, half-duplex MS bit first plus Acknowledge bit, half-duplex MS bit first plus Acknowledge bit, half-duplex MS bit first, full-duplex MS bit first, full-duplex LS bit first, half-duplex, acknowledge response MS bit first, half-duplex LS bit first, half-duplex
Address Format 56 bits 7 bits, (10 bits defined but not implemented) 7 bits, (10 bits defined but not implemented) N/A N/A 8 bits (primary address), 64 bits (secondary address) Message identifier 11 bits (standard format), 29 bits (extended format) Message identifier 8 bits, including 2 parity bits
Network Inventory Automatic, supports dynamic topology change N/A; slave addresses hard-coded in firmware ARP, Address Resolution Protocol (Rev. 2.0 only) N/A; slave select (active-low CS) hard-coded in firmware N/A; slave select (active-low CS) hard-coded in firmware Automatic N/A; message-based protocol, not address based N/A; message-based protocol, not address based
Gross Data Rate Standard: ~0 to 16.3k bps Overdrive: ~0 to 142k bps) Standard: ~0 to 100k bps; Fast: ~0 to 400k bps; High-Speed: ~0 to 3.4M bps 10k to 100k bps ~0 to ~10 M bps (device specific) ~0 to ~5 M bps (device specific) 300, 2400, 9600 bps ~0 to 1M bps ~1k to ~20k bps
Access Time Standard: ~ 5.4ms Overdrive: ~0.6ms (at maximum speed) Standard: ~95?sFast: ~23?s(at maximum speed) ~95?s @ 100k bps N/A N/A Primary address, 2400 bps: 13.75ms (short frame), 27.5ms (long frame) At 1M bps 19?s (standard) or 39?s (extended) from start of frame to 1st data bit At 20k bps 1.7ms from start of frame to 1st data bit
Data Protection 8-bit and 16-bit CRC N/A PEC Packet Error Code (Rev.1.1, 2.0) N/A N/A Even parity, check sum, frames 15-bit CRC, frames, frame acknowledge Check sum, frames
Collision Detection Yes, through non-matching CRC Yes (multi-master operation only) Yes (Rev. 2.0 only) N/A N/A Yes ("medium" and "strong" collisions) Yes: CSMA/CD Yes, through check sum
Slave supply Parasitic (typical), VDD (exception) VDD only VDD only VDD only VDD only Parasitic and/or local supply VDD only, local or remote source Parasitic only

แหล่งที่มา http://www.maxim-ic.com/app-notes/index.mvp/id/3438


สัญญาณ I2C

รายการหน้าเว็บย่อย

การติดต่อกับ Switch ON-OFF

โพสต์23 เม.ย. 2554 19:51โดยวิสิทธิ์ แผ้วกระโทก   [ อัปเดต 27 ก.ย. 2556 09:33 ]

การติดต่อกับ Switch ON-OFF

ในการติดต่อรับค่าจากสวิทช์ เพื่อให้ไมโครคอนโทรลเลอร์กระทำการบางอย่างให้เรา ในการต่อวงจรหากเราต้องการที่จะรับค่าสภาวะ ON-OFF จากการเปิด ปิด สวิทช์แล้ว เราสามารถที่จะต่อสวิทช์เข้ากับไมโครคอนโทรลเลอร์ โดยมีวงจรการเชื่อมต่อ 2 แบบ ให้เราเลือก ซึ่้งทั้งสองวงจรนี้ ในแง่ของอุปกรณ์แล้ว ใช้จำนวนอุปกรณ์เท่ากัน หรือเหมือนกัน แต่ลักษณะการต่อวงจรไม่เหมือนกัน และให้ค่าสัญญาณทางดิจิตอลต่างกัน


แบบที่ 1 การต่อแบบ Active High
ในการต่อแบบนี้ ในสภาวะที่หน้าสัมพัส ของสวิทช์ไม่ได้เชื่อมต่อกัน หรือสวิทช์ไม่ได้ถูกกดไว้ ทางฝั่งไมโครคอนโทรลเลอร์จะได้รับสภาวะ เป็น LOW หรือเป็น Logic 0 แต่เมื่อสวิทช์ถูกกระตุ้น หรือหน้าสัมพัสของสวิทช์ เชื่อมต่อกัน จะทำให้เกิดกระแสไฟฟ้าไหล และเกิดแรงดันที่ขาอินพุต ของไมโครคอนโทรลเลอร์ ทำให้ที่ขาของไมโครคอนโทรลเลอร์ได้รับสภาวะเป็น High หรือเป็น Logic 1



แบบที่ 2 การต่อแบบ Active Low
ในการต่อวงจรแบบนี้ ตำแหน่งของสวิทช์จะตรงกันข้ามกับการต่อแบบแรก ที่ขาอินพุตของไมโครคอนโทรลเลอร์จะได้รับสภาวะตรงกันข้ามกับแบบแรก คือ เมื่อสวิทช์ไม่ได้รับการกระตุ้น หรือหน้าสัมพัสยังไม่ได้สัมพัสกันนั้น ที่ขาอินพุตของไมโครคอนโทรลเลอร์จะได้รับสภาวะ High หรือ Logic 1 แต่เมื่อสวิทช์ได้รับการกระตุ้น หรือหน้าสัมผัสเชื่อมต่อกันแล้ว จะทำกระแสจากที่เคยไหลเข้าไมโครคอนโทรลเลอร์ ไหลลงไปที่ตำแหน่งกราวด์แทน ทำให้ที่ขาอินพุตของไมโครคอนโทรลเลอร์ได้รับสภาวะ Low หรือ Logic 0


วิธีการจดจำง่ายๆ ก็คือ

ถ้าต่อ Switch แบบ Active High เราต้องต่อ R pull down ที่ขาไมโครคอนโทรลเลอร์
ถ้าต่อ Switch แบบ Active Low เราต้องต่อ R pull up  ที่ขาไมโครคอนโทรลเลอร์

      ในการนำไปใช้ เราสามารถเลือกที่จะต่อแบบ Active Low หรือว่า Active High ก็ได้ แต่ในการเขียนโค๊ดที่ไมโครคอนโทรลเลอร์ เราจะต้องเขียนโค๊ดให้สัมพันธ์กับวงจรที่เราต่อด้วย
ตัวอย่างการนำไปใช้งาน

// Complier : PIC CCS C complie V4.106
// MCU       : PIC18F458
// By        : Mr.P


#include <18F458.h>

#define CRYSTAL 20000000 //crystal 20MHz
#fuses HS
#fuses NOLVP,NOWDT
#fuses NOPROTECT
#use delay(clock=CRYSTAL)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)



void main(void)
{
   set_tris_b(0xff);
   set_tris_a(0x00);
  
   while(TRUE)
   {
      output_low(PIN_A0);
      output_low(PIN_A1);

      if(!input(PIN_B0))  // Active Low
      {
         delay_ms(100);
         output_high(PIN_A0);
         delay_ms(1000);
      }
      if(input(PIN_B1))   // Active High
      {
         delay_ms(100);
         output_high(PIN_A1);
         delay_ms(1000);
      }

   }
}




รายการหน้าเว็บย่อย



การติดต่อสื่อสารด้วย SPI : Serial Peripheral Interface

โพสต์1 เม.ย. 2554 20:13โดยวิสิทธิ์ แผ้วกระโทก   [ อัปเดต 18 ม.ค. 2557 07:23 ]

Hardware Interfacing

การติดต่อสื่อสารด้วย SPI : Serial Peripheral Interface

ภาพรวมของ SPI 
SPI หรือ Serial Peripheral Interface เป็นวิธีการสื่อสารรูปแบบหนึ่ง ที่ใช้ในการติดต่อสื่อสารกับอุปกรณ์ ตัวอย่างเช่น พริ้นเตอร์ กล้องถ่ายรูป เครื่องสแกนเนอร์ และอื่นๆ อีกมามาย ถึงแม้ว่าการสื่อสารของ USB ที่มีฟังก์ชั่นการทำงานที่กว้างกว่า แต่การสื่อสารในรูปแบบ SPI ก็ยังถูกใช้งานกันอยู่ในบาง Application 

SPI ทำงานในรูปแบบที่ให้อุปกรณ์ตัวหนึ่งทำหน้าที่เป็น  MASTER ในขณะที่อีกตัวหนึ่งทำหน้าที่เป็น SLAVE และส่งข้อมูลในโหมด Full-duplex นั่นหมายความว่า สัญญาณสามารถส่งหากันได้ระหว่าง MASTER และ SLAVE ได้อย่างต่อเนื่อง ในการสื่อสารแบบ SPI นี้ ไม่ได้มาตรฐานกำหนดตายตัว ว่าข้อมูลที่ส่งหากันต้องอยู่ในรูปแบบหรือ format แบบไหน เป็นการคิด protocol การสื่อสารกันเอาเอง 

อุปกรณ์ที่ยังคงมีการใช้การสื่อสารแบบ SPI อยู่ 
  • การแปลงข้อมูลจาก Analog to Digital หรือจาก Digital to Analog
  • การติดต่อกับหน่วยความจำ EEPROM และ FLASH 
  • ไอซีประเภท Real Time Clock : RTC
  • เซ็นเซอร์ จำพวก Temperature sensor , Pressure sensor 
  • อื่น ๆ เช่น signal mixer , Potentiometer , LCD controller , USART , CAN controller , USB controller , Amplifier 
พื้นฐานการทำงาน 
SPI ต้องการสายสัญญาณ สี่เส้น บางครั้งเราเรียกว่าบัสอนุกรม "four wire" เส้นสัญญาณทั้่งสี่เส้น ได้แก่ 

Line Name Description
SCLK Serial Clock Output from master
MOSI/SIMO Master Output, Slave Input Output from master
MISO/SOMI Master Input, Slave Output Output from slave
SS Slave Select Output from master (active low)

ที่เราเรียกว่า master ก็เพราะว่า ตัวที่เป็นมาสเตอร์ ทำหน้าที่เป็นตัวควบคุมการสื่้อสารทั้งหมด โดยควบคุมการสื่อสารตามสัญญาณนาฬิกา ตัวมาสเตอร์จะเป็นตัวที่ตัดสินใจ รับ หรือ ส่งข้อมูล ภายในการสื่อสาร จะเป็นการสื่อสารแบบ full duplex ในการนำส่งข้อมูล  

เราใช้ สัญญาณเส้น SS หรือ Slave select ในกรณี ที่เรามีตัว slave มากกว่า 1 ตัว โดยการทำให้เส้น SS มีระดับสัญญาณเป็น Low เมื่อต้องการติดต่อกับ Slave ตัวใด จากรูปด้านล่างหากเราต้องการติดต่อสื่อสารกับ Slave ตัวใด ก็เพียงทำให้สัญญาณ SS ของ Slave ตัวนั้น มีระดับสัญญาณเป็น Low 



รูปวงจรการต่อมาสเตอร์ 1 ตัวกับ สลาฟ 3 ตัว 

โค๊ดตัวอย่างการนำไปใช้งาน 
 
 

รายการหน้าเว็บย่อย

การเชื่อมต่อเครื่องมือกับพอร์ตอนุกรม RS232 ด้วย Opto Couple

โพสต์8 ก.พ. 2554 20:47โดยวิสิทธิ์ แผ้วกระโทก   [ อัปเดต 20 มี.ค. 2556 23:25 ]

การเชื่อมต่อเครื่องมือกับพอร์ตอนุกรม RS232 ด้วย Opto Couple

กล่าวนำ
    ในงานบางอย่างที่มีการเชื่อมต่ออุปกรณ์ เครื่องมือ หรือเครื่องมือวัดกับคอมพิวเตอร์ ทางพอร์ตอนุกรม(RS232) อาจจะมีความจำเป็นที่จะต้องแยกกันทางไฟฟ้า ระหว่างเครื่องมือวัดกับเครื่องคอมพิวเตอร์ ปัญหาที่เกิดขึ้น เช่น การไม่แยกกราวด์ระหว่างคอมพิวเตอร์กับเครื่องมือวัด อาจจะทำให้กระแสไฟฟ้าจากเครื่องมือวัด ทำความเสียหายต่อวงจร ภายใน ของคอมพิวเตอร์ หรือกลับกัน หรืออาจจะทำให้ผู้ใช้งานถูกกระแสไฟฟ้าดูด เป็นต้น 

วิธีการ
     การใช้ opto couple ในการเชื่อมต่อ (interface) เป็นวิธีการแก้ปัญหาวิธีหนึ่ง โดยเปลี่ยนการเชื่อมต่อ โดยตรงทางไฟฟ้า เป็นการเชื่อมต่อกันทางแสง 

ข้อจำกัด
    วิธีการนี้ใช้ได้กับ การเชื่อมต่อที่มีการใช้เฉพาะ Rx, Tx และ Ground สำหรับการรับส่งข้อมูล ของพอร์ตอนุกรมเท่านั้น 

    อุปกรณ์ และวงจร อัตราเร็วในการรับส่งข้อมูล ขึ้นอยู่กับลักษณะของ opto couple ที่นำมาใช้งาน ถ้าเป็นไปได้ ควรเลือกใช้แบบ hi-speed และขึ้นอยู่กับค่าความต้านทาน ของตัวต้านทาน R1 และ R4 

    ในที่นี้ วงจรจะมีอยู่ด้วยกันสองแบบ คืิอ แบบแรกเป็นวงจร สำหรับการเชื่อมต่อระหว่างคอมพิวเตอร์กับเครืองมือวัด และแบบที่สองเป็นวงจร สำหรับการเชื่อมต่อระหว่างคอมพิวเตอร์กับไมโครคอนโทรลเลอร์ หรือไมโครโปรเซสเซอร์

 
 





ที่มา http://www.manmachine-interface.com

รายการหน้าเว็บย่อย

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

โพสต์3 ต.ค. 2553 08:28โดยวิสิทธิ์ แผ้วกระโทก   [ อัปเดต 20 มี.ค. 2556 23:20 ]

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


Interrupt Vectors

ก่อนที่จะใช้งาน Interrupt ก็ต้องรู้ว่า communication card ที่ใช้มี address และ IRQ อย่างไร ย้อนกลับไปดู Table 3. ที่แสดงข้อมูลของ base address และ IRQ ที่ใช้กันอยู่ โดย IRQ 3 และ 4 ใช้กันเป็นประจำ ส่วน IRQ 5 และ 7 มีใช้ในบางโอกาส

เมื่อรู้ IRQ แล้วต่อไปก็หา interrupt vector หรือ software interrupt ของมัน ปรกติ processor ในอนุกรมของ 8086 จะมี 256 interrupt vector โดยนับจาก 0 ถึง 255 แต่ละ vector มีขนาด 4 bytes เก็บ address ของ Interrupt Service Routine (ISR) ไว้ แต่เนื่องจากภาษา C สามารถจัดการกับ address เหล่านี้โดยเพียงแต่รู้ค่า vector ของมันเท่านั้นดังนั้นจึงใช้เฉพาะ interrupt vector ในการเขียน program ภาษา C


Table 14. แสดง Interrupt Vector ของ Hardware

Table 14. Interrupt Vectors. (Hardware only)

Int. (Hex)

IRQ

Common uses

08

0

System Timer

09

1

Keyboard

0A

2

Redirected

0B

3

Serial Comms. COM2/COM4

0C

4

Serial Comms. COM1/COM3

0D

5

Reserved/Sound Card

0E

6

Floppy Disk Controller

0F

7

Parallel Comms.

70

8

Real Time Clock

71

9

Reserved

72

10

Reserved

73

11

Reserved

74

12

PS/2 Mouse

75

13

Math Co-Processor

76

14

Hard Disk Drive

77

15

Reserved

 

สมมุติว่าเราใช้ COM 3 ซึ่งมี IRQ อยู่ที่ 0C (Hex) เราก็สามารถ set ค่า interrupt vector โดยใช้คำสั่งภาษา C ว่า setvec (Ox0C, PORT1INT); โดย PORT1INT คือ ISR หรือ interrupt handler ที่รองรับ IRQ นี้ แต่ก่อนที่จะทำเช่นนั้นควรเก็บค่าvector เดิมไว้เพื่อ restore กลับหลังจากที่จบการทำงานของ ISR แล้ว ซึ่งจะใช้คำสั่ง oldport1isr = getvect (INTVECT); โดย oldport1isr ถูกกำหนดโดยคำสั่ง void interrupt (*oldport1isr)(); นอกจากนั้นยังต้องมีการเก็บค่า status เดิมของ UART และส่งคืนทุกครั้งที่สิ้นสุด ISR เพื่อให้ program อื่นสามารถใช้ UART ได้

Interrupt Service Routine

PORT1INT ที่ชี้ไปยัง ISR ซึ่งจะทำงานตามที่ได้ออกแบบไว้ ตัวอย่างเช่น

void interrupt PORT1INT()
{
int c;
do { c = inportb(PORT1 + 5);
if (c & 1) {
buffer[bufferin] = inportb(PORT1);
bufferin++;
if (bufferin == 1024) bufferin = 0;
}
} while (c & 1);
outportb(0x20,0x20);
}

ซึ่งจะตรวจว่ามีการรับ character เข้ามาใน UART หรือไม่ ถ้ามีก็จะอ่านไปเก็บไว้ที่ buffer ใน memory ซึ่งจะตรวจต่อเนื่องในกรณีที่ enable ตัว FIFO เพื่อเก็บข้อมูลทั้งหมดเมื่อมี interrupt เกิดขึ้น

บรรทัดสุดท้าย outportb(0x20,0x20); จะบอกตัว Programmable Interrupt Controller (PIC) ว่าสิ้นสุดการ interrupt แล้ว routine ข้างบนจะทำงานได้ก็ต่อเมื่อ setup ตัว register ต่าง ๆ ของ UART และตัว PIC ถูกต้องแล้วเท่านั้น ปรกติ PC จะใช้ PIC 2 ตัวเป็น PIC1 และ PIC2 และมี control word ตามที่แสดงใน Table 15. และ 16. สำหรับรายละเอียดเกี่ยวกับการใช้ Interrupt และตัว PIC ขอให้ดูจากบทความเรื่อง “การใช้ Interrupt”

Table 15. PIC1 Operation Control Word 1 (Address Ox21)

Bit

Disable IRQ

Function

7

IRQ7

Parallel Port

6

IRQ6

Floppy Disk Controller

5

IRQ5

Reserved/Sound Card

4

IRQ4

Serial Port

3

IRQ3

Serial Port

2

IRQ2

PIC2

1

IRQ1

Keyboard

0

IRQ0

System Timer

 

 

Table 16. PIC2 Operation Control Word 1 (Address OxA1)

Bit

Disable IRQ

Function

7

IRQ15

Reserved

6

IRQ14

Hard Disk Drive

5

IRQ13

Math Co-Processor

4

IRQ12

PS/2 Mouse

3

IRQ11

Reserved

2

IRQ10

Reserved

1

IRQ9

Redirected IRQ2

0

IRQ8

Real Time Clock

 

UART Configuration

การ config. ตัว UART มีขั้นตอนหลัก ๆ ดังนี้

  1. Disable การ interrupt ของตัว UART เป็นอันดับแรก เพื่อไม่ให้มี interrupt จาก UART มารบกวนขณะทำการ config. อยู่
  2. ทำการ setup ค่า interrupt vector ต่าง ๆ
  3. กำหนด speed และค่าต่าง ๆ ในการสื่อสารที่ต้องการ โดย set bit 7 ของ LCR ก่อนแล้วค่อยกำหนดค่าอื่น ๆ
  4. หลังจากกำหนด speed แล้ว ก็ต้อง reset bit 7 ของ LCR เพื่อจะได้ควบคุม interrupt enable register และ Tx/Rx buffer ได้และกำหนดค่าต่าง ๆ ที่เกี่ยวกับ FCR และ MCR

Main Routine (Loop)

ตัวอย่างของ main routine มีดังนี้

do {
if (bufferin != bufferout){
ch = buffer[bufferout];
bufferout++;
if (bufferout == 1024) bufferout = 0;
printf("%c",ch);
}
if (kbhit()){
c = getch();
outportb(PORT1, c);
}
} while (c !=27);
ซึ่งจะ loop จนกว่าค่า c = 27 (คือการกดปุ่ม ESC key) สำหรับ routine นี้ตั้งอยู่บนสมมุติฐานว่า UART ทำงานเร็วกว่าการพิมพ์ข้อมูลเข้าไป แต่ถ้าใช้ในลักษณะอื่นที่ UART อาจจะทำงานไม่ทัน ก็ต้องเพิ่มขั้นตอนให้มีการตรวจสอบ bit 5 ของ Line Status Register (LSR) ว่ามีค่าเป็น “1” ก่อนที่จะส่งข้อมูลใหม่เข้าไปยัง Tx register

Determining the type of UART via Software

การตรวจสอบชนิดของ UART โดยใช้ software มีขั้นตอนดังนี้

Set ให้ bit 0 ของ FCR มีค่าเป็น “1” แล้วอ่านค่าของ bit 6 และ 7 ของ interrupt identification register (IIR) ถ้า bit ทั้ง 2 มีค่าเป็น “1” แสดงว่า FIFO buffer ถูก enable หมายความว่า UART เป็นเบอร์ 16550A ถ้า FIFO ถูก enable แต่ใช้ไม่ได้แสดงว่า UART เป็นเบอร์ 16550 และถ้า FIFO ไม่ได้ถูก enable แสดงว่า UART เป็นเบอร์ 16450 หรือ 8250, 8250A หรือ 8250B ในเครื่อง PC รุ่นเก่า (ส่วนเครื่อง PC/AT จะมี bus speed ที่สูงขึ้น ซึ่ง UART อนุกรม 8250 ไม่สามารถตอบสนองได้) จากนั้นก็ลองเขียนข้อมูลเข้า scratch register แล้วอ่านกลับออกมาเทียบกับที่เขียนเข้าไปดูว่าถ้าตรงกันแสดงว่ามี scratch register อยู่แสดงว่า UART เป็นเบอร์ 16450 หรือ 8250A แต่ถ้าไม่มี scratch register แสดงว่า UART เป็นเบอร์ 8250 หรือ 8250B สำหรับ UART เบอร์ 16750 จะมี buffer 64 byte ซึ่งทดสอบโดยการ enable ผ่าน FCR แล้วอ่านค่า status จาก IIR ก็จะรู้ได้

External Hardware – Interfacing Methods

RS-232 Waveforms

การสื่อสารโดย RS-232 เป็นการสื่อสารแบบ asynchronous หมายความว่าสัญญาณ clock ที่ใช้ควบคุมจังหวะไม่ได้ส่งไปพร้อมกับ Data แต่จะใช้ start bit เป็นตัว sync.ในแต่ละ word ของการสื่อสารและใช้สัญญาณ clock ภายในของแต่ละด้านเป็นตัวให้จังหวะเอง

Figure 4. TTL/CMOS Serial Logic Waveform.

Figure 4. แสดงลักษณะของสัญญาณจาก UART เมื่อใช้ format แบบ 8N1 คือ 8 data bits ไม่มี parity bit และมี 1 stop bit ขณะที่ idle จะอยู่ในสถานะ “Mark” หรือ logic “1” การส่งจะเริ่มจากการส่ง start bit คือ logic “0” และตามด้วย LSB bit จนหมด data bits และถ้ามี parity bit ก็จะส่งที่จุดนี้แล้วลงท้ายด้วย stop bit ซึ่งมีค่าเป็น logic “1” ในรูปได้แสดง bit ที่ต่อถัดจาก stop bit ซึงมีค่าเป็น logic “0” หมายความว่าเป็น start bit ของ การส่ง word ถัดไป แต่ถ้ายังไม่มีการส่ง word ถัดไป ก็ต้องอยู่ในสถานะของ logic “1” ซึ่งเป็นสถานะของ idle และถ้าสายอยู่ในสถานะของ logic “0” นานกว่าเวลาของการส่ง 1 full word ระบบจะถือว่าเป็นสัญญาณ “Break” เพื่อหยุดการสื่อสาร ดังนั้นต้องไม่ลืมที่จะสั่งในสายกลับสู่สถานะ idle เมื่อสิ้นสุดการส่ง

การรับ-ส่งข้อมูลในลักษณะนี้เรียกว่าแบบ frame คือมีกรอบปิดล้อมข้อมูลไว้ด้วย start bit และ stop bit

RS-232 Level Converters

สัญญาณ RS-232 มีค่าแรงไฟต่างจากที่ใช้ใน UART ดังแสดงใน Figure 5. ดังนั้นจึงต้องมี converter เพื่อแปลงระดับสัญญาณให้เหมาะสมก่อนที่จะเชื่อมต่อกับ serial port หรือ RS-232 port ของ computer

Figure 5. RS-232 Logic Waveform.

สำหรับสัญญาณ RS-232 นั้น logic “0” จะมีค่า +3 V ถึง +25 V และ logic “1” จะมีค่า –3 V ถึง –25 V ส่วนค่าระหว่าง –3 V ถึง +3 V เป็นค่า undefined ระดับสัญญาณนี้ใช้กับทุกสัญญาณไม่ใช่เฉพาะสัญญาณรับ-ส่งข้อมูลเท่านั้นแต่ยังรวมถึงสัญญาณควบคุมต่าง ๆ เช่น DTR, RTS, CTS, DCD, DSR เป็นต้น

IC ที่ใช้มักจะเป็นเบอร์ 1488 (RS-232 Driver) และ 1489 (RS-232 Receiver) โดยภายในแต่ละตัวจะประกอบด้วย inverter 4 ตัวและต้องการไฟเลี้ยง 2 ชุดคือ +7.5 V ถึง +15 V และ –7.5 V ถึง –15 V ซึ่งอาจจะมีปัญหาในเครื่องที่มีไฟเลี้ยง +5 V เพียงชุดเดียว แต่ก็ยังมี IC อีกตัวหนึ่งคือเบอร์ MAX-232 ซึ่งมีวงจร charge pump สามารถสร้างไฟ +10 V และ –10 V จากไฟ +5 V ได้ พร้อมทั้งมี 2 Tx และ 2 Rx อยู่ใน package เดียวกัน และรองรับ baud rate ได้ถึง 120 Kbps จึงสะดวกมากเพราะใช้ IC เพียงตัวเดียว รูปข้างล่างคือ MAX-232


ส่วนการที่เราจะนำข้อมูลมาใช้งานก็ต้องแปลงเป็น parallel ก่อนซึ่งเป็นหน้าที่ของ UART ซึ่งปัจจุบัน microprocessor และ microcontroller มักจะมี serial communication interface (SCI) อยู่ในตัว แต่อาจจะมีงานบางอย่างที่ไม่ได้ใช้ microcontroller และต้องการ process ข้อมูลกับ serial comm. เช่น ต่อ ADC เข้ากับ UART หรือต่อ LCD display เข้ากับ Serial comm. ก็ต้องใช้ UART ช่วย เช่นเบอร์ 8250 หรือ 16550A หรือเบอร์อื่น ๆ ที่ได้กล่าวมาแล้ว แต่มี UART อีกพวกหนึ่งที่แยก Tx bus กับ Rx bus ออกจากกัน ทำให้มีความคล่องตัวมากขึ้น ซึ่งจะกล่าวในหัวข้อต่อไป

CDP6402, AY-5-1015 / D36402R-9 etc UARTS

Table 17. แสดงรายละเอียดหน้าที่ของขาต่าง ๆ ของ UART ในกลุ่ม CDP6402, AY-5-1015 / D36402R-9 ซึ่งเป็น CMOS สามารถรองรับ baud rate สูงถึง 200 Kbps ที่ 5 V แต่เนื่องจาก UART เหล่านี้ไม่มี programmable baud rate generator อยู่ใน chip ด้วย จึงต้องใช้วงจรภายนอก โดยมากจะใช้ IC เบอร์ 74HC4046 ซึ่งเป็น 14 bit binary counter/divider แต่จะมีขา output เพียงบางส่วนคือ Q4 ถึง Q14 จึงต้องการ clock ที่มีความถี่สูงกว่า max. baud rate 16 เท่า Table 18. แสดง baud rate ที่เป็นไปได้เมื่อใช้ Crystal ควบคุมความถี่ต่างกัน

Table 17. Pin description for CDP6402, AY-5-1015 / D36402R-9 and compatible UARTs.

Pin Number

Abbr.

Full Name

Notes

1

VDD

+5 V. Supply Rail.

Connected to +5 V Supply.

2

NC

Not Connected.

Not Connected.

3

GND

Ground.

Ground.

4

RRD

Receiver Register Disable.

When driven high, Outputs RBR8:RBR1 are high impedance.

5 : 12

RBR8 : RBR1

Receiver Buffer Register.

Receiver’s Data Bus.

13

PE

Parity Error.

When high, a parity error has occurred.

14

FE

Framing Error.

When high, a framing error has occurred. I.e. The stop bit was not a logic 1.

15

OE

Overrun Error.

When high, data has been received but the nData Received Reset has not yet been activated.

16

SFD

Status Flag Disable.

When high, status flag outputs (PE, FE, OE, DR and TBRE) are high impedance.

17

RRC

Receiver Register Clock.

X 16 clock input for the receiver register.

18

nDRR

Data Received Reset.

Active low. When low, sets data received outputs low.(i.e. Clears DR)

19

DR

Data Received.

When high, data has been received and placed on outputs RBR8:RBR1.

20

RRI

Receiver Register In.

RXD-Serial input. Connected to serial port, via RS-232 receiver.

21

MR

Master Reset.

UART should be reset after applying power.

22

TBRE

Transmitter Buffer Register Empty.

When high, indicates that transmitter buffer register is empty, thus all bits including stop bit have been sent.

23

nTBRL

Transmitter Buffer Load/Strobe.

Active low. When low, data present on TBR8:TBR1 is placed in transmitter buffer register. A low to high transition on this pin, then sends the data.

24

TRE

Transmitter Register Empty.

When high, transmitter register is empty, thus can accept another byte of data to be sent.

25

TRO

Transmitter Register Out. (TXD)

TXD-Serial output. Connected to serial port, via RS-232 transmitter.

26 : 33

TBR8 :TBR1

Transmitter Buffer Register.

Data bus for transmitter. Place data here which you want to send.

34

CRL

Control Register Load

When high, control register (PI, SBS, CLS2, CLS1, EPE) is loaded. Can be tied high, so changes on these pins occur instantaneously.

35

PI

Parity Inhibit.

When high, no parity is used for both transmit and receive. When low, parity is used.

36

SBS

Stop Bit Select..

A high select 2 stop bits.(1.5 for 5 character word lengths). A low select 1 stop bit.

37 : 38

CLS2 :CLS1

Character Length Select.

Select word length. 00=5 bits, 01=6 bits, 10=7 bits and 11=8 bits.

39

EPE

Even Parity Enable.

When high, even parity is used. When low, odd parity is used.

40

TRC

Transmitter Register Clock.

X 16 clock input for the transmitter.

 

 

Table 18. Possible baud rates using a 74HC4046.

Output

1.8432 MHz

2.4546 MHz

Out2

115.2 Kbps

153.6 Kbps

Q4

7200 bps

9600 bps

Q5

3600 bps

4800 bps

Q6

1800 bps

2400 bps

Q7

900 bps

1200 bps

Q8

450 bps

600 bps

Q9

225 bps

300 bps

 

การใช้ BIOS Interrupt 14h และ DOS API Interrupt 21h

BIOS Interrupt 14h มี 4 functions ให้ใช้ในการ program เกี่ยวกับ serial port ดังรายละเอียดต่อไปนี้

Function 00h: Initializes the serial port and sets the speed, data and stop bits and the parity parameters. Input: AH=00h DX=Number of serial port (0=first serial port, 1=second serial port) AL=Configuration parameters Bits 0-1: Word length 10=7 bits 11=8 bits Bit 2: Number of stop bits 00=1 stop bit 01=2 stop bits Bits 3-4: Parity 00=none 01=odd 11=even Bits 5-7: Baud rate 000=110 baud 001=150 baud 010=300 baud 011=600 baud 100=1200 baud 101=2400 baud 110=4800 baud 111=9600 baud Output: AH=Serial port status Bit 0: Data ready Bit 1: Overrun error Bit 2: Parity error Bit 3: Framing error Bit 4: Break discovered Bit 5: Transmission hold register empty Bit 6: Transmission shift register empty Bit 7: Time out AL=Modem status Bit 0: Modem ready to send status change Bit 1: Modem on status change Bit 2: Telephone ringing status change Bit 3: Connection to receiver status change Bit 4: Modem ready to send Bit 5: Modem on Bit 6: Telephone ringing Bit 7: Connection to receiver modem หมายเหตุ: ข้อมูลใน BX, CX, DX, SI, DI, BP registers และ segment registers ไม่ได้ถูกกระทบจากการเรียก ใช้ function นี้ ส่วนข้อมูล ใน registers อื่นอาจมีการเปลี่ยนแปลง Function 01h: Sends a character to the specified serial port. Input: AH=01h DX=Number of serial port (0=first serial port, 1=second serial port) AL=Character code to be send Output: AH: Bit 7=0: Character transmitted Bit 7=1: Error Bit 0-6: Serial port status Bit 0: Data ready Bit 1: Overrun error Bit 2: Parity error Bit 3: Framing error Bit 4: Break discovered Bit 5: Transmission hold register empty Bit 6: Transmission shift register empty หมายเหตุ: ข้อมูลใน BX, CX, DX, SI, DI, BP registers และ segment registers ไม่ได้ถูกกระทบจากการเรียก ใช้ function นี้ ส่วนข้อมูล ใน registers อื่นอาจมีการเปลี่ยนแปลง Function 02h: Reads a character from the specified serial port. Input: AH=02h DX=Number of serial port (0=first serial port, 1=second serial port) Output: AH: Bit 7=0: Character received Bit 7=1: Error Bit 0-6: Serial port status Bit 0: Data ready Bit 1: Overrun error Bit 2: Parity error Bit 3: Framing error Bit 4: Break discovered Bit 5: Transmission hold register empty Bit 6: Transmission shift register empty หมายเหตุ: ควรจะเรียกใช้ function นี้ก็ต่อเมื่อ function 3 พบว่ามี character พร้อมให้รับแล้วเท่านั้น ข้อมูลใน BX, CX, DX, SI, DI, BP registers และ segment registers ไม่ได้ถูกกระทบจากการเรียกใช้ function นี้ ส่วนข้อมูล ใน registers อื่นอาจมีการเปลี่ยนแปลง Function 03h: Returns the state of the specified serial port. Input: AH=03h DX=Number of serial port (0=first serial port, 1=second serial port) Output: AH=Serial port status Bit 0: Data ready Bit 1: Overrun error Bit 2: Parity error Bit 3: Framing error Bit 4: Break discovered Bit 5: Transmission hold register empty Bit 6: Transmission shift register empty AL=Modem status Bit 0: Modem ready to send status change Bit 1: Modem on status change Bit 2: Telephone ringing status change Bit 3: Connection to receiver status change Bit 4: Modem ready to send Bit 5: Modem on Bit 6: Telephone ringing Bit 7: Connection to receiver modem หมายเหตุ: function นี้ควรถูกเรียกใช้ก่อนที่จะเรียกใช้ function 2 เสมอ ข้อมูลใน BX, CX, DX, SI, DI, BP registers และ segment registers ไม่ได้ถูกกระทบจากการเรียกใช้ function นี้ ส่วนข้อมูล ใน registers อื่นอาจมีการเปลี่ยนแปลง ส่วน DOS API Interrupt 21h มี 3 functions ที่เกี่ยวข้องกับ serial port ดังรายละเอียดต่อไปนี้ Function 03h: Reads a character from the COM1 serial port, unless a MODE command previously redirected serial access Input: AH=03h Output: AL=Character received หมายเหตุ: เนื่องจาก serial port ไม่มี buffer อยู่ภายใน ทำให้มันรับ character ได้เร็วกว่าที่จะอ่านได้ หรืออ่าน ไม่ทันกับการรับเข้ามาและ character ที่อ่านไม่ทันก็จะถูกเลยผ่านไป ซึ่งต้องระวังในจุดนี้ ก่อนที่จะเรียกใช้ function นี้ ต้องใช้ MODE command กำหนด communication parameters ต่าง ๆ เช่น baud rate, จำนวน stop bits และอื่น ๆ ให้เรียบ ร้อยก่อน มิฉะนั้นก็จะใช้ค่า DOS defaults คือ 2400 baud หนึ่ง stop bit ไม่มี parity และ 8 data bits. และถ้า function นี้ได้รับค่า <Ctrl><C> (ASCII code 3) จะทำให้ไปเรียกใช้ Interrupt 23h ซึ่งเป็น <Ctrl><C> handler address ได้ การใช้ BIOS functions จาก interrupt 14h จะมีความคล่องตัวและมีประสิทธิภาพกว่า ข้อมูลใน AH, BX, CX, DX, SI, DI, BP, CS, DS, SS, ES registers และ flag registers ไม่ถูกกระทบจากการเรียกใช้ function นี้. Function 04h: Writes a character to the COM1 serial port, unless a MODE command previously redirected serial access. Input: AH=04h DL=Character set for output Output: No output หมายเหตุ: ทันทีที่ receiving device ส่งสัญญาณไปให้ function เพื่อบอกว่าพร้อมที่จะรับ function ก็จะส่ง character ให้ แล้วกลับสู่ program ที่จากมา ก่อนที่จะเรียกใช้ function นี้ ต้องใช้ MODE command กำหนด communication parameters ต่าง ๆ เช่น baud rate, จำนวน stop bits และอื่น ๆ ให้เรียบร้อยก่อน มิฉะนั้นก็จะใช้ค่า DOS defaults คือ 2400 baud หนึ่ง stop bit ไม่มี parity และมี 8 data bits. และถ้า function นี้ได้รับค่า Ctrl><C> (ASCII code 3) จะทำให้ไปเรียกใช้ Interrupt 23h ซึ่งเป็น <Ctrl><C> handler address ได้ การใช้ BIOS functions จาก interrupt 14h จะมีความคล่องตัว และมีประสิทธิภาพกว่า ข้อมูลใน registers ใน processor และ flag registers ไม่ถูกกระทบจากการเรียกใช้ function นี้ Function 40h: It is a common out function for all files and devices that use a handle access. This function sends a number of bytes from a buffer to the specified device. Input: AH=40h BX=File or device handler CX=Number of bytes to be read DS=Buffer segment address DX=Buffer offset address Output: Carry flag=0: O.K. (AX=Number of bytes read) Carry flag=1: Error (AX=Error code) AX=5: Access denied AX=6: Illegal handle or file not open หมายเหตุ: Characters สามารถเขียนไปยัง file หรือ device เช่น screen ซึ่งมีค่า handle=1 เป็นต้น ถ้าหลังจาก เรียก function นี้แล้ว carry flag ถูก reset แต่ AX register มีค่าเป็น 0 หมายความว่า file pointer ชี้ถึงจุดสิ้นสุด ของ file ก่อนที่ function จะถูกเรียกใช้ จึงไม่สามารถเขียนเข้าไปใน file ได้ ถ้าหลังจากเรียก function นี้แล้ว carry flag ถูก reset แต่ ข้อมูลใน AX register มีค่าน้อยกว่าใน CX register (ก่อนที่จะเรียก function) แสดงว่า ไม่สามารถ เขียนจำนวน bytes ที่ต้องการเข้าไปยัง file ได้ เพราะถึงจุดสิ้นสุดของ file ก่อน ดังนั้นหลังจากเรียก function file pointer จึงชี้fไปยัง byte ที่ถัดจาก byte สุดท้ายที่เขียนเข้าไปได้ ข้อมูลใน AH, BX, CX, DX, SI, DI, BP, CS, DS, SS และ ES registers ไม่ถูกกระทบจากการเรียกใช้ function นี้

ตัวอย่างต่อไปนี้เป็น program ภาษา C++ ที่ใช้ serial comm. ติดต่อกันระหว่าง computer 2 เครื่อง
//Program to communicate two PCs via serial port
  //00h BIOS function (AL register)
//bits 7, 6, 5 Baud rate (bps.)
  // 000 110
  // 001 150
  // 010 300
  // 011 600
  // 100 1200
  // 101 2400
  // 110 4800
  // 111 9600
//bits 4, 3 Parity bits
  // 00 no parity
  // 01 odd parity
  // 11 even

//bits 2 stop bits // 0 1 stop bit // 1 2 stop bit //bits 1, 0 Number of bits per data // 10 7 data bits // 11 8 data bits //Register Dx 0->com1, 1->com2, 2->com3, 3->com4

//Configuration: 9600 bps., no parity, 2 stop bits and 8 data bits //AL register value is 11100111 -> 0xE7

#include <stdio.h> #include <process.h> #include <conio.h> #include <dos.h> #include <bios.h>

#define TRUE 1 #define PARAM 0xA7 #define COM1 0 #define COM2 1

void init_port(void); char state_port(void); void send_byte(unsigned char); unsigned char read_byte(void); void keyb(void); int tecla = 1; void main ( void ) { unsigned char read_com; unsigned char read_kb; clrscr(); init_port();

while(read_kb != 'c') { read_kb=getch(); send_byte(read_kb); read_com=read_byte(); if(read_com!=0){printf("%c",read_com);} } }

void init_port() { union REGS regs; regs.h.ah = 0x00; regs.x.dx = COM2; regs.h.al = PARAM; int86( 0x14, &regs, &regs); }

//return the state of the port

char state_port() { union REGS regs; regs.h.ah = 0x03; regs.x.dx = COM2; int86( 0x14, &regs, &regs); if(regs.h.ah & 0x80) printf("\t EXCEED TIME\n"); if(regs.h.ah & 0x40) printf("\t TSR EMPTY\n"); if(regs.h.ah & 0x20) printf("\t THR EMPTY\n"); if(regs.h.ah & 0x10) printf("\t INTERRUPTION\n"); if(regs.h.ah & 0x08) printf("\t THREAT ERROR\n"); if(regs.h.ah & 0x04) printf("\t PARITY ERROR\n"); if(regs.h.ah & 0x02) printf("\t OVERLOAD ERROR\n"); return (regs.h.ah); }

//Keyboard handle

void keyb() { union u_type{int a;char b[3];}keystroke;char inkey=0;

if(bioskey(1)==0) return; keystroke.a=bioskey(0); inkey=keystroke.b[1]; switch (inkey) { case 1: keyb=0; return; /*ESC*/ default: keyb=15; return; } } //Send a character to the serial port

void send_byte(unsigned char byte) { union REGS regs; regs.h.ah = 0x01; regs.x.dx = COM2; regs.h.al = byte; int86( 0x14, &regs, &regs); if( regs.h.ah & 0x80) { printf("\t SENDING ERROR "); exit(1); } }

//read a character from serial port

unsigned char read_byte() { int x,a; union REGS regs; if((estate_port() & 0x01)) { regs.h.ah = 0x02; regs.x.dx = COM2; int86(0x14,&regs,&regs); if(regs.h.ah & 0x80) { printf("\t RECEIVING ERROR"); exit(1); } return(regs.h.al);} else { return(0); } }

RS-232, RS-423, RS-422 and RS-485

Table ข้างล่างนี้เป็นการสรุปคุณสมบัติของมาตรฐานต่าง ๆ ที่นิยมใช้กันทั่วไป

Specification

RS-232

RS-423

RS-422

RS-485

Mode of operation

Single-ended

Single-ended

Differential

Differential

Total number of drivers and receivers on one line

1Tx

1Rx

1Tx

10Rx

1Tx

10Rx

1Tx

32Rx

Maximum cable length

50Ft

4,000Ft

4,000Ft

4,000Ft

Maximum data rate

20Kbps

100Kbps

10Mbps

10Mbps

Maximum driver output voltage

+/-25V

+/-6V

-0.25V to +6V

-7V to +12V

Driver output signal level (loaded min.)

Loaded

+/-5V to +/-15V

+/-3.6V

+/-2V

+/-1.5V

Driver output signal level (loaded max.)

Unloaded

+/-25V

+/-6V

+/-6V

+/-6V

Driver load impedance (ohms)

3K to 7K

>=450

100

54

Max. Driver current in high Z state

Power on

N/A

N/A

N/A

+/-100uA

Max. Driver current in high Z state

Power off

+/-6mA @ +/-2V

+/-100uA

+/-100uA

+/-100uA

Slew rate (max.)

30V/uS

Adjustable

N/A

N/A

Receiver input voltage range

+/-15V

+/-12V

-10V to +10V

-7V to +12V

Receiver input sensitivity

+/-3V

+/-200mV

+/-200mV

+/-200mV

Receiver input resistance (ohms)

3K to 7K

4K min.

4K min.

>=12K

การสื่อสารระหว่างอุปกรณ์ตั้งแต่ 2 อุปกรณ์ขึ้นไปจะประกอบด้วยตัว Driver หรือตัวส่ง Receiver หรือตัวรับ และสื่อกลาง หรือ Transmission line (ในกรณีที่เป็นการสื่อสารแบบใช้สาย) ทาง EIA จึงได้กำหนดมาตรฐานต่าง ๆ ขึ้น ซึ่งมีคุณสมบัติสรุปตามที่แสดงใน Table ข้างบน โดย RS-232 และ RS-423 เป็นแบบ single-ended ส่วน RS-422 และ RS-485 เป็นแบบ differential ซึ่งลดปัญหาที่แบบ single-ended ต้องประสบเช่นเรื่อง ground shift, ground noise เรื่อง induced noise ใน common mode เป็นต้น

วงจรสัญญาณของ RS-232

 

ระดับสัญญาณของ RS-232

 

สัญญาณระบบ Balanced Differential Data Transmission

RS-232 มี speed สูงสุดได้ไม่เกิน 20Kbps และไปได้ไกลสุดไม่เกิน 50 ฟุตที่ speed สูงสุด แต่ถ้าใช้สายพิเศษที่เป็นชนิด low capacitance ก็สามารถไปได้ไกลขึ้น สื่อสารแบบ full-duplex ได้ สัญญาณ idle เป็น “mark” มีค่าแรงไฟเป็นลบ และสัญญาณ active เป็น “space” มีค่าแรงไฟเป็นบวก ใช้สัญญาณ handshaking หลายสัญญาณ เหมาะที่จะเชื่อมต่อกับ modem ดังนั้นถ้าใช้งานด้านอื่นจึงมักประสบปัญหาในการจัดการกับสัญญาณ handshaking ซึ่งโดยมากมักจะใช้วิธีแก้ที่ software protocol หรือไม่ก็ loopback หรือ pull-up ด้วย Hardware ส่วน RS-423 เป็นมาตรฐานที่ปรับปรุงให้การทำงานแบบ single-ended ดีกว่า RS-232 แต่ก็ไม่ค่อยได้รับความนิยมนัก

เปรียบเทียบวงจรระหว่าง RS-422 กับ RS-485

การต่อ Grounding ของ RS-485

RS-422 เป็นแบบ differential สามารถใช้ speed ได้สูงกว่าและไปได้ไกลกว่า RS-232 มาก ดังนั้นถ้าใช้ converter 1 คู่ต่อหัว-ท้าย เพื่อแปลงสัญญาณ RS-232 และ RS-422 จะทำให้สามารถสื่อสารได้ด้วย speed สูงสุดถึง 100Kbps และไปได้ไกลถึง 4,000 ฟุต และยังสามารถทำงานแบบ multi-drop (party-line) คือ 1 driver ต่อกับ 10 receivers ในสาย bus เดียวกัน แต่ RS-422 ไม่สามารถทำงานแบบ multi-point network อย่างเต็มรูปแบบได้ ซึ่งประกอบด้วยหลาย driver และหลาย receiver ที่ต่ออยู่บน bus เดียวกัน แต่ก็ได้มีการแก้ไขให้สามารถสื่อสารแบบ quasi multi-drop โดยใช้สาย 4 wires เพื่อสื่อสารแบบ half-duplex เพื่อหลีกเลี่ยงการชนกันของข้อมูล (data collision)

RS-485 เป็นการทำงานแบบ multi-point แบบเต็มรูปแบบ โดยใช้สาย 2 wires สามารถต่อกับ driver และ receiver ได้ถึง 32 ชุดบน bus เดียวกัน และถ้าผนวกกับการใช้ automatic repeater และ high impedance driver/receiver แล้วจะทำให้สามารถต่อใช้งานได้อีกเป็น 100 เป็น 1,000 nodes บน network เดียวกันได้ และเพิ่มขึดความสามารถในการทนต่อปัญหา common mode ด้วย tri-state และ power off อีกทั้งทนต่อปัญหาของ data collision และ bus fault การแก้ปัญหาเรื่อง collision จะใช้การสื่อสารแบบ half-duplex และทางภาคส่งจะเปลี่ยนเป็นภาครับทันทีหลังจากส่งแล้ว ทำให้สามารถทำงานด้วยความเร็วสูงได้

รายการหน้าเว็บย่อย

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

โพสต์3 ต.ค. 2553 08:16โดยวิสิทธิ์ แผ้วกระโทก   [ อัปเดต 20 มี.ค. 2556 23:20 ]

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


Modem Control Register (MCR)

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

Table 11. Modem Control Register.

Bit

Notes

7

Reserved

6

Reserved

5

Autoflow Control Enabled (16750 only)

4

Loopback Mode

3

Aux. Output 2

2

Aux. Output 1

1

Force Request To Send

0

Force Data Terminal Ready

 

MCR เป็น register ชนิด read/write สำหรับ bit 5, 6 และ 7 ถูก reserve ไว้


Line Status Register (LSR)

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

Table 12. Line Status Register.

Bit

Notes

7

Error in Received FIFO

6

Empty Data Holding Registers

5

Empty Transmitter Holding Register

4

Break Interrupt

3

Framing Error

2

Parity Error

1

Overrun Error

0

Data Ready

 

Line Status Register เป็น register ชนิด read only

Bit 7 จะบ่งบอกถึงความผิดปรกติของสิ่งที่รับเข้ามาใน FIFO เช่น มี bit ที่เสียหายหรือ parity ไม่ถูกต้องหรือ frame ของข้อมูลไม่ถูกต้องเป็นต้น

Bit 6 ถ้ามีค่าเป็น “1” จะแสดงว่าทั้งใน Tx holding register และ shift register ว่าง ซึ่ง Tx holding register จะเป็นตัวเก็บข้อมูลที่จะส่งในรูปแบบ parallel ส่วน shift register จะทำหน้าที่แปลงข้อมูลจาก parallel ให้เป็น serial ส่งออกไป

Bit 5 บ่งบอกว่าเฉพาะ Tx holding register ที่ว่างลง แต่ยังมีข้อมูลใน shift register อยู่ ความแตกต่างระหว่าง bit5 และ bit 6 คือ bit 5 บอกว่าสามารถส่งข้อมูลเข้าไปยัง Tx holding register และ Tx ก็ยังส่งข้อมูลอีก 1 byte ที่ค้างอยู่ใน shift register อยู่ ส่วน bit 6 บอกว่าไม่มีข้อมูลเหลือค้างในระบบการส่งแล้ว

Bit 4 เป็นตัวบอกว่าทางด้าน Rx อยู่ในสถานะ “space” หรือ “0” นานกว่าระยะเวลาของ 1 full word แล้ว ซึ่งระยะเวลาของ 1 full word หมายถึงเวลาของ (data bits)+(parity bit)+(start bit)+(stop bits)

Bit 3 จะเกิดขึ้นเมื่อปรากฏว่า bit สุดท้ายไม่ใช่ stop bit ซึ่งอาจจะเกิดจาก timing error เช่นการปรับ speed ของตัวรับกับตัวส่งไม่เท่ากัน

Bit 2 เป็นตัวบอกว่ามี parity error เกิดขึ้น แสดงว่าข้อมูลที่รับได้มี error หรือไม่ก็ตั้งเงื่อนไขของ parity ระหว่างตัวรับกับตัวส่งไม่ตรงกัน

Bit 1 บอกว่าเกิด overrun ขึ้น แสดงว่า software อ่านข้อมูลไม่ทัน ทำให้ข้อมูลที่รับเข้ามาใหม่ไปทับซ้อนแทนที่ข้อมูลเก่าที่ยังไม่ได้รับการ อ่านจาก software

Bit 0 บอกว่าข้อมูลรับเข้ามารออยู่ใน Rx buffer แล้ว พร้อมรอให้อ่านอยู่

Modem Status Register (MSR)

Table 13. แสดงรายละเอียดของ Modem Status Register

Table 13. Modem Status Register.

Bit

Notes

7

Carrier Detect

6

Ring Indicator

5

Data Set Ready

4

Clear To Send

3

Delta Data Carrier Detect

2

Trailing Edge Ring Indicator

1

Delta Data Set Ready

0

Delta Clear To Send

 

Modem Status Register เป็น register ชนิด read only

Bit 0 บอกว่า delta clear to send คำว่า delta หมายถึงมีการเปลี่ยนแปลงเกิดขึ้น เช่นในกรณีนี้แสดงว่ามีการเปลี่ยนแปลงของสัญญาณ clear to send เกิดขึ้นเมื่อเทียบกับการอ่าน register นี้ในครั้งที่แล้ว bit 1 และ 3 ก็ทำหน้าที่ในทำนองเดียวกัน

Bit 2 บอกว่ามีการเปลี่ยนสถานะจาก “low เป็น “high” ที่สัญญาณ ring indicator เกิดขึ้น

Bit 4 ถึง 7 บอกถึงสถานะของสัญญาณนั้น ๆ

Scratch Register

Scratch register ไม่ได้นำมาใช้ในการสื่อสารของ PC โดยตรง แต่ใช้เป็นที่พักข้อมูลในการอื่น ซึ่งประโยชน์ที่พอจะพบใน PC/AT คือใช้ตรวจว่า UART เป็นเบอร์ 8250/8250B ซึ่งไม่ได้ออกแบบมาให้ใช้กับ PC/AT หรือเบอร์ 8250A/16450

Programming

Polling or Interrupt Driven?

การเขียน Program ทางสื่อสารจะมี 2 วิธีหลัก ๆ คือ

    1. Polling คือไปคอยอ่าน UART ว่ามีข้อมูลมาหรือไม่เป็นระยะ ๆ ซึ่งเป็นวิธีที่ต้องใช้เวลาของ CPU อย่างมาก และทำให้สื่อสารด้วย speed ที่ไม่สูงเพราะจะทำให้ poll ไม่ทันเช่นอาจจะใช้ได้เพียง สิบ ๆ Kbps ขึ้นอยู่กับความเร็วของ CPU
    2. สร้าง Interrupt handler เพื่ออ่านข้อมูลจาก UART เมื่อมี interrupt เกิดขึ้น วิธีนี้จะสามารถสื่อสารได้เร็วขึ้นมากเช่น 115.2 Kbps หรือมากกว่านี้ขึ้นอยู่กับความเร็วของ UART และ CPU ที่ใช้
Termpoll.c - A Simple Comms Program using Polling
/* Name : Sample Comm's Program - Polled Version - termpoll.c */
/* Written By : Craig Peacock (cpeacock@senet.com.au) */
/* Date : Saturday 22nd February 1997 */
/* Copyright 1997 CRAIG PEACOCK (cpeacock@senet.com.au)*/
/* See http://www.senet.com.au/~cpeacock/serial.htm */
/* For More Information */
#include 
#include 
#include 
#define PORT1 0x3F8
/* Defines Serial Ports Base Address */
/* COM1 0x3F8 */
/* COM2 0x2F8 */
/* COM3 0x3E8 */
/* COM4 0x2E8 */
void main(void)
{
int c;
int ch;
outportb(PORT1 + 1 , 0); 			/* Turn off interrupts - Port1 */
/* PORT 1 - Communication Settings */
outportb(PORT1 + 3 , 0x80); 			/* SET DLAB ON */
outportb(PORT1 + 0 , 0x03); 			/* Set Baud rate - Divisor Latch Low Byte */
/* Default 0x03 = 38,400 BPS */
/* 0x01 = 115,200 BPS */
/* 0x02 = 56,700 BPS */
/* 0x06 = 19,200 BPS */
/* 0x0C = 9,600 BPS */
/* 0x18 = 4,800 BPS */
/* 0x30 = 2,400 BPS */
outportb(PORT1 + 1 , 0x00); 			/* Set Baud rate - Divisor Latch High Byte */
outportb(PORT1 + 3 , 0x03); 			/* 8 Bits, No Parity, 1 Stop Bit */
outportb(PORT1 + 2 , 0xC7); 			/* FIFO Control Register */
outportb(PORT1 + 4 , 0x0B); 			/* Turn on DTR, RTS, and OUT2 */
printf("\nSample Comm's Program. Press ESC to quit \n");
do { c = inportb(PORT1 + 5); 			/* Check to see if char has been */
					/* received. */
if (c & 1) {ch = inportb(PORT1); 			/* If so, then get Char */
printf("%c",ch);} 				/* Print Char to Screen */
if (kbhit()){ch = getch(); 			/* If key pressed, get Char */
outportb(PORT1, ch);} 			/* Send Char to Serial Port */
} while (ch !=27); 				/* Quit when ESC (ASC 27) is pressed */
}

การ polling ไม่ใช่ว่าจะไม่ควรใช้เสียทีเดียว มันยังมีประโยชน์อยู่เช่น ใช้ตรวจสอบว่า UART อยู่ที่ address ไหนและใช้ IRQ ใดโดยการ enable ทีละ IRQ ผ่าน PIC ซึ่งสามารถใช้ตรวจหาอุปกรณ์อื่น ๆ ด้วยเช่น Modem เป็นต้น

Buff1024.c - An Interrupt Driven Comms Program

/* Name : Sample Comm's Program - 1024 Byte Buffer - buff1024.c */
/* Written By : Craig Peacock (cpeacock@senet.com.au) */
/* Copyright 1997 CRAIG PEACOCK (cpeacock@senet.com.au) */
/* See http://www.senet.com.au/~cpeacock/serial.htm */
/* For More Information */
#include 
#include 
#include 
#define PORT1 0x2E8 			/* Port Address Goes Here */
/* Defines Serial Ports Base Address */
/* COM1 0x3F8 */
/* COM2 0x2F8 */
/* COM3 0x3E8 */
/* COM4 0x2E8 */
#define INTVECT 0x0B 			/* Com Port's IRQ here */
					/* (Must also change PIC setting) */
int bufferin = 0;
int bufferout = 0;
char ch;
char buffer[1025];
void interrupt (*oldport1isr)();
void interrupt PORT1INT() 			/* Interrupt Service Routine (ISR) for PORT1 */
{
int c;
do { c = inportb(PORT1 + 5);
if (c & 1) {buffer[bufferin] = inportb(PORT1);bufferin++;
if (bufferin == 1024) bufferin = 0;}
}while (c & 1);
outportb(0x20,0x20);
}
void main(void)
{
int c;
outportb(PORT1 + 1 , 0); 			/* Turn off interrupts - Port1 */
oldport1isr = getvect(INTVECT); 		/* Save old Interrupt Vector for */
/* later recovery */
setvect(INTVECT, PORT1INT); 			/* Set Interrupt Vector Entry */
/* COM1 - 0x0C */
/* COM2 - 0x0B */
/* COM3 - 0x0C */
/* COM4 - 0x0B */
/* PORT 1 - Communication Settings */
outportb(PORT1 + 3 , 0x80); 			/* SET DLAB ON */
outportb(PORT1 + 0 , 0x03); 			/* Set Baud rate - Divisor Latch Low Byte */
					/* Default 0x03 = 38,400 BPS */
/* 0x01 = 115,200 BPS */
/* 0x02 = 56,700 BPS */
/* 0x06 = 19,200 BPS */
/* 0x0C = 9,600 BPS */
/* 0x18 = 4,800 BPS */
/* 0x30 = 2,400 BPS */
outportb(PORT1 + 1 , 0x00); 			/* Set Baud rate - Divisor Latch High Byte */
outportb(PORT1 + 3 , 0x03); 			/* 8 Bits, No Parity, 1 Stop Bit */
outportb(PORT1 + 2 , 0xC7); 			/* FIFO Control Register */
outportb(PORT1 + 4 , 0x0B); 			/* Turn on DTR, RTS, and OUT2 */
outportb(0x21,(inportb(0x21) & 0xF7)); 		/* Set Programmable Interrupt */
					/* Controller */
/* COM1 (IRQ4) - 0xEF */
/* COM2 (IRQ3) - 0xF7 */
/* COM3 (IRQ4) - 0xEF */
/* COM4 (IRQ3) - 0xF7 */
outportb(PORT1 + 1 , 0x01); 			/* Interrupt when data received */
printf("\nSample Comm's Program. Press ESC to quit \n");
do {
if (bufferin != bufferout){ch = buffer[bufferout];
bufferout++;
if (bufferout == 1024) bufferout = 0;
printf("%c",ch);}
if (kbhit()){c = getch();
outportb(PORT1, c);}
} while (c !=27);
outportb(PORT1 + 1 , 0); 			/* Turn off interrupts - Port1 */
outportb(0x21,(inportb(0x21) | 0x08));		/* MASK IRQ using PIC */
/* COM1 (IRQ4) - 0x10 */
/* COM2 (IRQ3) - 0x08 */
/* COM3 (IRQ4) - 0x10 */
/* COM4 (IRQ3) - 0x08 */
setvect(INTVECT, oldport1isr); 			/* Restore old interrupt vector */
}

หมายเหตุ Source code ข้างบนนี้เป็นการย่นย่อเพื่อให้ง่ายต่อการเข้าใจ ในทางปฏิบัติจริง เมื่อเข้าสู่ communication program ควรมีการเก็บค่า status ของ registers ต่าง ๆ ใน UART ไว้ และก่อนที่จะออกจาก communication program ก็ต้องทำการ restore มันกลับสภาพเดิม เพื่อ program อื่นจะได้ใช้ต่อไป

รายการหน้าเว็บย่อย

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

โพสต์3 ต.ค. 2553 08:12โดยวิสิทธิ์ แผ้วกระโทก   [ อัปเดต 20 มี.ค. 2556 23:19 ]

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


Interrupt Identification Register (IIR)

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

Table 8. Interrupt Identification Register.

Bit

Note

6 : 7

Bit6

Bit7

 

0

0

No FIFO

0

1

FIFO Enabled but Unusable

1

1

FIFO Enabled

5

64 Byte FIFO Enabled (16750 only)

4

Reserved

3

0

Reserved on 8250, 16450

1

16550 Time-out Interrupt Pending

2 : 1

Bit2

Bit1

 

0

0

Modem Status Interrupt

0

1

Transmitter Holding Register Empty Interrupt

1

0

Received Data Available Interrupt

1

1

Receiver Line Status Interrupt

0

Interrupt Pending

No Interrupt Pending

 

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.

Bit

Notes

6 : 7

Bit 7

Bit 6

Interrupt Trigger Level

0

0

1 Byte

0

1

4 Bytes

1

0

8 Bytes

1

1

14 Bytes

5

Enable 64 Byte FIFO (16750 only).

4

Reserved.

3

DMA Mode Select. Change status of RXRDY & TXRDY pins from mode 1 to mode 2.

2

Clear Transmit FIFO.

1

Clear Receive FIFO.

0

Enable FIFO’s.

 

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.

Bit

Notes

7

0

Access to Rx buffer, Tx buffer & Interrupt Enable Register.

1

Divisor Latch Access Bit (DLAB).

6

Set Break Enable.

3 : 5

Bit 5

Bit 4

Bit 3

Parity Select.

X

X

0

No Parity.

0

0

1

Odd Parity.

0

1

1

Even Parity.

1

0

1

High Parity (Sticky).

1

1

1

Low Parity (Sticky).

2

Length of Stop Bit.

0

One stop bit

1

2 stop bits for words of length 6, 7 or 8 bits or 1.5 stop bits for word lengths of 5 bits.

0 : 1

Bit 1

Bit 0

Word length.

0

0

5 bits.

0

1

6 bits.

1

0

7 bits.

1

1

8 bits.

หมายเหตุ 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 ต่างกัน ฝากไว้ให้คิดเป็นการบ้านด้วย


รายการหน้าเว็บย่อย

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

โพสต์11 เม.ย. 2553 19:20โดยวิสิทธิ์ แผ้วกระโทก   [ อัปเดต 20 มี.ค. 2556 23:18 ]

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


UART จะมีวงจร Baud rate generator อยู่ภายใน ซึ่งจะเชื่อมโยงกับภาคส่งของ UART โดยตรง และควบคุมโดยใช้ Crystal แต่ทางด้านภาครับจะต้องต่อจากขา 15 ซึ่งเป็น Baud output มาเข้าที่ขา 9 ซึ่งเป็น Receiver clock input โดยความถี่ของ Clock มีค่าเป็น 16 เท่าของ Baud rate สูงสุด ดังนั้นเราจึงมักจะพบ Crystal ที่มีค่าความถี่ 1.8432 MHz หรือ 18.432 MHz อยู่บน I/O Card เสมอ

Type of UARTs

Type of UARTS (For PC’s)

UART

Note

8250

First UART in this series. It contains no scratch register. Terminal speed of 19.2Kbps.

8250A

This UART is faster than the 8250 on the bus side. Looks exactly the same to software than 16450.

8250B

Very similar to that of the 8250 UART.

16450

Used in AT's (Improved bus speed over 8250's). Operates comfortably at terminal speed of 38.4Kbps. Still quite common today.

16550

This was the first generation of buffered UART. It has a 16 byte buffer, however it doesn't work and is replaced with the 16550A.

16550A

Is the most common UART use for high speed communications eg. Terminal speed of 115.2Kbps. They made sure the FIFO buffers worked on this UART.

16650 (TL16C650)

Very recent breed of UART. Contains a 32 byte FIFO, Programmable Xon / Xoff characters and supports power management. Terminal speed of 230.4Kbps.

16750 (TL16C750)

Produced by Texas Instruments. Contains a 64 byte FIFO.

 

Serial Port Registers

Port Addresses and IRQ’s

Table 3. Standard Port Addresses.

Name

Address

IRQ

COM1

3F8

4

COM2

2F8

3

COM3

3E8

4

COM4

2E8

3

 

Table 3. แสดง Address และ IRQ ของ Serial Port หรือ COM Port ที่ใช้ในเครื่อง PC ส่วนใหญ่ แต่ถ้าไม่แน่ใจเราก็สามารถหาข้อมูลเหล่านี้ได้ โดยอ่านจาก BIOS ตาม Address ที่แสดงใน Table 4. ข้างล่างนี้

Table 4. COM Port Address in the BIOS Data Area.

Start Address

Function

0000 : 0400

COM1’s Base Address

0000 : 0402

COM2’s Base Address

0000 : 0404

COM3’s Base Address

0000 : 0406

COM4’s Base Address

 

ตัวอย่างต่อไปนี้เป็นตัวอย่าง Program ภาษา C แสดงการอ่านข้อมูล Address ของ COM Port จาก BIOS Data Area

#include <stdio.h>
#include <dos.h>
void main(void)
{
unsigned int far *ptraddr; 		/* Pointer to location of Port Addresses */
unsigned int address; 			/* Address of Port */
int a;
ptraddr=(unsigned int far *)0x00000400;
	for (a = 0; a < 4; a++)
	{
	address = *ptraddr;
	if (address == 0)
	printf("No port found for COM%d \n",a+1);
	else
	printf("Address assigned to COM%d is %Xh\n",a+1,address);
	*ptraddr++;
	}
}



Table of Registers

Table 5. แสดงถึง Address ของ Register ต่าง ๆ

Table 5. Table of Registers.

Base Address

DLAB

Read / Write

Abbr.

Register Name

+0

=0

Write

-

Transmitter Holding Buffer

=0

Read

-

Receiver Buffer

=1

Read / Write

-

Divisor Latch Low Byte

+1

=0

Read / Write

IER

Interrupt Enable Register

=1

Read / Write

-

Divisor Latch High Byte

+2

-

Read

IIR

Interrupt Identification Register

-

Write

FCR

FIFO Control Register

+3

-

Read / Write

LCR

Line Control Register

+4

-

Read / Write

MCR

Modem Control Register

+5

-

Read

LSR

Line Status Register

+6

-

Read

MSR

Modem Status Register

+7

-

Read / Write

-

Scratch Register

 

DLAB?

DLAB ใช้ควบคุม register บางตัวให้สามารถทำหน้าที่ต่างออกไปได้ จึงทำให้ register ที่มีอยู่จริงเพียง 8 ตัว สมารถทำงานเสมือนว่ามี register อยู่ 12 ตัว DLAB ย่อมาจาก Divisor Latch Access Bit

เมื่อ DLAB ถูก set ให้มีค่าเป็น 1 โดย set ที่ Line Control Register จะทำให้เราสามารถเข้าถึง register 2 ตัวที่ทำหน้าที่กำหนด speed ของการสื่อสาร ซึ่งมีหน่วยเป็น bit per second (bps)

ตัว UART จะมี oscillator ความถี่เป็น 16 เท่าของ speed สูงสุดในการสื่อสาร ถ้าเราต้องการ speed สูงสุดที่ 115,200 bps ก็ต้องใช้ความถี่ oscillator ที่ 1.8432 MHz และจาก speed สูงสุดที่ 115,200 bps เมื่อหารต่อไปด้วยค่าตัวหาร 48 ก็จะทำให้ได้ speed ที่ 2400 bps ซึ่งตัว Baud Rate Generator จะเป็นตัวทำหน้าที่นี้ โดยมี register 2 ตัวทำหน้าที่เก็บค่าตัวหาร (divisor) นี้ ซึ่ง register ทั้ง 2 จะถูกควบคุมโดย DLAB ค่าของตัวหารสามารถเป็นเท่าใดก็ได้ที่ไม่เกิน 16 bit (0 ถึง 65,535) และเนื่องจาก UART มี data bus เพียง 8 bit จึงต้องใช้ register 2 ตัว โดยเมื่อ set ค่า DLAB ให้มีค่าเป็น 1 ตัว register ตัวแรกซึ่งมี address อยู่ที่ base+0 จะเก็บค่า Divisor Latch Low Byte ส่วน register ตัวที่สองซึ่งมี address อยู่ที่ base+1 จะเก็บค่า Divisor Latch High Byte Table 6. แสดงถึงค่าตัวหารเป็นเลขฐาน 16 ที่ใช้กันทั่วไป.

Table 6. Commonly Used Baud rate Divisors.

Speed (bps)

Divisor (Dec.)

Divisor Latch High Byte

Divisor Latch Low Byte

50

2304

09h

00h

300

384

01h

80h

600

192

00h

C0h

2400

48

00h

30h

4800

24

00h

18h

9600

12

00h

0Ch

19200

6

00h

06h

38400

3

00h

03h

57600

2

00h

02h

115200

1

00h

01h

 

Interrupt Enable Register (IER)

Table 7. แสดงหน้าที่ของ bit ต่าง ๆ ใน Interrupt Enable Register

Table 7. Interrupt Enable Register.

Bit

Note

7

Reserved

6

Reserved

5

Enable Low Power Mode (16750)

4

Enable Sleep Mode (16750)

3

Enable Modem Status Interrupt

2

Enable Receiver Line Status Interrupt

1

Enable Transmitter Holding Register Empty Interrupt

0

Enable Receiver Data Available Interrupt

 

ถ้า bit0 ถูกกำหนดให้เป็น “1” หรือ “high” จะเป็นการ enable ตัว receiver data available interrupt ซึ่งจะทำให้เกิด interrupt ขึ้นเมื่อมีข้อมูลใน FIFO buffer ของภาครับเพื่อรอให้ CPU อ่าน ส่วน bit1 ถ้าถูกกำหนดเป็น “1” หรือ “high” จะเป็นการ enable ตัว transmitter holding register empty interrupt ซึ่งจะ interrupt ไปให้ CPU เมื่อ buffer ของภาคส่งว่าง (empty) สำหรับ bit2 ทำหน้าที่ enable การ interrupt ของ receiver line status ซึ่งจะทำให้ UART ส่ง interrupt ไปยัง CPU เมื่อมีการเปลี่ยนแปลงสภาวะที่ receiver line เกิดขึ้น และ bit3 เป็นตัว enable การ interrupt ของ modem status bit4 ถึง bit7 สำรองไว้ไม่ได้ใช้ใน UART เบอร์ 8250, 16550A และ 16650

รายการหน้าเว็บย่อย

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

โพสต์11 เม.ย. 2553 19:02โดยวิสิทธิ์ แผ้วกระโทก   [ อัปเดต 20 มี.ค. 2556 23:17 ]

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


Pin and Signal Functions

ตารางข้างล่างนี้แสดงถึงหน้าที่ของขาต่าง ๆ


Abbreviation

Full Name

Originator

Function

TD

Transmit Data

DTE

Serial data output (TXD) from DTE.

RD

Receive Data

DCE

Serial data input (RXD) to DTE.

CTS

Clear To Send

DCE

Tell DTE that DCE is ready to exchange data.

(D)CD

(Data) Carrier Detect

DCE

Carrier from remote DCE is detected.

DSR

Data Set Ready

DCE

Tell DTE that DCE is ready to establish a link.

DTR

Data Terminal Ready

DTE

Tell DCE that DTE is ready to establish a link.

RTS

Ready To Send

DTE

Tell DCE that DTE is ready to exchange data.

RI

Ring Indicator

DCE

Ringing signal from the phone line is detected.


หน้าที่ของ Signal ต่าง ๆ มีดังนี้


Protective ground เป็นจุดที่ต่อกับตัวเปลือกของอุปกรณ์ และไม่ต่อกับสัญญาณใด ๆ ในระบบ เพื่อใช้ต่อลงดิน เป็นการป้องกันอันตรายจากไฟลัดวงจร และใช้เป็น Shield ป้องกันการรบกวน
Signal ground หรือ Common return เป็นจุดสำคัญที่สุดที่ต้องมีในระบบ RS-232 เพราะเป็นจุดอ้างอิงของทุกสัญญาณ ยกเว้น Protective ground


Transmit data เป็นสัญญาณข้อมูลที่ส่งจาก DTE ไปยัง DCE ในขณะที่ไม่ได้ส่งข้อมูลมันจะมีสถานะเป็น Logic "1"  หรือ "Mark" หรือ "Off" หรือ -5V ถึง -15V ที่ด้านส่ง (DTE) หรือ -3V ถึง -15V ที่ด้านรับ (DCE) การส่งข้อมูลจะเกิดขึ้นได้ต้องมีสัญญาณควบคุมที่เกี่ยวข้อง "On" ก่อนคือสัญญาณ RTS, CTS, (D)CD, DTR และ DSR


Recieve data เป็นสัญญาณข้อมูลจาก DCE มายัง DTE ในขณะที่ไม่ได้ส่งข้อมูลมันจะมีสถานะเป็น Logic "1"  หรือ "Mark" หรือ "Off" หรือ -5V ถึง -15V ที่ด้านส่งหรือ -3V ถึง -15V ที่ด้านรับ ในขณะที่ไม่ได้ส่งข้อมูลมันจะมีสถานะเป็น Logic "1"  หรือ "Mark" หรือ "Off" หรือ -5V ถึง -15V ที่ด้านส่ง (DCE) หรือ -3V ถึง -15V ที่ด้านรับ (DTE) กรณีที่เป็นการสื่อสารแบบ Half-duplex สัญญาณ RD จะอยู่สถานะ "Off" ขณะที่สัญญาณ RTS อยู่ในสถานะ "On" และสัญญาณ RD จะยังคงอยู่ในสถานะ "Off" อีกชั่วระยะหนึ่งหลังจากที่สัญญาณ RTS เปลี่ยนจากสถานะ "On" มาเป็น "Off" แล้วเพื่อให้การรับ-ส่งข้อมูลเสร็จสมบูรณ์


Request to send เป็นสัญญาณจาก DTE ส่งไปให้ DCE เพื่อขอส่งข้อมูลไป ปรกติจะอยู่ในสถานะ "Off" เมื่อต้องการส่งข้อมูลจะเปลี่ยนเป็นสถานะ "On" จนกว่าการส่งเสร็จสิ้นจึงเปลี่ยนกลับมาที่สถานะ "Off" ตามเดิม ทั้งนี้ทาง DTE ต้องได้รับสัญญาณ CTS จึงจะสามารถส่งข้อมูล TD ไปยัง DCE ได้ และสัญญาณ RTS ที่กลับสู่สถานะ "Off" จะไม่สามารถเปลี่ยนเป็น "On" ใหม่ขณะที่สัญญาณ CTS อยู่ในสถานะ "On" ต้องรอจนกว่าสัญญาณ CTS เปลี่ยนมาอยู่ในสถานะ "Off" ก่อน เพื่อป้องกันการเกิด Overrun


Clear to send เป็นสัญญาณที่ DCE ส่งให้ DTE เพื่อแจ้งว่าพร้อมรับการส่งข้อมูลจาก DTE


Data set ready เป็นสัญญาณที่ DCE ส่งให้ DTE เพื่อแจ้งว่า DCE สามารถเชื่อมโยงไปยังปลายทางและพร้อมที่จะติดต่อแล้ว


Data Terminal ready เป็นสัญญาณที่ DTE ส่งให้ DCE เพื่อแจ้งว่า DTE พร้อมหรือต้องการจะติดต่อสื่อสาร ซึ่งสัญญาณ DTR นี้ต้องเกิดก่อนทาง DCE จึงจะทำการติดต่อไปยังปลายทางและเมื่อติดต่อได้แล้วจึงส่งสัญญาณ DSR มายัง DTE เพื่อแจ้งให้รู้ว่าพร้อมรับการสื่อสารแล้ว และถ้า DTR เปลี่ยนเป็น Off แปลว่า DTE ไม่ต้องการติดต่อสื่อสารแล้วทาง DCE ก็จะปิดช่องสื่อสารและเปลี่ยนสัญญาณ DSR เป็น Off ทันที คู่สัญญาณระหว่าง RTS กับ CTS เป็นเรื่องของความพร้อมเกี่ยวกับช่องสื่อสารระหว่าง DTE กับ DCE ส่วนคู่สัญญาณ DTR กับ DSR เป็นเรื่องของความพร้อมเกี่ยวกับตัวอุปกรณ์ DTE กับ DCE


Data carrier detect เป็นสัญญาณที่ DCE ส่งให้ DTE เพื่อแจ้งว่าได้รับสัญญาณพาหะจาก DCE ที่อยู่อีกด้านหนึ่งของการสื่อสาร ซึ่งหมายความว่า ช่องการสื่อสารระหว่าง DCE ทั้ง 2 ไม่ขาดตอน พร้อมที่จะทำการสื่อสารได้ ซึ่งอุปกรณ์ DTE หรือ Software ที่ควบคุมการสื่อสารมักจะตรวจสัญญาณนี้ ถ้าไม่อยู่ที่ On แสดงว่าช่องการสื่อสารขาด ก็จะไม่ทำการรับหรือส่งข้อมูล


Ring Indicator เป็นสัญญาณจาก DCE แจ้งให้ DTE รู้ว่ามีการเรียกจาก DCE ที่อยู่อีกด้านหนึ่งของการสื่อสาร ซึ่งมักจะใช้ในระบบ Automatic answering

อุปกรณ์ DCE บางรุ่นได้รับการออกแบบมาให้สามารถตรวจสอบระบบสื่อสารได้ด้วยการสั่งจาก DTE ให้ทำการ Loop back ทั้งจาก Local หรือ Remote ด้วยการใช้สัญญาณที่กล่าวมาทั้งหมดนี้


Null Modems

Null Modem ใช้สำหรับเชื่อมโยงระหว่าง DTE 2 ตัวเข้าด้วยกันโดยตรง ซึ่งโดยมากใช้ในการถ่ายข้อมูลระหว่าง Computer หรือใช้ในการพัฒนาระบบ Microprocessor หรือ Microcontroller ต่าง ๆ

Figure 1. Null modem wiring diagram. 


จะเห็นว่าใช้สายเพียง 3 เส้นคือ TD, RD และ SG และมีการต่อ Jump ที่หัวต่อแต่ละข้างอีกเล็กน้อยเท่านั้น เพื่อหลอกให้ Computer คิดว่ามันกำลังคุยกับ DCE อยู่

หมายเหตุ TD ของ Computer เครื่องหนึ่งจะต้องต่อกับ RD ของ Computer อีกเครื่องหนึ่ง แต่ถ้าเป็นการต่อระหว่าง DTE กับ DCE จริง ๆ จะต่อขาสัญญาณตรงกันโดยไม่ต้องสลับสายเช่นขา 2 ของ DTE จะต่อกับขา 2 ของ DCE และขา 3 ของ DTE จะต่อกับขา 3 ของ DCE เป็นต้น

Loopback Plugs

สำหรับ Plug ตัวนี้มีวัตถุประสงค์เพื่อช่วยในการเขียน Program ที่ติดต่อกับ Serial Port แต่อาจจะไม่สามารถใช้กับ Program ที่ใช้วิเคราะห์หาจุดเสีย (Diagnostic program) เพราะแต่ละ Program อาจจะออกแบบการเชื่อมต่อที่แตกต่างกันไป

Figure 2. Loopback plug wiring diagram.


DTE/DCE Speeds

ความเร็วของการติดต่อระหว่าง DTE กับ DCE หรือระหว่าง Computer กับ Modem ซึ่งมักจะเรียกว่า Terminal speed และความเร็วระหว่าง DCE กับ DCE หรือระหว่าง Modem กับ Modem ซึ่งมักจะเรียกว่า Line speed ปรกติ Terminal speed มักจะเร็วกว่า Line speed เช่น Modem มี speed 56K baud ขณะที่ติดต่อกับ Computer ด้วย speed 115.2Kbps เป็นต้น ซึ่ง COM Port ของ Computer ต้อง set ให้เป็น 115.2Kbps ด้วย ปัจจุบัน UART เบอร์ 16550A จะรองรับ speed ได้ 115.2Kbps และเบอร์ 16C650 จะรองรับ speed ได้ 230.4Kbps

Flow Control

การติดต่อระหว่าง DTE และ DCE จะมีการควบคุมการไหลของข้อมูล เพื่อไม่ให้เกิดการ Overflow ขึ้นได้ ซึ่งมีอยู่ 2 แบบคือ Hardware flow control และ Software flow control

สำหรับ Software flow control มักจะเรียกว่า Xon/Xoff flow control ซึ่งใช้รหัส ASCII 17 เป็นสัญญาณ Xon และใช้รหัส ASCII 19 เป็นสัญญาณ Xoff หลักการทำงานก็ง่าย ๆ คือ Modem จะมี Buffer อยู่ เมื่อ Modem รับข้อมูลจาก Computer จน Buffer ใกล้จะเต็ม มันก็จะส่งสัญญาณ Xoff ไปให้ Computer เพื่อให้ Computer หยุดส่งข้อมูลให้มันชั่วคราว และเมื่อ Buffer มีที่ว่างถึงระดับหนึ่ง Modem ก็จะส่งสัญญาณ Xon ไปให้ Computer เพื่อให้ Computer ส่งข้อมูลให้มันต่อ การควบคุมโดยวิธีนี้ประหยัดสายสัญญาณ เพราะรับ-ส่งผ่าน TD และ RD แต่อาจทำให้การสื่อสารช้าลงอย่างเห็นได้ชัดในกรณีที่ใช้กับการสื่อสารที่มี speed ต่ำ เพราะแต่ละตัวอักษร ASCII ที่รับ-ส่งจะมีขนาด 10 Bit

ส่วน Hardware flow control มักจะเรียกว่า RTS/CTS flow control จะใช้สายสัญญาณของ Serial Port ในการควบคุม ทำให้ไม่บั่นทอนความเร็วของข้อมูล หลักการทำงานคือ เมื่อ Modem มีที่ว่างเพื่อรับข้อมูล มันก็จะส่งสัญญาณ CTS ไปให้ Computer และเมื่อมันใกล้จะเต็ม มันก็จะหยุดส่งสัญญาณ CTS ไปให้ Computer

The UART (8250’s and Compatibles)

เครื่อง PC ส่วนใหญ่จะใช้ UART ในกลุ่ม 8250 ซึ่งรวมทั้ง 16450, 16550, 16650 และ 16750

Figure 3. Pin diagram for 16450, 16550 & 8250 UART



UART เบอร์ 16550 มีลักษณะเหมือนกับเบอร์ 16450 และ 8250 ยกเว้นขา 24 และขา 29 โดยเบอร์ 8250/16450 ขา 24 จะเป็น Chip Select Out เป็นสัญญาณบอกว่า Chip ตัวนี้ได้ถูกเลือกใช้งานอยู่ และขา 29 ไม่ได้ใช้งาน ส่วนเบอร์ 16550 จะใช้ขา 24 เป็นสัญญาณ Transmit Ready และขา 29 เป็นสัญญาณ Receive Ready ซึ่งสามารถใช้กับ Direct Memory Access (DMA) โดยสามารถกำหนด Mode การทำงานได้ 2 Mode คือ Mode 0 หรือ 16450 Mode เป็น Single transfer DMA และ Mode 1 เป็น Multi-transfer DMA

Mode 0 ใน Mode นี้ RXRDY จะเป็น Active low เมื่อมีข้อมูลอย่างน้อย 1 Byte อยู่ใน Buffer ของภาครับ และจะเป็น Inactive high เมื่อไม่มีข้อมูลใน Buffer ของภาครับ ส่วน TXRDY จะเป็น Active low เมื่อไม่มี ข้อมูลใน Buffer ของภาคส่ง และจะเป็น Inactive high หลังจากที่มีข้อมูล Byte แรกเข้าสู่ Buffer ของภาคส่ง การเข้าสู่ Mode 0 จะเกิดขึ้นได้จาก 2 กรณีคือ เมื่อ FIFO Buffer ถูก Disable โดย Bit 0 ของ FIFO Control Register (FCR) หรือเมื่อ FIFO Buffer ได้ถูก Enable ไว้แต่เลือก DMA Mode 0 ไว้โดย Bit 3 ของ FCR

Mode 1 ใน Mode นี้ RXRDY จะเป็น Active low เมื่อข้อมูลใน Buffer ถึงระดับที่กำหนดหรือเมื่อ 16550 เกิด Time out และจะกลับสู่สภาพ Inactive เมื่อไม่มีข้อมูลใน Buffer ของภาครับ ส่วน TXRDY จะเป็น Active low เมื่อไม่มีข้อมูลใน Buffer ของภาคส่ง และจะเป็น Inactive เมื่อมีข้อมูลอยู่เต็มใน Buffer ของภาคส่ง การเข้าสู่ Mode 1 จะเกิดขึ้นเมื่อ FIFO Buffer ได้ถูก Enable และกำหนด DMA ให้ทำงานใน Mode 1 เท่านั้น

ปรกติ UART ทุกตัวจะมีระดับสัญญาณตามมาตรฐาน TTL คือ 0Volt และ +5Volt ดังนั้นจึงต้องมีวงจรที่ทำหน้าที่เป็น RS-232 Converter เพื่อแปลงสัญญาณระหว่าง TTL และ RS-232 อีกทีหนึ่ง เช่น IC เบอร์ DS-1488 และ DS-1489 ที่ใช้ในเครื่อง PC ทั่วไป และใช้ไฟ +12Volt กับ –12Volt ที่มีอยู่ในเครื่อง PC เป็นระดับสัญญาณด้าน RS-232

Table 2. Pin assignments for 16550A UART

Pin No.

Name

Note

1 : 8

D0 : D7

Data Bus

9

RCLK

Receiver Clock Input. The frequency of this input should equal the receiver's baud rate x 16

10

RD

Receive Data

11

TD

Transmit Data

12

CS0

Chip Select 0 : Active High

13

CS1

Chip Select 1 : Active High

14

nCS2

Chip Select 2 : Active Low

15

nBAUDOUT

Baud Output : Output from programmable baud rate generator. Frequency = Baud rate x 16

16

XIN

External crystal input. Used for baud rate generator oscillator.

17

XOUT

External crystal output.

18

nWR

Write line (inverted).

19

WR

Write line (not inverted).

20

VSS

Connected to common ground.

21

RD

Read line (inverted).

22

nRD

Read line (not inverted).

23

DDIS

Driver disable. This pin goes low when CPU is reading from UART. Can be connected to bus transceiver in case of high capacity data bus.

24

nTXRDY

Transmit ready.

25

nADS

Address strobe. Used if signals are not stable during read or write cycle.

26

A2

Adderss bit 2

27

A1

Address bit 1

28

A0

Address bit 0

29

nRXRDY

Receive ready.

30

INTR

Interrupt output.

31

nOUT2

User output 2

32

nRTS

Request to send.

33

nDTR

Data terminal ready.

34

nOUT1

User output 1

35

MR

Master reset.

36

nCTS

Clear to send.

37

nDSR

Data set ready.

38

nDCD

Data carrier detect.

39

nRI

Ring indicator.

40

VDD

Connected to +5Volt power supply.


รายการหน้าเว็บย่อย

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

โพสต์6 เม.ย. 2553 02:17โดยวิสิทธิ์ แผ้วกระโทก   [ อัปเดต 20 มี.ค. 2556 23:17 ]

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

Serial Pinouts (DB25 & DB9)


Serial Port มีขั้วต่อ 2 แบบคือ แบบ D-Type 25 Pin และแบบ D-Type 9 Pin ซึ่งทั้ง 2 แบบ จะเป็นชนิดตัวผู้ทางด้านของ Computer ดังนั้นอุปกรณ์ที่จะนำมาต่อกับ Computer จึงต้องใช้ขั้วต่อชนิดตัวเมีย Table 1. ข้างล่างแสดง ชื่อสัญญาณของขาต่าง ๆ

(Male at the computer side)

(Female at the cable side)

25 PIN D-SUB MALE at the computer.

Pin Name Dir Description
1 SHIELD --- Shield or Protective Ground
2 TXD --> Transmit Data
3 RXD <-- Receive Data
4 RTS --> Request to Send
5 CTS <-- Clear to Send
6 DSR <-- Data Set Ready
7 GND --- Signal Ground
8 CD
Carrier Detect
9 n/c - Reserved for Data Set Testing
10 n/c - Reserved for Data Set Testing
11 n/c - Unassigned
12   <-- Secondary Carrier Detect
13   <-- Secondary Clear to Send
14   --> Secondary Transmit Data
15   <-- Transmit Signal Element Timing (DCE)
16   <-- Secondary Recieve Data
17   <-- Recieve Signal Element Timing (DCE)
18 n/c - Unassigned
19   --> Secondary Request to Send
20 DTR --> Data Terminal Ready
21   <-- Signal Quality Detect
22 RI <-- Ring Indicator
23   <-> Data Signal Rate Select (DCE/DTE)
24   --> Transmit Signal Element Timing (DTE)
25 n/c - Unassigned

Note: Direction is DTE (Computer) relative DCE (Modem).
Note: Do not connect SHIELD(1) to GND(7).

Note: The red colored signal is rarely use.



(Male at the computer side)
(Female at the cable side)

9 PIN D-SUB MALE at the Computer.
Pin Name RS232 V.24 Dir Description
1 CD CF 109 <----- Carrier Detect
2 RXD BB 104 <-----Receive Data
3 TXD BA 103 ------> Transmit Data
4 DTR CD 108.2 ------> Data Terminal Ready
5 GND AB 102 -------- Signal Ground
6 DSR CC 107 <------ Data Set Ready
7 RTS CA 105 ------> Request to Send
8 CTS CB 106 <------ Clear to Send
9 RI CE 125 <------ Ring Indicator

Note: Direction is DTE (Computer) relative DCE (Modem).
Note: RS232 column is RS232 circuit name.
Note: V.24 column is ITU-TSS V.24 circuit name.

 

Table 1. D-Type 25 and D-Type 9 Connector

Pin No. (D-Type 25)

Pin No. (D-Type 9)

Abbreviation

Full Name

2

3

TD

Transmit Data

3

2

RD

Receive Data

4

7

RTS

Ready To Send

5

8

CTS

Clear To Send

6

6

DSR

Data Set Ready

7

5

SG

Signal Ground

8

1

(D)CD

(Data) Carrier Detect

20

4

DTR

Data Terminal Ready

22

9

RI

Ring Indicator

 

รายการหน้าเว็บย่อย

1-10 of 11