티스토리 뷰

프로젝트/OLED12864

OLED 12864 - SSD1306

Just4Fun 2018. 2. 10. 16:14

이번 프로젝트는 SSD1306를 사용한 OLED 128 x 64 디스플레이를 구동해 보는 방법을 구현해 보는것이다.

먼저 해야할 일은 SSD1306 datasheet를 구해서 충분히 이해될 정도로 반복해서 읽어 보는것이다.

위의 표에 설명되어 있는것처럼 SSD1306은 MCU와 연결하는 방법이 5가지가 있음을 알수 있다.  이번 프로젝트에서는 그 중에서 4-wire SPI 연결 방법을 이용하여 MCU와 연결하도록 하겠다.

이 프로젝트에서는 위의 그림에 보이는 OLED 디스플레이 모듈을 사용하도록 하겠다.  그림을 보면 모두 7핀이 제공되는데, SDIN(MOSI), SCLK(SCK), CS, D/C 이렇게 4개의 신호선을 SPI 통신으로 연결하는데 사용하고, Reset 신호를 받아들이기 위한 RES핀과 전원 연결을 위한 GND, VCC핀이 추가로 제공된다.

각각의 핀들은 위의 회로도처럼 MCU에 연결한다.  CLK과 MOSI핀을 제외하고 나머지 핀들은 필요에 따라 얼마든지 MCU의 다른 핀을 사용하여 연결하여도 된다.  LCD12864 - UART SPI Master Mode와 같은 방법을 이용할 경우 CLK과 MOSI핀도 USART 핀으로 대체할 수 있다.

4wire-SPI는 다음과 같이 동작시켜야 된다.

CS신호를 low로 만들고 command 레지스터에 값을 쓸때는 D/C신호를 low로 만들고, Graphic Display Data RAM(GDDRAM)에 데이터를 쓸때에는 D/C 신호를 high로 만들면 된다.

Datasheet와 위의 회로도를 보면 알겠지만, MISO핀을 사용하지 않는것을 볼수있다. 즉, 쓰기동작만 수행할 수 있고 읽기 동작은 할수 없다는 뜻이 된다.

그렇다는 얘기는 SPI 버스를 통하여 제대로 제어가 되는지 확인하기가 쉽지 않는다는 의미이다.  대부분의 다른 부품들의 경우 그 안에 들어있는 레지스터를 읽어보아 초기값이 제대로 읽히는지, 특정 레지스터 값을 변경하여 다시 읽어 보았을때 변경된 값으로 읽히는지 확인하는 방법으로 SPI 버스가 제대로 연결되어 있는지를 확인해 볼 수 있는데, SSD1306은 그게 안되기 때문에 최소한의 동작을 구현하여 원하는대로 동작되는지 확인해 볼수 밖에 없다.

Datasheet에서 SSD1306의 초기화 과정이 있는지 분석하여 설명대로 수행하도록 만든다.

초기화하는 방법중에 RES 신호를 이용하여 하드웨어적인 reset 절차를 수행할 수 있다.

I2C 버스를 이용하는 경우에는 RES 신호를 제공하지 않는 경우가 있는데 이때에는 위의 절차와 동일하게 소프트웨어(프로그램)으로 초기화 절차를 수행해 주어야 한다.

위의 그림이 power on 절차의 타이밍도이다.  전원이 인가된 후 RES신호를 low로 만든후 일정시간 유지 시킨다음 다시 high 상태로 만든다.  그러면 ssd1306 내부에서 기본적인 초기화 과정을 수행하게 되고, charge pump 제어 레지스터에 0x14를 써주어 charge pump를 enable 시킨다.  그 다음으로 display on/off 레지스터에 0xAF를 써주면 최소한의 정상적인 초기화 과정을 완료하게 된다.

하지만, 위의 과정을 수행하게 되더라도 화면에는 아무런 변화가 없으므로 초기화 과정이 제대로 진행되었는지 알수가 없게 된다.  따라서 다음과 같은 과정을 수행하여 초기화 과정이 제대로 진행되었는지 확인해 보면 된다.

ssd1306 레지스터 중에 Entire display on 레지스터가 있는데, 마지막 비트값이 0이면 GDDRAM에 들어있는 값이 화면에 출력되지만, 이 값이 1로 설정되면 GDDRAM의 값에 상관없이 전 영역이 ON 상태가 된다.  이 레지스터 값을 1로 만들어서 전 영역이 켜지는지 확인해 보면 기본적인 연결과 SPI 버스를 통한 레지스터 설정이 제대로 되는지 확인해 볼수 있을것이다.  또한 불량 픽셀이 있는지도 확인할 수 있다.

CS, D/C, RES 신호를 제어하는 코드와 SPI 신호에 관련된 신호를 초기화 시키는 코드이다.

SSD1306의 기능을 확인하기 위한 최소한의 코드를 위와 같이 만들어 보았다.

ssd1306_init() 함수를 앞에서 설명한 절차대로 수행하도록 하였다.

예상했던 대로 초기화 과정이 수행되는지 위의 코드를 이용하여 확인해 보도록 하겠다.

프로젝트를 빌드하여 에러없이 컴파일되는지 확인해 보고 OLED 디스플레이 화면이 모두 켜지는지 확인한다.

위의 그림과 같이 전체영역이 출력되면 하드웨어와 소프트웨어 모두 정상적으로 동작된다고 볼수 있다.  만약 위와 같이 출력되지 않는다면 핀 연결이 제대로 되었는지 확인하고 프로그램에 오류는 없는지 확인해 본 후 다시 실행해 본다.


oled_spi.zip


'프로젝트 > OLED12864' 카테고리의 다른 글

OLED 12864 - I2C  (6) 2018.03.10
OLED 12864 - String(문자 출력)  (6) 2018.03.09
OLED 12864 - Draw Dot  (0) 2018.03.03
OLED 12864 - HORIZONTAL, VERTICAL Addressing Mode  (0) 2018.03.01
OLED 12864 - Page Addressing Mode  (0) 2018.03.01
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함