Search

'Protocol'에 해당되는 글 7건

  1. 2012.10.10 USB.04 (4)
  2. 2012.10.05 USB.03
  3. 2012.10.04 USB.02
  4. 2012.09.28 USB.01 (2)
  5. 2012.09.10 DMX-3 (1)
  6. 2012.08.31 DMX512-2
  7. 2012.08.29 DMX512

USB.04

Protocol 2012.10.10 16:04 Posted by Dwarp

USB를 해 봅시다.

Original USB

   벌써 USB 네번째 입니다. 저번 시간까지는  Device의 프로토콜 중 초기화 부분을 봤었고 이번 시간에는 실제로 이런 통신이

 

이루어 지는지 확인해 본다고 했습니다. 제가 사용할 MCU도 언급을 했었죠~ CC2540입니다. 블루투스 로우 에너지 용으로

 

출시된 SOC인데 USB가 내장되어 있습니다. 그럼 시작해 볼까여?

 

 

   초기화 과정의 시작은 USB 버스를 Reset시킨다고 했습니다. Reset은 10ms 정도 Low로 만들어 주면 디바이스가 알아먹어야

 

하는데 CC2540은 USB 리셋이 걸리면 인터럽트가 걸리게 되어 있네요. (CC2540의 USB 기능은 따로 언급하지 않겠습니다.

 

USB만 신경써도 산더미같은데 MCU까지 하려면 늙고 병듭니다.) 그래서 실제로 USB를 꽂았을 때 버스 리셋이 걸리는지 확인

 

해 보았습니다. 인터럽트에서 리셋이 걸리면 그대로 멈추면 RESET이라는 글자를 표시하도록 프로그램 했습니다.

 

 

 

 

   뿅 하고 USB를 꽂자마자 위 사진처럼 리셋이 걸리는 군요! 코드는 USB 활성화화 USB 인터럽트 루틴만 추가했습니당. ㅎㅎ

 

별거 없다라는 생각이 드는군요. 이제 SETUP 토큰을 EP0부터 읽어들여야 할까요? 아닙니다. SETUP 토큰의 내용은 PID +

 

ADDRESS + Endpoint + CRC5 입니다. 이런 건 하드웨어에서 처리해 줘야쥐~~ 예상하건데 거의 대부분의 MCU에 내장된

 

USB는 왠만한 건 거의 하드웨어로 구성되어 있을 거에요. CC2540도 마찬가지입니다. 따라서 특별히 Setup으로 날라온 PID

 

의 종류를 구분하는 루틴도 Address가 내 Address가 맞는지 몇번 Ep로 통신할건지 등등의 프로그램이 필요가 없죠. 물론

 

순수하게 소프트웨어로 구현하고 싶으신 분들도 계실거에요. RESET 부터 시작해서 전부. 도전해보셔도 될 것 같네요. ㅎㅎ

 

   그럼 SETUP 패킷은 넘어가구요. SETUP 다음에 오는 데이터가 어떤 데이터인가 봅시다. 리셋 다음에는 어드레스라고

 

나와 있었기 때문에 어드레스를 설정하겠다는 내용이 나가겠죠?  역시 PID는 MCU에서 알아서 처리할 거에요. 그러면 EP0를

 

읽어봅시당. MCU는 SETUP 토큰 후에 DATA 토큰에서 데이터가 8byte가 아니면 버려버립니다. SETUP DATA는 8BYTE!

 

정상적이면 FIFO에 저장을 하고 인터럽트를 발생시킵니다. 자 예상은 00(type) : 05(type number) : XX(주소) : 00 00 : 00 00

 

이었죠? 자! 확인들어 갑니다!!!

 

 

  뷁!!!!!!!!!!!!!! 80 06 00 01 00 00 40 00 이 나왔습니다. -_-;;; 죽여붜려~~ 에라이~ 실패군요. ㅎㅎ 실패라기보단 USB 메뉴얼을

 

너무 허접하게 읽은게죠. ㅠㅠ 뭐 어쨌든 이 코드는 뭘까요. 봅시다. (전으로 돌아가기 싫으시죠? 표 또 올립니다. ㅎㅎ)

 

 

   80은 bmRequestType 필드였죠? 첫번째 비트가 1이니까.... Device to Host입니다. 호스트가 뭔가 정보를 받길 원하는 군요.

 

무슨 정보 일까요? 다음 필드에 있겠죠? bRequest 번호가 0x06 6번이네요. 6번은 GET_DESCRIPTOR입니다. 그 다음 2byte는

 

wValue인데 설명에 Descriptor type and Descriptor Index 네요. 이건 뭘까요? 또 표 갑니다. 표를 보니 1은 Device입니다.

 

후 또 그다음 2byte는 wIndex인데 Zero or Language ID 라고 되어 있지만 00 00인거 보니까 그냥 Zero군요. 마지막 필드는

 

wLength이고 40 00입니다. Descriptor Length라고 되어 있는데 -_- 헥사로 40 00 이면 열나 큰데?????!!!! 뭐지? 16384(Dec)?

 

아~~ 여기서 안드로메다로~~~ 잘못 이해하고 있나요? 받는 구문이 틀렸나요? 아~ 몇번을 다시 해도 마찬가지입니다. ㅠㅠ

 

그래도 -_-+ 한가지는 건졌네요. reset -> address 이지만 그 전에 몰래 descriptor를 먼저 요청한다는거 ㅋㅋㅋㅋ

 

USB 이좌식! 어쨌든 Device descriptor를 요청한다는 것은 확실하구요. Device는 모든 Standard Request에 요청할 의무가

 

있으므로 Descriptor를 보내야겠죠? 하지만 아직 우리는 Device Descriptor를 공부한 적이~~~~ 없어여~~~~~ ㅎㅎ

 

자 정리하자면 USB RESET을 확인하였고 그 다음에는 주소를 설정하는 것이 아니라 Device Descriptor를 요청합니다.

 

그럼 당연히 다음 시간에는 Device Descriptor를 살펴봐야겠죠? 뭐 40 00 이라는 사소한 문제가 남아있긴 하지만 ... 음...

 

다음 시간까지 찾아내서 반드시 -_-+ 저놈의 정체를 밝히도록 하겠습니다.

 

다음 시간에 뵈여  - Dwarp -

저작자 표시
신고

'Protocol' 카테고리의 다른 글

USB.04  (4) 2012.10.10
USB.03  (0) 2012.10.05
USB.02  (0) 2012.10.04
USB.01  (2) 2012.09.28
DMX-3  (1) 2012.09.10
DMX512-2  (0) 2012.08.31

USB.03

Protocol 2012.10.05 11:03 Posted by Dwarp

USB를 해 봅시다.

Original USB

   USB 세번째 입니다. 저번 시간까지는 기본적인 USB의 통신 프로토콜에 대해 공부했습니다. 오늘 원래 기본적인

 

소프트웨어 구조체나 함수를 정의해보려고 했으나 집에서 조금 더 문서를 보니깐 산넘어 산입니다. ㅋㅋ 그래서

 

