본문 바로가기
특이한 Device Interface의 CS와 Address의 이용 - LCD

Device를 계속 얘기하다 보니까, 재미있는 Interface가 하나 생각나 버렸어요. 그중에 LCD가 그런 종류인데요, Serial Device라고 쓰긴 했지만, 뭐 꼭 그렇지만은 않고요. 이걸 보다보면 아~ 정말 재미있는 Interface구나 하고 무릎을 탁 칠 만한 예에요. 일단은 LCD에게 할당 된 Memory Map을 검토 해 보시지요. 고려하고 있는 MCP의 Spec을 보면 당연히 나와 있을 거에요. 예를 든다면, 뭐 이런 식 이겠지요.
 
Address      Target               Size
0x00000000 SDRAM_CS0_N    32MB
0x08000000 SDRAM_CS1_N    32MB
.....................중략......................
0x20000000 LCD_CS_N          3MB
.....................생략......................
 
뭐 이런 식의 Memory Map이 있다면 0x0에는 SDRAM이 붙어 있고, Size는 32MB까지 Access 가능하고, 음음.. Chip Select는 Low Active구나.. 음음.. 그리고, 0x8000000에는 SDRAM이 하나 더 붙어 있는데 Size는 역시나 32MB를 쓸 수 있구나.. Low Active고 말이지.. 정도.. 해석 가능하겠제요. 우리가 생각하고 있는 LCD는 0x20000000번지에 3MB만큼의 Address 영역을 가지고 있네? 라고 볼 수 있는 당신은 이미 전문가. 여하튼 간에 어쨌건간에 그러면 0x20000000번지부터 3MB 사이의 주소를 Access하면 LCD의 Chip Select를 사용할 수 있겠구나! 라고 생각 했겠지요. 그렇다면 이제 회로를 어떻게 꾸며 놓았는가 하고 구경해 볼 차례이겠지요? 자알~ 조심스럽게 살펴 보세요.

!... 어랏? 이건 또 뭐람? Address Line이 다 어디 간거야?... 라는 생각이 드시면 당신은 이미 전문가. ㅋ. MCU에서 LCD로 연결된 Line은 LCD_CS/, A[7], D[15:0]. 요게 다네요? 엄... Address Line은 없고, A[7]만 하나 달랑 나와 있고요, Data는 16bit 짜리 16개 line 연결되어 있고요. 이건 뭐람... 으흐흐. 이것도 LCD Controller가 어떻게 동작하는 지만 잘~ 알면 간단한 얘기가 되지요. 일단은 LCD Controller가 어떻게 동작하는지 알아야 하겠지요. LCD Controller는 3개 종류의 Input을 가져요. 그것이 CS/, ADS, 그리고 Data 인데요. CS/는 아시다 시피, LCD Controller를 사용하겠다는 의미이고요, ADS는 현재 받고 있는 Data가 LCD에게 주는 Command인지, Data인지를 구분해 줘요. 마지막으로 Data는 당연히 Command 이거나 Data이거나 겠지요. MCU 입장에서 조금 더 자세히 얘기해 보면, MCU 입장에서는 0x20000000~0x202FFFFF 사이의 주소를 Access하게 되면 자동~으로 LCD_CS_N가 Low로 떨어져 주시고요, Command를 주고 싶을 때는 LCD Controller의 ADS에 High를, Data를 주고 싶을 때는 Low를 주고요, Data line에 Command나, Data를 흘려주면 LCD Controller의 Control은 끝이 나는거에요. 자, 여기까지 마무리 짓고서요.
 
LCD라는게 대부분 Command 주고, Data 주는 형태로 Control 되니까요, Assembly로 따지면..
 
; Command Issue
LDR R0, #0x20000000 ; LCD_CS_N가 Low로 떨어지도록..
; ADS에 High 넣어서 Command가 날아갈 걸 알려주고요,
LDR R1, #0xABCD ; Command
STR R1, [R0] ; LCD controller에게 Command를 Data Line을 통해서 전달해 줍니다.
 
