Search This Blog

Saturday, April 19, 2008

Asynchronous Serial Communication- RS232, RS422 and RS485

ဒီ serial communication မှာဆိုရင် data byte ကို bit တစ်ခုချင်းစီ အစီအစဉ်လိုက် တစ်ခုပြီးတစ်ခု ပို့တဲ့ အတွက် ဝါယာအများကြီးသုံးစရာမလိုတော့ပဲ ဝါယာတစ်ခုနဲ့တင် ပို့လို့ရတဲ့ အားသာချက်ရှိပါတယ်။ ပို့တဲ့အခါ byte ကနေ bit တစ်ခုချင်း serial ပြောင်းပြီးထွက်လာဖို့၊ လက်ခံတဲ့အခါ တစ်ခုပြီးတစ်ခု ဝင်လာတဲ့ serial bit တွေကို byte အဖြစ်ပြန်တည်ဆောက်ဖို့ အတွက် UART ကိုသုံးကြပါတယ်။

UART


UART တစ်ခုဟာ serial bit stream ပြောင်းပေးနိုင်ရုံတင် မကပဲ start bit, parity bit, stop bit များထည့်ပေးခြင်း အစရှိတဲ့ လုပ်ငန်းများကိုလည်း Asynchronous Serial Communication Protocol နဲ့ကိုက်ညီအောင် ဆောင်ရွက်လုပ်ဆောင် ပေးပါတယ်။

Start Bit



ဒီလိုပါ UART တစ်ခုဟာ ပို့စရာ data မရှိပဲ idle ဖြစ်နေရင် output ကို 1 မှာထားပါတယ်။ ဒီအခါ လက်ခံမယ့် UART ဟာ idle ဖြစ်လို့ ထုတ်ထားတဲ့ 1 လား၊ ပို့ပေးနေတဲ့ ဒေတာ က 1 လား ခွဲခြားသိဖို့လိုလာပါတယ်။ အဲဒါကို ဖြေရှင်းဖို့အတွက် start bit ကိုသုံးပါတယ်။ 0 bit တစ်ခုကို start bit အနေနဲ့ သုံးပါတယ်။ လက်ခံနေတဲ့ UART တစ်ခုဟာ 0 ရောက်မလာမချင်း ရှိနေတဲ့ 1 ကို idle လို့ယူဆပါတယ်။ ပထမဆုံး 0 ရောက်လာတာနဲ့ အဲဒါကို start bit လို့ယူဆပြီး နောက်ဝင်လာမယ့် bit တစ်ခုက စပြီး data အနေနဲ့ လက်ခံပါတယ်။

Baud Rate



data bit တစ်ခုနဲ့ တစ်ခုကြားက အချိန်အကွာအဝေး ကို Baud rate ကသတ်မှတ်ပါတယ်။ ဥပမာ baud rate က 1 kHz ဆိုရင်၊ bit တစ်ခု အတွက် time period က 1/(1kHz) = 1 ms ကြာမှာ ဖြစ်ပါတယ်။ အသုံးများတဲ့ baud rate ကတော့ 9600 ဖြစ်ပါတယ်။

Data Bits


Data ပို့တဲ့အခါ ပို့တဲ့ UART နဲ့ လက်ခံတဲ့ UART data bit အရေအတွက်ခြင်းတူဖို့လိုပါတယ်။ ပို့တဲ့ အခါ 5 bit data ကနေ 8 bit data ထိ ပို့တတ် ပါတယ်။ ဥပမာ ASCII data ဆိုရင် ပို့တာ 7 bit ပဲရှိတဲ့အတွက် လက်ခံရင်လဲ 7 bit လက်ခံဖို့လိုပါတယ်။ Data bits တွေကိုပို့တဲ့ အခါ LSB ကနေ အရင်စပို့ပါတယ်။ အသုံးများတာကတော့ 8 bit ပါ။

Parity Bit