이번 시간에는 천천히 어떤 플로우로 통신이 되는지 살펴보고 Device 측면에서의 초기화가 되는 과정을 공부하려고

 

합니다. 자 스타스~

 

   자 USB Device가 있습니다. 컴퓨터에 연결하면 컴퓨터는 바로 인식하죠? 이 때 어떤 과정을 거치는지 살펴봅시다.

 

USB는 초기화의 과정을 몇개의 State를 사용해 표시합니다. 아래 도표를 보시면 그 상태와 순서가 나열되어 있습니다.

 

 

 

   각 State는 위 도표에 있는 것처럼 Attached , Powered , Default , Address , Configured ,Suspended입니다. 각 State를

 

살펴봅시다. 먼저 Attached는 말 그대로 연결입니다. Powered도 뭐 큰 특징이 없습니다만 베터리를 가지고 있는 Device

 

입장에서는 전원을 선택할 수 있다는 점?정도가 특징이 되겠습니다. Powered 과정이 끝나도 Device는 어떤 USB 통신에도

 

응하면 안됩니다. 통신을 하기전에 bus를 통해 Reset 신호를 받아야 합니다. Reset 을 받은 후에 어드레스를 받을 수 있는

 

Default Address(00H) 상태가 되어야 합니다. 이 상태가 Default 상태입니다. 그 다음 State는 Address State입니다.

 

Address State는 호스트로부터 Address를 할당받은 상태를 말합니다. Address를 할당받은 이후에 Device는 반드시

 

Configuration 되어야 Device의 기능이 동작할 수 있는 상태가 됩니다. 이 상태가 Configured입니다. 마지막으로 Suspended

 

State가 있는데 장비는 어떤 상태에서도 일정 시간 동안 bus traffic이 없으면 Suspended 상태에 진입해야 합니다. 만약 bus가

 

활성화 되면 Suspended 상태에서 빠져나와 정상적인 통신을 거쳐야 합니다.

 

   자 여기서 저는 궁금한 점이 생겼는데요. Powered 다음에 Reset 신호를 받아야 한다는데 도대체 리셋이 뭘까요?

 

 

USB2.0 문서에서 RESET으로 검색해보니 위와 같은 표가 나옵니다. 버스가 Reset state에 들어가려면 D+와 D-가 VIL(max)

 

보다 작은 상태로 10ms 이상 있어야 한다는 군요. ㅎㅎ 그냥 단순히 D+와 D-를 Low 상태로 10ms 이상 만들어 주면 Reset

 

Signal이랍니다. 뭐 간단하네요. ㅎ

 

           다시 순서대로 곱씹어 보겠습니다. ㅎㅎ

 

1. USB 연결한다. -> Attached ,Powered

 

2. Reset! 신호를 받은 후(D+,D-라인이 10ms 동안 LOW) 자신의 address를 00H로 만든다. -> Default

 

3. 주소를 받는다. -> Addressed

 

4. Configuration을 받는다. -> Configured

 

5. 준비 끝~

 

이렇게 초기화를 하네요. 그럼 Reset까지는 프로그램 측면에서 할게 없습니다. 물론 Device입장에서 Reset을 받으면

 

Pipe를 초기화하고 모든 데이터를 없애버리는 등의 USB를 초기화시키는 프로그램이 있어야겠죠. 하지만 지금은 프로토콜만

 

보고 있는 중이니깐 Reset은 넘기고 주소를 받는 부분부터 시작합시다.

 

 

   1. 리셋을 시킨 후에 호스트는 00H를 가진 아이에게 주소 설정을 하라는 토큰을 날릴거에요.

 

 

 

 

(*address에 d가 하나 없네요. -_-;; 수정하기 귀찮으니 고냥 갑시다. ㅋㅋ)

 

 

   2. 토큰을 날린 후에는 Data를 날린다고 했었죠?

 

   자 Data 패킷의 PID는 DATA0와 DATA1이 있다고 했습니다. DATA0는 0011B 이었으니까 PID는 11000011이 되겠죠?

 

 

 

 

 

   그럼 PID는 해결되었고 DATA를 날려야하는데 어떤 데이터를 날릴까요? 물론 디바이스 표준이 있습니다.

 

 

   위 표는 Setup Data의 포멧입니다. 모든 디바이스들은 위 요청에 대해 Default Control Pipe를 통해 응답해야한다고 되어

 

있습니다.  Default Control Pipe는 EP0를 말하는 것이며 Setup Data는 총 8byte입니다. 그러면 한개씩 살펴봅시당.

 

   bmRequestType은 어떻게 보내야 할까요? D7은 방향이네요. 당연히 요청이니까 Host-to-Device가 될 것 같습니다. D6,5는

 

Type인데 Class와 Vendor는 공부하면서 아직 접해본바가 없군요? 그럼 당연히 Standard라고 생각합니다. 마지막 D4~0는

 

Recipient(받는 놈)인데 당연히 Device가 받아야 하겠죠? 그럼 결국 bmRequestType = 0이 되겠네요.

 

  자 다음은 bRequest입니다. 옆을 보니까 Table 9-3을 보라고 되어 있군요. 그럼 봅시다.

 

<Table 9-3>

  

   쓰읍 bmRequestType까지 전부 나와 있군요!! 쳇. 뭐 어쨋든 표를 보시면 bRequest도 내용이 있습니다. bRequest는 1 byte

 

짜린데 무슨 문자가 길게 되어 있는데 당연히 문자가 들어가지는 않겠죠? 이것도 표로 되어 있습니다.

 

 

   위 표를 보시면 bRequest의 SET_ADDRESS의 value가 5 라고 되어 있네요. bRequest까지 되었네요.

 

   다음은 wValue입니다. 워드 사이즈의 필드로 요청에 따라 달라질 수 있다고 설명이 되어 있습니다. 어떻게 달라지는지는

 

Table 9-3에 나타나 있습니다. SET_ADDRESS의 wValue 파트를 보면 Device Address라고 되어 있습니다. Host는 이 필드를

 

통해서 Device에게 앞으로 사용할 Address 주소를 건네줍니다. Table 9-3을 보면 나머지 필드는 전부 zero 아님 None입니다.

 

더 이상 할게 없다는 소리겠죠? 참고로 Table 9-3의 마지막에 Data field가 있는데 만약 데이터가 있을 때는 wLength에 해당

 

데이터의 길이를 담고 전달하게 됩니다. 암튼 SET_ADDRESS의 요청으로 전달되는 데이터는 다음과 같겠네요.

 

 

 

   3. 주소도 전부 전달했겠다. 그럼 남은 일은 Device가 Host로 HandShake로 ACK를 보내는 일만 남았습니다. 

 

    복습하자면 HandShake는 딱 1 Byte로 PID만 전달합니다. 그 PID 표는 전 시간에 나타내었습니다. 아래 링크.

 

2012/10/04 - [Protocol] - USB.02

 

   ACK는 0010B 이고 NAK는 1010이므로 디바이스의 상태에 따라 11010010B or 01011010B를 보내면 SET_ADDRESS에 관한

 

통신을 완료하게 됩니다. 이쪽저쪽 표 보느라고 정신없군요. ㅎㅎ 이렇게 표가 많은 걸 보니 프로그램에서 #DEFINE 이나

 