; Data Issue
LDR R0, #0x20000000 ; LCD_CS_N가 Low로 떨어지도록..
; ADS에 Low를 넣어서 Data가 날아갈 걸 알려주고요,
LDR R1, #0x1234 ; Data
STR R1, [R0] ; LCD controller에게 Data를 Data Line을 통해서 전달해 줍니다.
 
간단하죠? 그런데, 좀 이상한 거 못느끼셨나요? ADS에 High, Low를 넣는 걸 따로 구현 안했지요. 이게 A[7]이 MCU에서 LCD Controller로 Address line 대신에 연결되어 있는 이유인 게죠. 자자, A[7]이 High가 되면 ADS에 High가 들어갈 것이고, A[7]이 Low가 되면 ADS에 Low가 들어가겠지요? 어떻게 하면 그렇게 만들 수 있을까요? 바로~ Address를 장난치면 되는 거지요. A[7]이 High가 될 때는 2^7 자리가 1이 되면 되고, ADS가 Low가 되려면 2^7자리가 0이 되면 되는 거지요. 자자, 그러면 자 보세요. 2^7자리가 1이 되려면 0x80이 되면 되겠지요? (2^7=128=0x80). 그러니까 0x20000080에 Data를 쓰게 되면 LCD_CS_N도 Low Active 되는 거고요, 동시에 A[7]에도 High가 나가겠지요. 오호라~ 그런 깊은 뜻이? 그럼 다음의 Code를 한번 보세요.
 
; Command Issue
LDR R0, #0x20000080
LDR R1, #0xABCD
STR R1, [R0]
 
; Data Issue
LDR R0, #0x20000000
LDR R1, #0x1234
STR R1, [R0]
 
자, 이렇게 구성하면 어떻게 될려나요? 그렇지요~ 우리가 원하는 동작이 아주~ 자연스럽게~ 이루어 지는 것이죠. 만약에 A[0]에 묶어 놓으면 어떻게 하면 될까요?
 
; Command Issue
LDR R0, #0x20000001
LDR R1, #0xABCD
STR R1, [R0]
 
; Data Issue
LDR R0, #0x20000000
LDR R1, #0x1234
STR R1, [R0]
 
요렇게 해주면 되겠지요. 오호호호~ 너무나 심플하고 즐거운 이야기가 되어 버렸네요. 우후후~ 자 그르면, 이걸 C Code로 한번 짜 볼까요~? 이제까지 배운 모든 걸 총 동원해 볼꺼라구요. Macro와 Volatile, 그리고 pointer casting 까지..
 
#define Main_LCD_Write_cmd (cmd)   (*(volatile word *)(0x200000080) = cmd
#define Main_LCD_Write_data (data)   (*(volatile word *)(0x200000000) = data
 
Main_LCD_Write_cmd (0xABCD);
Main_LCD_Write_data (0x1234);
 
자, 어때요? 위에서 Assembly로 구현 했던 것들이 C로 다시 구현 잘 되었지요? 냐하하. 실은 LCD를 Control하는데 GRAM - Graphic Data를 넣어두는 LCD Controller 내부의 RAM을 GRAM이라 불러요. 이 녀석을 뿌리면 LCD에 그림으로 나타나는 거에요 - 이나 여러가지 다른 종류의 Register 설정등의 고려할 것들이 많지만, 이런 식의 Interface를 구성해서 LCD 같은 외부 Device를 Control 할 수 있는 거지요. 요즘은 DMA를 이용하여 LCD에 Data를 마구 뿌려주는 기술과 Interface를 고속 Serial 등으로 만들어서 뿌리는 경우도 있는 데요. 뭐 매 한가지죠.
 
이런 식의 Interface를 보았을 때 놀라심 안되어요~

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



댓글





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