လက်ခံလိုက်တဲ့ data က မှန်ကန်ကိုက်ညီမှု ရှိရဲ့လား ပြန်စစ်ဖို့အတွက် parity bit ကိုလဲ data bits တွေရဲ့ နောက်မှာ အပိုထည့်ပေး တတ်ပါတယ်။ 1 အရေအတွက် စုံဂဏန်းဖြစ်အောင် ထည့်ပေးရင် Even parity၊ မ ဂဏန်းဖြစ်အောင် ပေါင်းထည့်ပေးရင် Odd parity ပါ။ ပို့တဲ့ UART နဲ့ လက်ခံတဲ့ UART parity ချင်းလည်း ကိုက်ညီဖို့လိုပါတယ်။ များသောအားဖြင့် Parity သုံးလေ့ မရှိပါဘူး။

Stop Bit


8 bits ရှိတဲ့ data byte တစ်ခုနဲ့ တစ်ခုကြားမှာ ခြားပေးဖို့အတွက် stop bits တွေကိုသုံးပါတယ်။ 1 ကို stop bit အနေနဲ့ သုံးပါတယ်။ Stop bit ကို တစ်ခု၊ သို့မဟုတ် နှစ်ခု သုံးလို့ရပါတယ်။ data တွေ၊ parity bit တွေ ပို့ပြီးတဲ့ အခါ နောက်မှာ 1 တစ်ခုပေါင်း ပေး၊ ဒါမှမဟုတ် နှစ်ခု ပေါင်းထည့် ပေးတာပါ။ အသုံးများတာတော့ stop bit တစ်ခုထဲ ပါပဲ။
အောက်မှာ နမူနာ အနေနဲ့ data byte 0x41 ကို UART တစ်ခုကနေ 9600, 8N1 နဲ့ ပို့တာကို ပြထားပါတယ်။ ဆိုလိုတာက
Baud rate = 9600
Data bit = 8 bits
Parity = No parity (N= No parity, E= Even parity, O= Odd parity)
Stop bit= 1 stop bit
လို့ ဆိုလိုတာပါ။ No parity ဖြစ်တဲ့အတွက် data ကို ပို့ပြီးတဲ့ အခါ parity bit ကို မထည့်ပဲ stop bit တန်းလာပါတယ်။

Forms of UART


UART တစ်ခုဟာ ပုံစံ အမျိုးမျိုးဖြစ်နိုင်ပါတယ်။ ပထမ ပုံစံကတော့ သီးသန့် IC တစ်ခုအနေနဲ့ ပါ။ အသုံးများတဲ့ IC ကတော့ 16550 ပါ။ CMOS ဆိုရင်တော့ 16C550 ပေါ့ဗျာ။ သူ့မှာ buffer တွေ၊ interrupt တွေ၊ အစရှိသဖြင့် ပါပြီးသားမို့ သုံးရတာ လွယ်ကူ အဆင်ပြေပါတယ်။ သူ့ရဲ့ serial data က sout ကနေ ထွက်လာတာပါ။ Basic configuration ကို အောက်မှာ ပြထားပါတယ်။

နောက်တစ်မျိုးကတော့ microcontroller ထဲမှာ တစ်ခါတည်း built in ပါပြီးသားမျိုးပါ။ နောက်ဆုံးအနေနဲ့ ကတော့ ရိုးရိုး IO pin ကိုပဲ software နဲ့ရေးပြီး emulate လုပ်လို့ရ တဲ့ software UART မျိုးလဲ လုပ်လို့ရပါတယ်။

RS232


UART တစ်ခုက ပုံမှန်အားဖြင့် 1 ဆိုရင် 5V ထုတ်ပေးပြီး၊ 0 ဆိုရင် 0V ထုတ်ပေးပါတယ်။ UART တစ်ခုက ထွက်လာတဲ့ voltage signal ကို များသောအားဖြင့် external device တွေနဲ့ ဆက်ဖို့ သင့်တော်တဲ့ signaling levels တွေအဖြစ်ပြောင်းဖို့ transceiver တစ်ခုခုခံပြီး ထုတ်ပေး လေ့ရှိပါတယ်။ အသုံးများတဲ့ standard တစ်ခုကတော့ RS232 ပါ။ RS232 transceiver တစ်ခုရဲ့ အလုပ်က 1 ဆိုရင် -10V ပြောင်းပေးပြီး၊ 0 ဆိုရင် +10V အဖြစ် အပြန်အလှန် ပြောင်းပေးတာပါ။ တကယ်တော့ အပေါင်း၊အနုတ် 3V ကနေ 25V အထိက valid ဖြစ်ပါတယ်။ အသုံးများတဲ့ IC ကတော့ MAX232 ဖြစ်ပါတယ်။ သူ့ရဲ့ configuration ကို အောက်က ပုံမှာ ပြထားပါတယ်။