Structure, ENUM 등등을 잘 활용해야겠습니다.

 

   이제야 Device의 주소 설정까지 달려왔네요. ㅎㅎ 하지만 아직 갈길이 멀죠. 그래도 이것 저것 신경쓰지 말자구요~ 머리만

 

아파요. ㅋㅋ 음.. 너무 이론만 하니까 정신이 없는 것 같아요. 그래서 다음 시간에는 실제로 이런 통신이 이루어지는지 확인을

 

해 보려고 합니다. MCU를 사용할 거구요. 사용할 MCU는 TI의 CC2540F256입니다. 원래 Bluetooth Low Energy 용도로 출시된

 

SOC이지만 USB도 내장되어 있습니다. 아래 사진의 오른쪽 상단 정사각형 IC가 CC2540입니다. 귀엽습니다. -_-+ 으흐흐

 

   그럼 내일은 USB Device에 주소가 설정되는 모습을 볼 수 있겠군요. ^^ 으흐흐흐흐 기대됩니다. 으흐흐흫흐 으르흐흐

 

그럼 이만 전 미리 실습하러 갑니다.~ 내일봐여~  - Dwarp -

 

 

!!!!!추신!!!!!

 

   -_-+ 저를 "보드팔이"라고 생각하시는 분들이 계실지 모르겠지만 저는 절대로 제품를 판매하거나 홍보할 목적이 없음을

 

분명하게 밝힙니다. 시작하는 글에도 말씀드렸다시피 다른 엔지니어 분들에게 조금이나마 도움이 되고자 블로그를 오픈한

 

것입니다. (그렇다고 무료로 드린다는 소리는 아닙니다. 회사 자산이므로 권한이 없습니다.)

저작자 표시
신고

'Protocol' 카테고리의 다른 글

USB.04  (4) 2012.10.10
USB.03  (0) 2012.10.05
USB.02  (0) 2012.10.04
USB.01  (2) 2012.09.28
DMX-3  (1) 2012.09.10
DMX512-2  (0) 2012.08.31

USB.02

Protocol 2012.10.04 12:08 Posted by Dwarp

USB를 해 봅시다.

Original USB

   다들 즐거운 명절 보내셨으리라 생각됩니다. 엔지니어 분들은 당분 섭취를 송편으로 많이 하셨을테고 ㅋㅋㅋ 대다수의

 

엔지니어 분들이 머리회전을 위해 단 음식을 많이 먹어서 비만과 싸움중인 것으로 알고 있습니다. 당분이 없으면 흡사 좀비와

 

같은 모양새를 면치 못하죠. ㅋㅋ 전 단 것을 별로 좋아하지 않아서 과자같은 건 거의 먹지 않습니다. 그래서 하루에 다방커피를

 

12잔씩...... 스트레스로 인한 담배를 두갑씩...... 일주일에 3일 정도 폭음을...... 으...... 하지만 저세상가기 전에 조금이나마

 

우리나라 엔지니어들을 위한 글을 조금 더 쓰고 가도록 하겠습니다. ㅋㅋ 주절거리다 보니 쓸데없는 내용이 한문단이네요;;;

 

 

   자 USB 두 번째입니다. 첫 번째는 USB 프로토콜에 대해 대략적으로 알아보았는데요. 요약하자면

 

1. USB 통신은 보통 3단계로 이루어진다.

 

a. Token -> Data -> Handshake

 

 

2. Device는 EndPoint라는 것을 여러개 가지고 있다.

 

a. EP0는 Configuration or Control Packet을 위해 사용된다.

b. Host와 EP의 연결모델을 Pipe라 부른다.

c. Pipe는 4가지 타입이 있으며 한가지로만 사용가능하다.

d. 한개의 Device는 여러개의 Pipe를 가질 수 있다.

 

   이정도 입니다. 이번 시간에는 프로토콜 측면에서 더 자세히 살펴보려고 합니다. USB 통신은 보통 3단계로 이루어진다고

 

말씀드렸습니다. Token, Data 그리고 Handshake입니다. 그럼 실제 각 Packet의 구조는 어떻게 되어 있을까요?

 

   아래 표와 같습니다. 순서대로 Token, Data, Handshake입니다.

 

 

 

 

 

 

   모두 시작은 8bit의 PID(Packet ID)로 시작하는 군요. PID는 현재 패킷의 종류를 나타내는 필드입니다. 이 패킷이 Token인지

 

Data인지 아니며 Handshake 패킷인지 나타내주는 것이죠. 아래 표를 보시면 타입과 설명이 나와 있습니다만 위 표와 다르게

 

4bit입니다. 그 이유는 에러를 체크하기 위해 0 ~ 3번 bit까지는 아래와 같은 bit를 적용시키고 4 ~ 7번 bit에는 보수를 넣기

 

때문입니다. 만약 Token 중 OUT 패킷이라면 11100001b 가 되는 것이죠. PID Types 다음 표에 나와 있습니다. 마지막에 있는

 

Special Packet은 Split이나 High speed 관련 내용으로 USB 허브에 관련된 내용이므로 과감히 생략하겠습니다.

 

(USB 2.0은 Full speed를 지원하지만 Hub만은 High speed를 지원합니다.)

 

 

 

 

   이제 어느정도 윤곽이 보이는 군요. 여러분도 보이시나요? ㅎㅎ 전에도 말씀드렸다시피 Token Packet은 호스트만

 

전송할 수 있습니다. Data와 Handshake는 Token Packet에 따라 틀려집니다. Host -> Device가 될 수도 있고

 

Device -> Host가 될 수도 있으니까요.

 

 

   Token Packet부터 자세히 살펴봅시다. Token Packet으로 정의된 PID는 OUT / IN / SOF /SETUP 총 4가지 입니다.

 

USB에서 데이터의 이동 방향을 나타내는 OUT은 Host -> Device를 의미하고 IN은 Device -> Host를 의미합니다. 그리고

 

SOF는 Start of frame의 약어인데 USB2.0 표준문서의 205 Page를 보시면 다음과 같이 나와있습니다.

 

Full-speed devices that have no particular need for bus timing information may ignore the SOF packet.

(버스 타이밍 정보가 필요하지 않는 Full-speed devices는 SOF packet을 무시할 수 있습니다.)

 

따라서 SOF는 무시하도록 하며, 마지막으로 Setup은 Host가 Device의 사이의 Pipe를 Setup하기 위한 Token Packet입니다.

 

 

   Data Packet은 말 그대로 Data 전송용 Packet입니다. Data packet으로 정의된 PID는 DATA0 / DATA1 / DATA2 / MDATA

 

입니다. DATA2와 MDATA는 High-speed에 사용되므로 필요하지 않으며 DATA0 / DATA1만 Full-speed DATA 전송에

 

핍요합니다. DATA2와 MDATA는 그렇다치더라도 DATA0와 DATA1이 왜 필요한지 의문점이 드느데요. 그 이유는 연속된

 

