본문 바로가기
Device를 control 한다는 것

Device를 Control한다는 것은 Embedded system engineer로서 당연히 마음 설레고, 즐거운 일이 아닐 수 없겠지요. 여기서 말하는 Device는 MCU외부에 달려 있는 외부 IC를 흔히 일컫는데, 이런 IC에 명령을 내린다는 건 어떻게 하는 걸까 의문이 듭니다. 그런데 알고 보면 간단간단이 아닐 수 없습니다. 정말 간단하죠. Device들은 잘 보면, 다음과 같은 Interface들이 꼭 있으니, 주의해서 한번 봐 주세요.

잘 보시면, CS/ (CE/), Data, CLK가 있습니다. 먼저 CS/나, CE/는 -(CE : Chip Enable, CS : Chip Selection) - 평소에 Pull up되어 있는 pin으로서, CS/ (CE/) Bar가 붙어 있으니까, Low Active 인 셈이며, 이 pin을 Low로 만들면 이제부터 너를 사용하겠다는 뜻입니다. 헷갈리니까 이제부터 CS, CE를 모두 CE로 표기 하겠습니다. 사실 같은 말이니까 그냥 섞어 쓰면 됩니다만.
 
두 번째로, Data는 양방향 pin으로서 명령어, 상태 등을 전달하고 전달 받는 통로가 되겠죠. Parallel bus로 몇 가닥으로 연결되어 있을 수도 있고, I2C나 SPI등으로 구현되어 한두 가닥의 bus로 구현될 수도 있습니다.
 
마지막으로 CLK는 Device IC에 심장박동을 전해주는 일을 하는 것이죠. Data 부분을 더 잘 control하기 위해서 OE/ 라든가 AVD/ 라는 둥의 부가적인 pin들이 더 붙어 있을 수도 있는데 이 부분은 더 나중에 자세히 digging하기로 하시죠.
 
외부 I/C에 명령을 내린다는 건 다음과 같은 우물쭈물한 sequence를 통해서 control 할 수 있습니다.
 
① 야~ 내가 너 쓸꺼야~ Switch를 켜고~
② 이런 일을 좀 해봐~ 신호라인에 약속된 전압이 있고 없고 없고 있고... 를 전달해 주고
③ 이 녀석이 일을 잘 하고 있을까?
④ 잘했는지 확인해 보자. OK?
⑤ 야~ 고맙다, 잠시 쉬어~
 
라는 스토리인데 이걸 좀더 유식한 형태로 만들면 다음과 같아요.
 
① CE 또는 CS 를 LOW로 만든다. ② Device에 명령어 binary sequence를 data line을 통해 보낸다.
③ Device에 명령어가 제대로 전달 되었는지 잠시 대기한다.
④ Device가 명령어를 제대로 처리 했는지 Data Line을 통하여 상태를 전달 받는다
⑤ CE 또는 CS를 HIGH로 만든다.
 
②,③,④ 번은 Device마다 여러 가지 더 다른 sequence로 이루어 질 수도 있습니다. 중요한 건 CE를 LOW로 만들어 놓고서, Data를 전달하고 전달 받는 일을 한다는 것이 중요하죠. ①~⑤ 사이의 일을 하려다 보니, 서로간의 Timing적으로 충족되어야 하는Timing Specification이 있겠죠. 순서에 따른 시간적인 충족조건이 필요하겠죠. 예를 들면 최소로 기다려야 하는 시간이라던가, 최대로 기다릴 수 있는 시간이라던가 하는 것 말이죠. 이런 Timing이 바로 Bus Interface와 Timing 그리고 Spec읽기에서 보았던 내용이 위력을 발휘하는 순간이라고 할 수 있겠습니다.
 
보통 이런 Timing 류는 Device Access 해주는 전용 controller가 있을 경우에는 처음에 init할 때, Controller Timing 을 한번 setting해 주는 것으로 끝나는데, 전용 controller가 없을 경우에는 implementation할 때 맞춰서 해주는 경우도 많이 있습니다요 예예.
 
실제 Timing에 대해서 살펴 볼까요?

위 그림은 어떤 NOR Memory의 MCU측면에서의 READ Timing Spec을 나타낸 그림이야요. 다른 pin들은 각설하고요. 이 그림은 CLK가 2개 주기(T)동안에 일어나는 일을 나타내고요 일단은 4번째 줄의 CS_N (CE/)가 MCLK (Main Clock)이 High edge일 때 LOW로 같이 떨어지고요 이때 t(ard) 이후에 OE_N을 Low로 떨어트리고 나면 t(a) 시간 후에 DATA가 NOR Memory로 부터 흘러 나오면, 이때 t(rds1) 시간 만큼 DATA가 유지 되어야 MCU가 DATA를 capture할 수 있다는 의미 입니다.
 
이런 의미에서라면, 당연히 NOR Memory를 선정할 때 위의 Spec에 걸맞은 NOR Memory를 선정해야겠지요? 거꾸로, NOR Memory spec을 보면 위와 같은 Spec이 또 나올 텐데, 그에 맞추어서 MCU의 Timing을 설정해 주어야, NOR Memory도 제대로 된 DATA를 돌려주고, MCU가 DATA를 capture해 줄 수 있는 당연한 궁합논리이에요.
 

위의 Timing Diagram에서  요 의미는 어떤 값이든 그 Timing에 들어가면 된다는 뜻이고요.  그러니까 Address와 Data는  요렇게 표시 되어 있는 거에요. NOR Memory의 경에는 Address line이 Parallel로 나와 있으니까, MCLK이  High edge되는 순간 Access 하고자 하는 Address의 값이 pin이 뜬다고 보면 됩니다요.
 
 

 Port 란? pin들의 묶음을 말하고요, 한가지 역할을 위해서 여러 개의 pin이 필요할 때도 있지요. 뭐 예를 들면 USB통신을 하기 위해서는 pin이 USB TX, RX pin등이 필요하겠죠. 이런 pin들을 한방에 묶어서 Port라고 표현 한답니다. Hardware적으로는 그렇고, Software로는 그런 pin들을 하나의 논리적인 구멍으로 볼 수 있겠죠.
 

 Memory Mapped I/O란? Memory Address를 I/O에 직접 할당해서 Memory 영역을 Access하면 직접 I/O pin들에 접근할 수 있는 개념을 말하는데요, 대충은 이 Memory 영역에 I/O를 위한 Register들을 할당해 놓는 개념이에요. 그래서 특정 Memory 영역에 Data를 쓰면 외부 I/O로 직접 신호가 전달 되고요, 특정 Memory 영역을 읽으면 외부 I/O에서 Data를 읽을 수도 있고요. 이렇게 Memory Mapped I/O를 사용하게 되면 특별한 I/O를 위한 명령이 필요 없겠지요. ㅎㅎ 예를 들어, Key pad sensing을 위한 주소가 0x68000050의 3번 bit에 에 할당되어 있으면 (Register가 있으면)
       #define read(port)       (*((volatile dword *)(port)))
       #define KEYSENSE_RD_ADDR                                      0x68000050
       if(!(read(KEYSENSE_RD_ADDR) & 0x08))
라고 해놓으면 해당 I/O의 값을 읽어 들이는 기능을 하게 되는 거죠. 또 자세히 보시겠지만, 이 정도로! ㅋ

친절한 임베디드 시스템 개발자 되기 강좌 글 전체 리스트 (링크) -



댓글





친절한 임베디드 개발자 되기 강좌 글 전체 리스트 (링크) -