Capacitor အသေး (0.1uF) နဲ့ IC အရွယ်အစား အသေးအတွက်တော့ MAX202 ကို အသုံးများပါတယ်။ အခုနက 16C550 နဲ့ စပ်ဆက်ပြီး ပြောရမယ်ဆိုရင်တော့ အဲဒီ UART ရဲ့ sout ကထွက်လာတဲ့ 0V,5V ကို သူ့ရဲ့ pin number 11 နဲ့ဆက်ရင် pin number 14 ကနေပြီး +10V,-10V ဆိုပြီး transmit (Tx) လိုင်းအနေနဲ့ထွက်လာမှာပါ။ အဲဒီလိုပဲ receive (Rx) လိုင်းကနေ ဝင်လာတဲ့ +10V, -10V တွေဟာလဲ MAX232 ရဲ့ pin number 13 နဲ့ဆက်ပေးမယ်ဆိုရင် သူ့ရဲ့ pin number 12 ကနေ 0V,5V အနေနဲ့ ပြန်ထွက်လာပြီး UART ရဲ့ sin နဲ့ ဆက်လို့ရသွားပါတယ်။
အောက်မှာ RS232 ရဲ့ ဆက်သွယ်ပုံကိုပြထားပါတယ်။ ပုံမှန်အားဖြင့် transmit and receive data lines တွေကိုပဲ သုံးလေ့ရှိတဲ့ အတွက် Tx တစ်လိုင်း၊ Rx တစ်လိုင်း နဲ့ Ground ဝါယာ တစ်လိုင်း စုစုပေါင်း သုံးလိုင်း သုံးဖို့လိုပါတယ်။ ပုံပေါ်မှာ ကလစ်နှိပ်ပြီး ပုံကြီးကြည့်နိုင်ပါတယ်။

RS232 ရဲ့ Tx နဲ့ Rx ကို တစ်ခါတလေ ခွဲခြားဖို့ လိုလာပြီဆို ကြိုးတွေကို open လုပ်ပြီး မီတာ ကိုသုံးပြီး အလွယ်အကူတိုင်းကြည့်နိုင်ပါတယ်။ Tx နဲ့ Ground ကြားမှာ ပုံမှန်အားဖြင့် -10V လောက်တွေ့ရမှာဖြစ်ပြီး၊ Rx နဲ့ Ground ကြားမှာ ဗို့မရှိပါဘူး။ RS232 ကို unbalanced lines လို့ဆိုပါတယ်။ Tx ဝါယာနဲ့ Ground ဝါယာ ကြားက ဗို့ဟာ transmit voltage ဖြစ်ပြီး၊ Rx ဝါယာနဲ့ Ground ဝါယာကြားက ဗို့ဟာ receive voltage ဖြစ်ပါတယ်။