데이터를 보낼 때 데이터의 유효성을 확보하기 위해 Synchronization하기 때문입니다. 데이터 Synchronization은 트렌시버와

 

리시버가 PID를 토글하는 것으로 이루어집니다. Receiver는 데이터를 받을 수 있는 상태이고 data PID가 정확할 때만 PID를

 

토글하고 Tranceiver는 유효한 ACK Handshake를 받았을 때에만 PID<0>를 토글하는 것이죠. 그러니깐 연속 데이터를 보낼때

 

PID의 첫 번째 비트가 계속 토글되어야 합니다. 즉, DATA0 <-> DATA1가 교대로 전송되어야 하는 것입니다.

 

 

   Handshake Packet딱 1 byte 입니다. PID만 보내면 되는데 이것도 종류가 4가지 있습니다. ACK / NAK / STALL /

 

NYET입니다. ACK와 NAK는 다들 아시겠지만 긍정과 부정입니다. 데이터를 잘 받았으면 ACK, 못받거나 에러가 있으면 NAK를

 

전송하는 것이죠. STALL은 지연을 뜻하는데요. Device의 Endpoint가 Halt되어 있거나 Control Pipe 요청을 지원하지 않는

 

경우를 나타냅니다. NYET은 위에도 설명되어 있듯이 아직 응답이 없는 상태를 나타내는 것인데 디바이스가 응답을 안하는

 

것이므로 디바이스의 것이 아닙니다. 허브에서 사용됩니다. 당연히 High-speed 전용이므로 신경을 끕시다.

 

 

   어떠신가요? 어려우신가요? 저는 대략적으로 머리속에 그림이 그려지기 시작합니다. 내일은 USB를 통해 데이터가 왔다

 

갔다하는 과정을 한개씩 한개씩 나열해 볼텐데요. 그리고나면 더 선명하게 알 수 있으리라 기대합니다. 그리고 시간이 되면

 

USB에 필요한 구조체와 함수를 정의해 보려고 합니다.

 

 

   추가로 말씀드로고 싶은 것은 저는 지금 현재 USB에 관련되어 미리 작성된 어떤 레퍼런스 코드도 보고 있지 않으며 오로지

 

표준 문서와 데이터 시트에만 의존하여 프로그래밍을 하려고 합니다. 왜 이런 수고스런 과정을 거치냐고 하시는 분들이 있을지

 

모르겠습니다만 프로토콜 뿐만 아니라 모든 기술은 발전합니다. 어떤 기술이 새로 나왔을 때, 여러분들은 누군가가 레퍼런스

 

코드를 작성하기를 기다리실 건가요? ^^ 여러분들은 이미 대답을 알고 계십니다. 엔지니어 여러분들 모두 힘내시고 혹시

 

제 글에 오류나 의문점이 있으시면 주저마시고 글을 남겨 주시면 감사하겠습니다.

 

   내일 또 만나요~  - Dwarp -

저작자 표시
신고

'Protocol' 카테고리의 다른 글

USB.04  (4) 2012.10.10
USB.03  (0) 2012.10.05
USB.02  (0) 2012.10.04
USB.01  (2) 2012.09.28
DMX-3  (1) 2012.09.10
DMX512-2  (0) 2012.08.31

USB.01

Protocol 2012.09.28 11:28 Posted by Dwarp

USB를 해 봅시다.

Original USB

 

   DMX에서 갑자기 USB로 점프하려니 ㅋ 뭔가 언벨런스한 면이 있지만... 그래도 제가 실제로 진행하는 것을 올리는 것이

 

저에게도 여러 엔지니어 분들에게도 도움이 되지 않을까 싶어서 글을 작성합니다. 목표는 USB MSD를 표준 문서에만

 

의존해 구현하는 것입니다. 성공과 실패는 의미가 없으니 마음에 두지 않겠습니다.

 

 

 

   USB 참 많이 쓰이죠. 하지만 임베디드에서 접근하기가 상당히 까다로웠습니다. USB 전용 IC가 많이 나와 있기도 했지만

 

이미 윈도우 드라이버가 있거나 아니면 USB to RS232 아니면 MSD(Mass storage device)처럼 표준을 사용하는 IC정도였죠.

 

관련 서적도 국내에서는 턱없이 부족합니다. 물론 표준 문서는 사이트에서 얼마든지 구할 수 있습니다. 다만 영문이라는

 

사소한 압박이 있죠? 그리고 표준 문서는 양도 방대합니다. 현재 USB 2.0 표준 문서는 650페이지입니다. 이게 어느 정도냐면

 

우리가 사용하는 사무실용 A4지 묶음 중에 사전 처럼 두꺼운 것이 500매 입니다. 단면으로는 그 A4지 한권을 다해도 출력이

 

힘듭니다. 뿐만아니라 MCU 사이드에서도 따로 공부해야 하는 것들이 있구요. (단지 MCU의 USB 기능을 사용하기 위한)

 

또 있습니다. USB 클래스라는 것인데 MSD나 HID(Human interface device: 마우스, 키보드 등)도 따로 공부를 할 필요가

 

있습니다. 일단 시작은 USB 2.0 표준 문서를 정독!하는 것으로 정했습니다. 제가 여러분들에게 그 과정을 전부 보일 만큼

 

잔인하지는 않습니다. 핵심만 추리고 추려서 ^^ 저도 공부하고 여러분들께도 알려드리도록 하겠습니다.

 

 

USB 표준 문서 링크: http://www.usb.org/developers/docs/usb_20_071012.zip

 

 

   USB는 아시겠지만 HostDevice로 이루어져 있습니다. USB 시스템 내에서는 단 하나의 HOST의 존재만 가능합니다.

 

예를 들면 노트북과 데스크탑의 USB를 연결해도 서로 인식 못한다는 것이죠. 그리고 흔히 USB라고 부르는 MSD 두개를

 

서로 이어도 마찬가지죠. Host는 대부분 PC고 Device는 아시는대로 정말 많죠?

 

 

   규격도 많은데요. USB 2.0 이 있다는 것은 1.0도 있었다는 소리겠고 또 현재는 3.0, OTG와 같은 규격도 나와 있습니다.

 

하지만 제가 사용하는 IC가 2.0만 지원하므로 2.0에 집중하도록 하겠습니다. USB2.0은 Full-speed를 지원합니다.

 

Full speed가 얼만데? 넹 12Mb/s 입니다. Low speed도 지원하는데 낮은 bandwith를 가진 기기들을 위한 용도로

 

USB 버스의 속도저하를 막기위한 용도입니다. 또 BUS의 형태니깐 터미네이션도 필요합니다만 이건 신경 안쓰셔도

 

될 것 같습니다. 케이블 종단에 설치되게 되어 있다고 표준에 나오네요. DMX에도 언급을 했습니다만 터미네이션은

 

데이터 반사를 막기 위해 케이블 종단에 설치되는 저항입니다. 그리고 4개의 라인이 필요하고 5V 500mA도 공급하죠.

 

 

프로토콜

 

   위는 대략적인 내용입니다. 너무 일반적인 내용이므로 다들 알고 계시리라 생각됩니다. 자, 이제는 프로토콜

 

대해서 간략적으로 살펴봅시다. 표준 문서에서는 USB의 데이터 교환을 Bus transaction 이라고 부릅니다. 각 transaction

 

의 Host가 USB packet을 보내는 것으로 시작됩니다. 그 Packet의 내용은 transaction의 방향, Device 주소, 그리고

 

Endpoint의 숫자입니다. Token packet이라고 부르는 이 내용은 On a scheduled basis 해서 보낸다고 되어 있는데

 

저는 주기적으로 쏜다는 의미로 받아들였습니다. 자 그럼 정리를 해 봅시다. 정리는 역시 그림이 짱!!!

 

 

   ㅎㅎㅎ 역시 그림이 짱!이여! ㅋㅋㅋ But!  제가 보는 페이지는 46/650... ㅠㅠ 자 계속 보도록 합시다. 이렇게 전송된 패킷은

 

디바이스들에게 전송되는데 주소가 셋팅된 디바이스들은 해당 페킷을 받아드리고 트렌젝션 방향에 따라 호스트 -> 디바이스,

 

디바이스 -> 호스트로 통신을 하게 되는 것이죠. 이 데이터 방향에 따라 전송하는 놈은 데이터를 보내거나 데이터가 없다고

 

받는 놈한테 알려줍니다. 받는 놈은 해당 패킷의 전송이 성공했는지 안했는지 전송하는 놈에게 알려주죠. 이걸 Handskake

 

라고 부릅니다. 그럼 다시 그림으로 표시해 봅시다.

 

 

 

 

 

PIPE

 

   위와 같이 3단계를 거쳐 통신을 합니다. 여기서 Endpoint는 뭐죠? 자 신경쓰지 맙시다. 저도 아직 완벽히 이해한게 아니라

 

섣불리 말씀드리기는 뭐하지만 디바이스입장에서 보면 단순히 메모리입니다. 호스트와 EP(줄여 부르겠습니다.) 사이의

 

전송 모델을 Pipe라고 부릅니다. 그리고 이 Pipe는 Stream과 Message 2종류가 있는데 차이는 Stream은 딱히 구조가 없고

 

Message는 있습니다. 디바이스는 이 Pipe를 여러개 가질 수 있어서 한개는 Input으로 한개는 Output으로도 사용할 수 있습

 

니다.

 

 

 

 

 

   USB에는 기본적인 통신 방식 타입이 4가지가 있습니다. 한 개의 Pipe는 아래 통신 타입 중에 단 한 개의 타입만 지원합니다.

 

1. Control Transfers : 디바이스를 호스트에 연결했을 때 설정 하는 곳에 사용됩니다. 모든 디바이스에게 공통 사항이며

EP0를 사용해야 합니다. 이게 없으면 USB가 아니여~

 

2. Bulk Data Transfers : 대량의 데이터를 전송할 때 사용됩니다. MSD나 프린터 아니면 스캐너 등에 사용됩니다. 이 때 전송

    대역폭은 USB 버스 상태에 따라 변화됩니다.

 

3. Interrupt Data Transfers : 음... 알맞은 때에 신뢰할 만한 데이터를 보낼 때 사용합니다. 예를 들면 마우스 같은 것이죠.

   마우스가 늦게 움직이면 컴퓨터를 뽀샤버리고 싶죠....

 

4. Isochronous Data Transfer : 주기적으로 전송되는 데이터에 사용됩니다. 전송 지연과 대역폭이 미리 설정됩니다.

  이 말은 음악 전송과 같이 실시간으로 스트리밍하는 곳에 쓰인다는 소리입니다.

 

   모든 디바이스는 자신이 뭐하는 놈인지, 모델명이 뭔지, 누가 만들었는지 등등등을 호스트에 알려야 합니다. 이 정보는

 

호스트와 EP0 사이에 형성된 파이프를 통해서만 이루어 집니다.

 

 

   휴... 힘드네요. 이 정도가 USB 임베디드 프로그램 시작입니다. 10%? 20%? 아닙니다. 0% 진행된 것이죠. ㅎㅎ 이정도는

 

사전 조사에 불과합니다. 저야 MCU side에서도 봤으니 어느 정도 몽글몽글하게 머릿속에 이미지가 있지만 USB에 대해서

 

처음 접하시는 분들은 거의 뜬구름 잡는 소리랄까? 사실 위 글은 링크 걸어둔 표준 문서의 서론을 해석한 것에 불과합니다.

 

이제 시작이니까 너무 열내지 마시고 대강 느낌만 살짝.. 아주 사알짝 느끼는 정도면 됩니다. 후~ 다음 시간부터 힘들겠네요.

 

아무튼 오늘부터 추석 연휴잖아요? 여러분 모두 추석 잘 보내시고 푹 쉬시고 충전하시길 바라겠습니다. ^^

 

쉴때는 개처럼~ Dwarp

저작자 표시
신고

'Protocol' 카테고리의 다른 글

USB.03  (0) 2012.10.05
USB.02  (0) 2012.10.04
USB.01  (2) 2012.09.28
DMX-3  (1) 2012.09.10
DMX512-2  (0) 2012.08.31
DMX512  (0) 2012.08.29

DMX-3

Protocol 2012.09.10 12:40 Posted by Dwarp

드디어 DMX512 세번째입니다.

 

저번 시간까지는 대략적인 특징과 하드웨어 구성(회로도)에 대해서 보았는데요 -> 2012/08/31 - [Protocol] - DMX512-2

 

이번 시간에는 DMX 프로토콜에 대해서 더 상세히 살펴본 후 소프트웨어 뼈대까지 나아가 봅시다

 

  위 그림이 DMX512의 타이밍 차트입니다. 1990 이라고 씌여 있는 것을 보니 씁쓸하군요. 암튼 DMX512는 크게 보자면 3 파트로

 

이루어져 있습니다. Break, Start Code, 512 Frame입니다.

 

그 외 기타 MAB나 MTBP와 같은 것은 다음 싸이트를 참고하시면 될 것 같습니다.

 

<DMX 타이밍 용어 설명 : http://www.erwinrol.com/dmx512/>

 

 

   1. 먼저 Break는 Frame과 Frame을 구분하기 위한 것이고 우리는 이 Break를 이용해서 Data가 시작한다는 것을 알 수

 

있습니다.

 

   2. Start Code는 DMX512에서는 0x00으로 다른 값에서는 동작하면 안됩니다. RDM이라는 프로토콜은 Start Code가

 

0xCC을 사용하고 Text Packets은 0x17, System Information Packet은 0xCF도 쓰기 때문입니다. 따라서 기본적인

 

DMX512 패킷은 0 만을

받아서 동작하는 것이 좋습니다.

 

   3. 512 Frame은 말 그대로 정보입니다. 512개의 데이터가 250000bps로 연달아 나타납니다.

 

 

   음. 크게 3부분을 나눴는데 이걸 어떻게 프로그램으로 구현하면 될까요? Start Code와 512개의 data는 단순하게 8bit,

 