RS232 communication မှာ ပုံမှန်အားဖြင့် data transmit line (Tx) နဲ့ data receive line (Rx) ကိုပဲ သုံး ပေမယ့် တစ်ခုနဲ့ တစ်ခု handshaking လုပ်ဖို့ အတွက် control and status lines တွေကိုလဲ သုံးတတ်ကြပါတယ်။ Primary Communication lines တွေထဲမှာဆို Tx နဲ့ RTS က အထွက်ဖြစ်ပြီး၊ Rx နဲ့ CTS က အဝင်ဖြစ်ပါတယ်။ Status and Control lines တွေမှာဆိုရင်တော့ DTR က အထွက်လိုင်းဖြစ်ပြီး၊ DSR နဲ့ CD က အဝင်လိုင်း ဖြစ်ပါတယ်။ သူတို့ အကြောင်းအောက်မှာ ဆက်ပြောပါမယ်။ RS232 device တွေ အကြောင်းပြောတဲ့ အခါမှာ ကွန်ပျူတာကို DTE ( Data Terminal Equipment) လို့ခေါ်ပြီး၊ ကွန်ပြူတာနဲ့ ဆက်သုံးတဲ့ Modem သို့ device ကို DCE (Data Circuit-Terminating Equipment) လို့ခေါ်ပါတယ်။
RTS- Request To Send signal ကတော့ DTE ကနေ DCE ကို ပို့ချင်တဲ့ အကြောင်း လှမ်း request လုပ်တာပါ။ ပုံမှန် အားဖြင့် logic 1 အနုတ်ဗို့ မှာ ပဲရှိပြီး request လုပ်တာနဲ့ logic 0 အပေါင်း ဗို့ ထုတ်ပေးပါတယ်။
CTS- Clear To Send signal ကတော့ DCE က ပို့ဖို့ ready ဖြစ်တဲ့ အတွက် စပို့တော့ ဆိုတဲ့အကြောင်း DTE ကို အကြောင်းပြန်တာပါ။ ပုံမှန် အားဖြင့် logic 1 အနုတ်ဗို့ မှာ ပဲရှိပြီး DCE ကနေအကြောင်းပြန်ဖို့ logic 0 အပေါင်း ဗို့ ထုတ်ပေးပါတယ်။
DSR- DCE Ready (Data Set Ready) ကတော့ DCE (device) က turn on ဖြစ်ပြီး ready ဖြစ်နေပြီဆိုတဲ့ အကြောင်း DTE ကွန်ပျူတာကို လှမ်းပြောတာပါ။ Ready ဖြစ်ပြီဆို DCE ကနေ logic 0 အပေါင်း ဗို့ ထုတ်ပေးပါတယ်။
DTR- DTE Ready ကတော့ DTE ကွန်ပျူတာကနေ communication ကိုလုပ်ချင်လို့ အသင့်ပြင်တော့ လို့ DCE (device) ကို လှမ်းပြောတာပါ။ ပုံမှန် အားဖြင့် logic 1 အနုတ်ဗို့ မှာ ပဲရှိပြီး DTE ကနေ DTR လိုင်းကို true လုပ်တဲ့အခါ logic 0 အပေါင်း ဗို့ ထုတ်ပေးပါတယ်။
CD- Carrier Detect (Received Line Signal Detector) ကတော့ DCE က modem ဖြစ်တဲ့အခါမှာ သုံးပါတယ်။ တယ်လီဖုန်းလိုင်းကို တခြားဖက် အဝေးမှာရှိတဲ့ modem က ဖြေလိုက်တဲ့ answer tone ကို ရတဲ့အခါမှာ ဒီဖက် modem က ကွန်ပျူတာ ကို logic 0 အပေါင်း ဗို့ ထုတ်ပေးပါတယ်။
RI- Ring Indicator ကတော့ ring signal ကို ရတဲ့အခါ modem က ကွန်ပျူတာ ကို logic 0 အပေါင်း ဗို့ ထုတ်ပေးပါတယ်။ Ring signal ရတဲ့ အချိန်ပဲ အပေါင်းထုတ်ပေးပြီး ring signal အချင်းချင်းကြားနဲ့ ring signal မရှိတဲ့ အချိန်တွေမှာ အနုတ်ဖြစ်နေပါတယ်။
RS232 ရဲ့ ဝါယာ connectors တွေ အကြောင်းဆက်ပြောပါမယ်။

ပုံမှာ ပြထားတဲ့ အတိုင်း ကွန်ပျူတာ (DTE) မှာ RS232 အတွက် Male DB9 ပါပြီး သူနဲ့ ဆက်သုံးရမယ့် (DCE) device မှာ Female DB9 connector ပါလေ့ရှိပါတယ်။ (ကွန်ပျူတာဘက်က) DTE ဘက် male connector ရဲ့ pin connection တွေကို အောက်ကပုံမှာ ဖော်ပြထားပါတယ်။