250000bps, 2 stop bit, no parity bit의 UART 통신과 동일합니다. 그렇죠? ㅎ그럼 데이터의 시작인 Break는 어떻게 구현할까요?

 

 

   Tranceiver 입장에서 보면 UART 핀을 일반 I/O로 변경한 뒤, 88 us가 넘게만 OFF -> ON 시켜주면 될 것 같습니다. 

 

타이밍 차트를 보니 Break의 허용시간은 88us ~ 1s 이니 꽤 여유가 있는 편입니다. 이 후에는 해당핀을 다시 UART로 바꾸고

 

Start Code 0x00을 포함한 총 513개의 데이터를 쏴주면 끝이군요!!!.

 

 

   이번에는 Receiver의 입장해서 볼까요? Receiver에서 Break는 어떻게 알아챌까요? Tranceiver처럼 UART 핀을 일반 IO로

 

변경하고 Low인 시간을 측정해서 88us이상이면 UART로 변경하고 Data를 읽으면 될거에요. but! 더 쉬운 방법을 찾아봅시다.

 

바로 UART의 Error Detection 기능을 이용하는 것인데요. 대부분의 MCU에 있는 UART에는 Frame Error Detection 기능이

 

있습니다. 이 에러는 형식을 맞추지 않은 Data가 들어올 경우 발생합니다. Break 이외에 Frame Error가 발생할 만한 부분이

 

없기 때문에 우리는 이 Frame Error Detection 기능을 사용해서 Break 구간이라는 것을 간편하게 알 수 있습니다.

 

  자! 그럼 실제로 사용하기로 한 stm32f103ze UART 파트 중 Error Detection 부분을 보겠습니다.

 

 

 

   stm32f103zeUART 관련 register 중 Status register부분입니다. 위 표를 보시면 0번 bit부터 3번 bit까지가 Error

 

bit이며 각각 PE(Parity bit error), FE(Frame error), NE(Noise error), ORE(Overrun error) 입니다. 이 에러들은 대부분의

 

MCU에서 Detection이 가능하며 인터럽트 또한 지원하고 있습니다. 따라서 여러분들은 FE 인터럽트가 걸리면 그 때

 

513개의 데이터를 읽어들이면 되는 것이죠. 순서대로 다시한번 생각해보면

 

1. DMX data 입력.

 

2. FE 인터럽트 발생.

 

3. DMX buffer에 데이터 입력 시작.

 

4. Start code == 0 이면 옳바른 DMX512 데이터.

 

5. 나머지 512개 데이터를 주소에 맞게 활용.

 

6. 반복~

 

입니다. 간단하죠? 간단하지 않다구여? -_-+ 간단합니다. 안간단해도 간단하다고 자기최면을 거는 겁니다.

 

그럼 간단하게 샘플 코드를 나열하기 전에!!!! 한가지 더!! DMX512라는 프로토콜은 간단하고 강력합니다. 하지만 무식하다는

 

단점이 있죠. 뭐가 무식하냐구여? 생각해보시면 DMX512라는 프로토콜은 절대 쉬지 않습니다. 항상 512개의 데이터를 뿜고

 

있어야 하고 받을 준비를 하고 있어야 합니다. 받는 입장이라면 250kbps의 UART에 의해 인터럽트가 항상 걸리고 있다는

 

입니다.

 

이 점 때문에 DMX512 리시버는 항상 인터럽트에 시달리는데요. 여기에 여러가지 인터럽트들을 짬뽕시키고 Flash 읽고 하다

 

보면 각종 버그에 시달릴 수 있습니다. 어떻게 하면 이런 문제를 회피할 수 있을까요? 저는 요세 거의 모든 MCU에 있는 DMA

 

라는 기능을 사용합니다. 이게 뭐냐면 Direct Memory Acces의 약어로 주변기기와 메모리의 데이터를 하드웨어적으로

 

연결시켜주는 기능입니다. -_-;; 참 설명 못하죠? 쉽게 말씀드리자면 자동입니다. 자동. 무이가 자동이냐? 예를 들면 UART를

 

통해 데이터가 들어오면 지정된 메모리의 주소를 늘려가며 자동으로 메모리에 데이터가 들어갑니다. 우리는 해당 데이터를

 

읽어 쓰면 그만입니다. 초기 설정 외에 소프트웨어적인 처리(인터럽트따위)가 필요하지 않기 때문에 여러분의 코드는 한결

 

여유로워 집니다.

 

따라서 항상 데이터를 읽고 있어야 하는 DMX512 라는 시스템에는 딱!인 기술이라고 생각됩니다. 코드를 살펴봅시다.

 

void USART2_IRQHandler(void)
{
     FlagStatus flagStatus;
     flagStatus = USART_GetFlagStatus(USART2,USART_IT_FE);
     switch (dmxStatus){
      case Idle:
           if(flagStatus)                        //Break Error Detected!!
           {
                SetTimer1(1000);             //타이머 1초 설정

                dmxStatus = BreakError;    
                DMA_Cmd(DMA1_Channel6,DISABLE);        //DMA 잠깐 쉬기
                DMA_SetCurrDataCounter(DMA1_Channel6,bufferSize);    //DMA 초기화
                DMA_Cmd(DMA1_Channel6,ENABLE);        //DMA 다시 시작!
                USART_ITConfig(USART2,USART_IT_ERR,DISABLE);    //ERR Disable
                USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);    //RXNE Enable
           }
           break;
      case BreakError:
           dmxStatus = ReadyToReceive;    //ReadyToReceive
           break;
      case ReadyToReceive:
           dmxStatus = Idle;                        //Idle
           USART_ITConfig(USART2,USART_IT_RXNE,DISABLE);    //RXNE Disable
           USART_ITConfig(USART2,USART_IT_ERR,ENABLE);        //ERR Enable
           break;
      default:
           dmxStatus = Idle;
           break;
     }
     USART_ClearITPendingBit(USART2,USART_IT_FE|USART_IT_ORE|USART_IT_NE|USART_IT_PE); //에러 클리어
     USART_ClearFlag(USART2,USART_FLAG_FE|USART_FLAG_ORE|USART_FLAG_NE);                //에러 클리어
}

 

   함수 이름이 매우 친숙하죠? 물론 아니실 분들도 있겠죠. UART 인터럽트 핸들러입니다. 인터럽트가 걸리면 호출되는 함수죠.

 

위를 보시면 아시겠지만 DMA 덕분에 데이터를 다루는 구문이 한곳도 없습니다. 다만 "DMA 시작합시다~"라는 구문이 있죠.

 

또 1초 타이머를 설정해 놓았는데요. 그 이유는 DMX의 최대 지연이 1초이기 때문입니다.

 

그럼 어디에 데이터가 들어가냐!! 하실 분들이 있으실텐데요. 그 DMA는 초기화 함수에 이미 초기화되어 있죠.

 

아래 코드 처럼요. 주변기기 주소는 USART2_DR_Address이고 메모리 주소는 Buffer 이군요. Buffer는 물론 주소를 나타냅니다.

 

 DMA_DeInit(DMA1_Channel6);                                                          //DMA1 채널 6의
 DMA_InitStructure.DMA_PeripheralBaseAddr = USART2_DR_Address;    //주변기기 어드레스는 UART의 데이터 레지스터다
 DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Buffer;                 //메모리 어드레스는 Buffer다.(물론 포인터)
 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                       //방향은 주변기기 -> 메모리 이다.
 DMA_InitStructure.DMA_BufferSize = bufferSize;                                  
 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;     //주변기기 주소 증가 금지
 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;            //메모리 주소 증가할 것.
 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;    //1 Byte
 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;           //1 Byte
 DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;                                //노멀 모드
 DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;                    //DMA도 인터럽트 처럼 우선순위가 있습니다.
 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                           //M2M: memory to memory disable
 DMA_Init(DMA1_Channel6, &DMA_InitStructure);                                //설정~

 

   Buffer는 적절하게 선언만 해 두었다면 어느 시점에라도 읽어올 수 있습니다. Buffer를 이용해서 모터를 굴리던 LED

 

디밍을 하던 자유롭게 할 수 있습니다. 어떠신가요?

 

   DMX512 Receiver만 하고 Tranceiver는 왜 안하냐구요? Tranceiver는 난이도가 낮다고 생각해서 후배에게 맡겨

 

진행했거든요. 그래서 Tranceiver 파트는 제가 실제로 구현한 것이 한개도 없습니다. 실제로 크게 난이도가 높이 않으므로

 

여러분들이라면 금세 하실 수 있으실 거에요. 참고로 말씀드리자면 후배가 만든 DMX Tranceiver는 천원짜리 cortex m0로

 

순식간에 만들어졌습니다.

 

   코드 전체를 올리지는 않겠습니다. 회사 것이기도 하고 제가 짰지만 지금 보니깐 코드에 의심스러운 구석이 있네요. -_-;;;

 

쪽팔.. 그럼 이것으로 DMX512에 대한 글은 끝마치겠습니다. 제가 글 솜씨가 부족하고 해서 이해가 안가시는 분들이 계시면

 

언제든 물어보셔도 됩니다. 그리고 제가 틀린 것도 분명 있을 텐데 지적해 주시면 감사하겠습니다.

 

언제나 힘내시구요. 아는 한 최대한 돕겠습니다. 화이팅~~~

 

- Dwarp -

저작자 표시
신고

'Protocol' 카테고리의 다른 글

USB.03  (0) 2012.10.05
USB.02  (0) 2012.10.04
USB.01  (2) 2012.09.28
DMX-3  (1) 2012.09.10
DMX512-2  (0) 2012.08.31
DMX512  (0) 2012.08.29
TAG DMX, DMX512

DMX512-2

Protocol 2012.08.31 10:24 Posted by Dwarp

DMX512 두 번째 입니다.

직장일을 병행하다 보니 생각보다 글 쓰기가 쉽지가 않네요. 일단 아닥하고 시작! 하려니 생각 정리도 잘 안되네요. ^^;;

아무튼 시작!

DMX512에 관해 대략적인 면을 살펴보았는데요. -> 2012/08/29 - [Protocol] - DMX512

오늘은 회로도를 완성해볼까 합니다. 일단 준비물이 필요한데 사용하려는 MCU와 75176의 데이터시트입니다.

MCU는 8051, AVR, PIC, Cortex M0, Cortex M3 등등 종류야 다양하죠? 요세는 M4도 나오고 있습니다.

개인적으로는 8비트 8051, AVR과 PIC을 사용하는 것을 전혀 권장하지 않습니다. 가성비가 너무 좋지 않습니다.

(MCU 고르는 방법은 따로 포스팅하겠습니다.)

제가 선택한 MCU는 STM32F103ZE인데요. Cortex M3입니다. -> http://www.st.com/internet/mcu/product/164495.jsp

네이버에 검색해보니 싸고 상당히 많이 사용하고 계시더군요. 스팩에 관한 내용은 따로 설명드리지 않겠습니다.

75176은 표준 IC라서 많은 회사에서 판매하고 있습니다. 검색해보니 SN75176BDR이 있군요 TI 제품입니다.

그럼 주요 IC 두개는 끝났군요. 기타 회로에 들어가는 IC들은 DMX512에 집중하기 위해 패스하겠습니다.

자, 그럼 MCU는 MCU고 75176이 뭐냐? 라고 하는 분들이 있을 수 있겠죠?

75176 데이터 시트를 보시면 DIFFERENTIAL BUS TRANSCEIVERS라고 설명이 되어 있습니다.

 

보통 차동차동 많이 거리는데 그냥 A와 B의 차이로 데이터의 0과 1을 결정한다는 뜻입니다. 이렇게 하는 이유는

데이터 선에 끼어 들 수 있는 외부 노이즈 때문인데요. 이론상 설명드리면

A와 B의 전압차로 0과 1을 결정한다고 했으니 A-B라고 하겠습니다. 같은 선상이니깐 같은 노이즈가 끼어들테고

그 노이즈를 N이라고 부르겠습니다. 그럼 원래 시그널 A에 노이즈 N이 합쳐지면 B도 마찬가지겠죠?

공식으로 만들면 (A+N) - (B+N) 가 되는데 풀면 A-B가 되죠. 결국 노이즈가 없어졌네요.

아래 테이블에서 보면 A-B의 차이가 0.2 볼트 이상이거나 -0.2볼트 이하일 때, H나 L가 결정되는 군요!!

RS-485가 이런 방식으로 데이터를 주고 받기 때문에 232보다 노이즈에 강하고 멀리 전달할 수 있는 거죠.

그럼 다시 DMX회로로 넘어가서 75176에 있는 8핀에 대한 걸 볼까요? VCC와 GND는 다 아실거에요? 그쵸? 제발...

그리고 A랑 B도 위에서 설명했으니 Output이나 Input이 되겠죠? 그럼 나머지 R,D,RE,DE를 보겠습니다.

R은 Receive, D는 Data input, RE는 Receive Enable, DE는 Data input Enable입니다. 참고로 RE에 윗줄

반대라는 뜻입니다. 즉, RE가 0이면 Enable이라는 뜻이고, 1이면 Disable이라는 뜻입니다.

 

R은 받는 거니깐 MCU의 UART RX에 연결하면 되겠고, D는 주는 놈이니깐 MCU의 TX에 연결하면 되겠습니다.

그리고 RE하고 DE는 어떻게 할까요? Receive 동작만 하고 싶다면 RE는 0에 DE는 0로 해버리면 될거에요. 반대면

둘다 1로 묶어버리면 되겠네요. 둘다 하고 싶다면 RE와 DE를 한 라인에 묶어서 MCU의 일반 IO에 연결해주면

프로그램으로 양쪽동작 모두 할 수 있겠네요. IC마다 케페시터는 버릇처럼 붙여줍시다. ^^

A와 B는 일반 커넥터를 사용해도 무방하지만 FM으로 갑시다. DMX에는 XLR 커넥터라는 것이 사용됩니다.

 

<출처: http://www.neutrik.com >

위에 보이는 것들이 XLR 커넥터 들입니다. 오프라인으로 국내에서 구하려면 상당히 고가입니다. 마우저 등을 이용하시는게

정신건강에 좋습니다. 