pin 1 = CD- Carrier Detect (input)
pin 2 = Rx- Receive Data (input)
pin 3 = Tx- Transmit Data (output)
pin 4 = DTR- Data Terminal Ready (output)
pin 5 = GND- System Ground
pin 6 = DSR- Data Set Ready (input)
pin 7 = RTS- Request To Send (output)
pin 8 = CTS- Clear To Send (input)
pin 9 = RI - Ring Indicator (input)

(Device ဘက်က) DCE ဘက် female connector ရဲ့ pin connection တွေကိုလဲ အောက်က ပုံမှာ ကြည့်နိုင်ပါတယ်။

pin 1 = CD- Carrier Detect (output)
pin 2 = Tx- Transmit Data (output)
pin 3 = Rx- Receive Data (input)
pin 4 = DTR- Data Terminal Ready (input)
pin 5 = GND- System Ground
pin 6 = DSR- Data Set Ready (output)
pin 7 = CTS- Clear To Send (input)
pin 8 = RTS- Request To Send (output)
pin 9 = RI - Ring Indicator (output

RS422 and RS485


RS422 နဲ့ RS485 နှစ်ခုက ဝါယာနှစ်ခု ကြားက difference voltage ကိုပဲ ကြည့်ပြီး ခြားနားချက် 0.4V လောက်ရှိရင်ကို လုပ်ဆောင်နိုင်ပါတယ်။ ထုတ်ပေးတဲ့ ဗို့ကတော့ +12V နဲ့ -12V ကြားရှိရမယ်လို့ပြောပါတယ်။ +Tx နဲ့ -Tx ကြားကအထွက်ဗို့ဖြစ်ပြီး၊ +Rx နဲ့ -Rx ကြားကဗို့က အဝင်ဗို့ဖြစ်ပါတယ်။ သူက Ground နဲ့ transmit လိုင်းကြားက ဗို့ကို မကြည့်ပဲ၊ +Tx, -Tx လိုင်းနှစ်လိုင်းကြားက ဗို့ကိုကြည့်တဲ့အတွက် balance လိုင်းလို့ခေါ်ပါတယ်။ Common mode noise တွေကို ပိုခံနိုင်ရည်ရှိ်ပါတယ်။ RS232 နဲ့ ယှဉ်ရင် ဒေတာတွေကို မြန်မြန်နဲ့၊ ဝေးဝေး ပို ပို့ ပေးနိုင်ပါတယ်။

Note:
-200mV to +200mV = 0.4 V
-6V to +6V = 12V
RS485 နဲ့ ကွာခြားတဲ့ အချက်ကတော့ RS232 တို့၊ RS422 တို့က ဝါယာ bus တစ်ခုမှာ လက်ခံတဲ့ receiver အများကြီးရှိလို့ ရပေမယ့် transmit လုပ်ပေးတဲ့ driver circuit တစ်ခုပဲ ရှိလို့ရပါတယ်။ RS485 မှာတော့ transmit လုပ်မယ့် driver circuit ကို enable, disable လုပ်လို့ရတဲ့ data enable ပါတဲ့အတွက် ဝါယာ bus တစ်ခုမှာ လက်ခံတဲ့ receiver အများကြီးရှိလို့ ရသလို၊ ပို့တဲ့ transmitter တွေလဲ အများကြီး ထားလို့ရပါတယ်။ ပုံမှန်အားဖြင့် RS422 က transmit အတွက် ဝါယာနှစ်ခု (+Tx, -Tx)၊ receive အတွက် ဝါယာနှစ်ခု (+Rx, -Rx) စုစုပေါင်း ဝါယာလေးခုသုံးပြီး၊ RS485 မှာတော့ transmit အတွက်ရော၊ receive အတွက်ရော ဝါယာနှစ်ခုထဲကိုပဲ တလှည့်စီ share ပြီး half duplex သုံးလေ့ရှိပါတယ်။ RS485 ကို ဝါယာလေးခုနဲ့ Full duplex သုံးချင်ရင်လဲရပါတယ်။ အောက်က ပုံမှာ MAX481 transceiver IC ကို သုံးပြီး RS485 ဆက်သွယ်ပုံကို ပြထားပါတယ်။ ဝါယာ နှစ်လိုင်းထဲ ကိုပဲ သုံးထားတဲ့ အတွက် တစ်ခုက ပို့နေရင် တခြားတစ်ခုက ပို့လို့မရတဲ့အတွက် half duplex ပဲရပါတယ်။

RS485 မှာ transmit အတွက် ဝါယာ ၂ လိုင်း၊ receive အတွက် ဝါယာ ၂ လိုင်း စုစုပေါင်း ဝါယာ လေးလိုင်း သုံးမယ်ဆိုရင် Transmit, Receive ပြိုင်တူလုပ်လို့ရတဲ့ အတွက် Full duplex ဖြစ်ပါတယ်။ အောက်မှာ RS422 အတွက်ရော၊ RS485 အတွက်ရော သုံးလို့ရတဲ့ အသုံးများတဲ့ transceiver IC MAX491 ရဲ့ ဆက်သွယ်ပုံကို ပြထားပါတယ်။ MAX491 ကို half duplex သုံးချင်ရင် +Tx နဲ့ +Rx လိုင်းကိုပူး၊ -Tx နဲ့ -RX လိုင်းကိုပူးလိုက်ရင် ရပါတယ်။

ပြောရမယ်ဆိုရင် RS485 ကို Full duplex ဝါယာလေးခုသုံးပြီး transmit driver circuit ကို အမြဲ enable အသေလုပ်ထားလိုက်ရင် RS422 ဖြစ်သွားတာပါပဲ။ RS422 ကို RS232 ရဲ့ အကွာအဝေး ကို ပိုများအောင် extend လုပ်ဖို့ အတွက်သုံးလေ့ ရှိကြတာပါ။ ပို့ရမယ့် အကွာအဝေးက အရမ်းဝေးတဲ့ အခါ RS232 နဲ့ အဆင်မပြေတဲ့အခါမျိုးမှာ RS422 converter ကိုသုံးပို့ပြီး လက်ခံတဲ့ဘက်မှာလဲ converter နဲ့ RS232 ပြန်ပြောင်းသုံးကြပါတယ်။
RS232 ရဲ့ အထွက်ကို RS422/RS485 ရဲ့ အဝင်နဲ့ ဝါယာနှစ်ကြိုးထဲသုံးပြီး တန်းဆက်ပြီးသုံးကြည့်ဘူးတာ အဆင်ပြေပါတယ်။ RS232 ရဲ့ Tx ကို RS422 ရဲ့ -Rx နဲ့ဆက်ပြီး၊ RS232 ရဲ့ Ground ကို RS422 ရဲ့ +Rx လိုင်းနဲ့ဆက်တာပါ။
အောက်မှာ RS422, RS485 half duplex နဲ့ RS485 full duplex တို့ရဲ့ ဆက်သွယ်ပုံတွေကို ယှဉ်ပြထားပါတယ်။
ပထမ တစ်ခုက RS422 ပါ။ တစ်ခု တစ်ခု ချင်းပဲ ဆက်သွယ်လေ့ရှိပါတယ်။ Bus တစ်လိုင်းမှာ receiver အများကြီးရှိနိုင်ပေမယ့် transmitter တစ်ခုထဲပဲရှိနိုင်ပါတယ်။ Transmit driver ကိုထိန်းလို့မရပါဘူး။

RS485 half duplex ပါ။ Driver Enable, Receiver Enable ပါတာကို သတိပြုပါ။ Bus တစ်ခုမှာ Node တွေအများကြီး (ပုံမှန်အားဖြင့် ၃၂ ခုလောက်ထိ) ဆက်လို့ရပါတယ်။

RS485 full duplex ပါ။

No comments:

Post a Comment