<출처: https://commons.wikimedia.org/wiki/File:XLR5_pinouts.svg#globalusage>

XLR은 3 Pin 또는 5Pin으로 사용하고 있습니다. 현재 규정은 XLR 5Pin으로 3Pin은 예전 규격입니다.

Pin description

1: Shield : 쉴드 라인입니다.

2: Data - : 데이터 -라인입니다. 75176 B에 연결합니다.

3: Data + : 데이터 +라인입니다. 75176 A에 연결합니다.

4: Spare - : 스페어 라인입니다.

5: Spare + : 스페어 라인입니다.

그럼 마저 회로도를 완성해 보도록 하죠.

XLR 커넥터가 두개가 있네요? 그리고 단순히 같은 라인끼리 연결만 되어 있을 뿐이네요. DMX 장비는 두개의 XLR 커넥터를

가지고 있어야 합니다. DMX Male 커넥터는 input이고 DMX Female 커넥터는 output인데 첫번째 장비의 Input에 DMX

컨트롤러로부터 시그널이 들어왔다면 두번째 장비의 시그널은 첫번째 장비의 XLR Female output으로부터 받는 거죠.

아래 그럼처럼 말이죠.

 

DMX 장비는 어떤 전송이나 증폭을 할 수 없게 되어 있습니다. 링크되어 있는 중간의 장비가 고장나버리면 뒤에 있는

장비들에게는 신호가 하나도 가지 않게 되기 때문이죠. 그래서 단순하지만 강력한 링크가 완성되는 것입니다.

그리고 간혹 2번과 3번 핀 사이에 120옴을 넣어두는 분들이 계신데 절대 넣으시면 안됩니다. 120옴을 넣는 이유는 보통

터미네이션의 용도인데 터미네이션이라는 것은 신호가 라인 끝에서 저항을 통해 소모되어 반사되지 않도록 하는 것입니다.

만약 터미네이션이 장비마다 들어가 있고 병렬로 120이 주륵주륵 붙는다고 생각해보시면 어떻게 될지는 뻔할 것이라고

생각됩니다. 또 Shield를 GND에 붙이는 회로도 많은데 절대 권장하고 싶지 않습니다.

장비들간의 거리가 길면 장비들 간의 전위차로 인해 GND를 통해 전류가 흐를 수 있습니다. 그라운드 루프라는 것인데요.

보통 음향장비에서 쉴드를 통해 그라운드가 붙어 있으면 심한 노이즈를 들을 수 있는데 같은 이유입니다. 또한,

장비간 연결하는 케이블의 커넥터에 납땜이 잘 못 되어있다면 장비들은 계속 리셋이 될 수도 있는 일입니다.

따라서 저는 쉴드를 어스에 붙이는데요. 위 회로도의 커넥터에서 각각 6번과 7번은 볼트를 통해 케이스와 접촉되는 부분인데

이 부분을 통해 쉴드로 어스로 붙입니다.

결국은 가장 간단하게 연결하는 것이 DMX 시스템에 있어서 가장 중요한 포인트인 것이죠!! -_-+

쓰다보니 상당히 길어졌군요. MCU는 따로 언급을 하지 않았습니다. UART RX와 TX에만 붙이면 되는 일이니까요.

더 자세한 문의 사항이 있으면 댓글 달아 주시구요. 다음에는 DMX 프로토콜과 프로그램 뼈대, 그리고 샘플 코드까지!

진행해보도록 하겠습니다.

긴글 읽어 주셔서 감사합니다. 많은 도움이 되었으면 좋겠습니다.

(추가)

한 가지 더 말씀드릴게 있는데요.

4번,5번 스페어 라인은 뭐에다 쓰는 거냐! 라고 하실 분들이 있을 것 같아서 말씀드립니다.

4번5번 핀은 DMX512 프로토콜의 추후 업데이트 버전에 사용될 예정이었으나 DMX장비 제조사들이 해당 핀을 데이터 리턴

이나 전원으로 사용하는 등 임의로 써버렸습니다. 그래서 4번핀과 5번핀은 이러지도 저러지도 못하고 있는 실정이라고

어딘가에서 읽은 기억이 있습니다. 따라서 저의 결론은 사용하지 않겠다!!!! 입니다. ^^ 감사합니다.

신고

'Protocol' 카테고리의 다른 글

USB.03  (0) 2012.10.05
USB.02  (0) 2012.10.04
USB.01  (2) 2012.09.28
DMX-3  (1) 2012.09.10
DMX512-2  (0) 2012.08.31
DMX512  (0) 2012.08.29
TAG DMX, DMX512

DMX512

Protocol 2012.08.29 17:36 Posted by Dwarp

첫 번째 시작은 DMX512로 할까 합니다.

생소하신 분들도 있겠지만 내용이 간단하고 구현이 매우 쉽습니다. 그럼 시작~

여러분들이 많이 가시는 클럽 천장에 붙어 있는 수많은 싸이키(?)가 바로 DMX512 프로토콜을 사용합니다.

[해외]Amazon American DJ DJ Spot 250-250 Watt halogen DMX512 or Stand Alone Moving Head Fixture

무대 조명에 많이 사용하는데요. 간단하게 특징을 보면

 

1. RS-485 인터페이스를 사용한다.

2. 512개의 주소를 가진다. 즉, 512개 주소의 장비들을 컨트롤할 수 있다. 또한 장비의 주소는 겹쳐도 상관없다.

3. 연결이 매우 간단하고 단방향이다.

 

이 정도 입니다.

표준은 "E1.11 - 2008, USITT DMX512-A" 이지만 40$... ㅠㅠ 뭐 싸다면 싸지만... 어쨌든!

일단 RS-485 인터페이스를 사용하기 때문에 하드웨어는 간단하겠죠?

DMX 표준에도 친절하게 SN75176 혹은 ISO485P중 하나를 사용하라고 되어 있습니다. 결국 485로 데이터를 보내주면 되니깐

Baud rateStop bitParity bit라던지가 있겠죠? 봅시다.

 

1. Baud rate: 250000bps. 25만 bps입니다. 쪼금 빠르죠?

2. Stop bit: 2. 스탑비트가 두개군요.

3. Data bit: 8. 데이터 비트는 노멀하게 8bit입니다.

4. Parity bit: None. 페리티 비트 없습니다!

 

음 이정도면 된 것 같네요. 감이 오시는 분들도 계시겠지만 이 정도 설정하면 일반 MCU의 UART 기능을

사용할 수 있겠군요!!

맞습니다. 결론부터 말씀드리면 특별한 하드웨어 구성없이 일반 MCU+75176 으로 충분히 구현 가능합니다.

물론 언급하지 않은 부분이 약간 있지만 자세한 사항은 조금씩 조금씩 알아 나가기로 하겠습니다.

신고

'Protocol' 카테고리의 다른 글

USB.03  (0) 2012.10.05
USB.02  (0) 2012.10.04
USB.01  (2) 2012.09.28
DMX-3  (1) 2012.09.10
DMX512-2  (0) 2012.08.31
DMX512  (0) 2012.08.29
TAG DMX, DMX512