STM32/활용

STM32로 DS1302제어하기(1편)

원원 2023. 1. 4. 23:56

안녕하세요. 오늘은 STM MCU로 DS1302를 제어하는 글을 쓰겠습니다. 여기서 STM MCU를 사용하지만 GPIO를 제어해서 통신하므로 STM이나 ATMEGA나 아두이노나 다른 MCU를 사용하던 방식은 모두 같습니다. 그래서 님이 MCU를 STM를 사용하지 않더라도 이 글을 봐도 됩니다.
STM MCU는 NUCLEO-F103RB를 사용합니다.
DS1302는 2017년도에 아두이노로 제어하는 글을 쓴 적이 있어서 DS1302에 대해서는 이전에 썼던 글을 참고하면 좋습니다. 또한 DS1302보드도 옛날에 사용했던 보드로 사용합니다. https://wowon.tistory.com/92 

 

이제 STM32로 DS1302를 제어해야하므로 데이터시트를 자세히 봐야합니다.

DS1302.pdf
0.20MB

 

첫 번째로 DS1302로부터 '초'단위만 읽어서 시리얼모니터로 값을 확인해보겠습니다.

 

 

- 통신방식

그림1

DS1302로부터 시간을 write하거나 read할 때 통신을 해야합니다. 통신을 하기위해서 MCU랑 SCLK, I/O, CE핀이 연결이 되야 합니다. 통신방식이 SPI랑 비슷합니다. SCLK는 클럭핀이고 I/O핀은 data핀이고 CE핀은 통신 이네이블 핀이라서 통신을할때는 HIGH로 유지되어야 합니다.

 

 

- WRITE/READ 하기

그림2

ds1302에 write/read하려면 위와 같은 파형을 만들어야합니다. write한다는건 ds1302에 특별기능을 write하거나 원하는 시간을 write하는 동작입니다.read한다는건 ds1302에서 시간을 읽는 동작입니다.
앞쪽에 R/W'가 있는데 READ동작이면 1이고 WRITE동작이면 0입니다. 그리고 A0~A4가 있는데 주소값이랑 비슷한 느낌이고 A0~A4값을 바꿔서 seconds를 설정하거나 minutes를 설정하거나 합니다. R/C`가 있는데 RAM/CLOCK,CALENDAR을 의미합니다. RAM을 제어하려면 1, CLOCK,CALENDAR을 제어하려면 0으로 설정하면 됩니다.
D0~D7는 데이터비트 입니다.

그림3

처음 목표였던 '초'를 읽으려면 0x81을 LSB로 보낸 다음에 들어오는값을 읽으면 됩니다. 들어오는값도 LSB로 옵니다. 

이제 CE,SCLK,I/O핀을 GPIO제어해서 그림1과같은 파형을 만들어야 합니다. 먼저 WRITE파형부터 어떤식으로 만들어야 하는지 알아보겠습니다.

그림4

그림4는 WRITE파형입니다. 통신을 할 때 CE핀의 상태를 LOW에서 HIGH로 해놔야 합니다.
빨강 동그라미를 보면 클럭이 LOW에서 HIGH가 됩니다. 그때 DS1302는 I/O핀의 상태를 읽습니다. 클럭에 화살표가 있는 방향에서 DS1302가 데이터를 READ한다고 보면 됩니다. (MCU : Write, DS1302 : Read)
처음 클럭8개는 뒤에 나올 클럭8개가 어떤 데이터인지 알려주는 역할을 합니다.
그러므로 코드의 흐름은 아래처럼 하면 됩니다.

초기상태
CE핀 : LOW
SCK핀 : LOW
IO핀 : 사용자설정

* Write
1. CE핀 -> HIGH세팅
2. I_O핀 = OUTPUT 설정
3. I_O핀 -> HIGH or LOW
4. SCLK핀 -> HIGH
5. SCLK핀 -> LOW
6. 3~5번 과정 7번 더 반복
7 I_O핀 = OUTPUT 설정
8. I_O핀 -> HIGH or LOW
9. SCLK핀 -> HIGH
10. SCLK핀 -> LOW
11. 8~10번 과정 7번 더 반복
12. CE핀 -> LOW세팅

여기서 1번,7번에서 I_O핀을 OUTPUT설정하는 부분이 있는데 하나의 핀이 INPUT/OUTPUT역할을 하므로 OUTPUT설정을 먼저 해준겁니다.

 

그림5

그림5는 READ 파형입니다. 앞에클럭8개는  write때랑 방식이 같습니다. 빨강동그라미를 보면 READ는 클럭이 HIGH에서 LOW로 될 때 DS1302가 write합니다. (MCU : Read, DS1302 : Write)
코드의 흐름은 아래처럼 하면 됩니다.

초기상태
CE핀 : LOW
SCK핀 : LOW
IO핀 : 사용자설정

* Read
1. CE핀 -> HIGH세팅
2. I_O핀 = OUTPUT 설정
3. I_O핀 -> HIGH or LOW
4. SCLK핀 -> HIGH
5. SCLK핀 -> LOW
6. 3~5번 과정 7번 더 반복
7. I_O핀 = INPUT 설정
8. I_O핀 READ
9. SCLK핀 -> HIGH
10. SCLK핀 -> LOW
11. 8~10번 과정 7번 더 반복
12. CE핀 -> LOW세팅

여기서 중요한점은 7번에서 I_O핀을 INPUT으로 설정해야 한다는 점입니다.

 

다음 글에서는 write/read 코드와 실제 측정결과를 보겠습니다.

'STM32 > 활용' 카테고리의 다른 글

STM32로 DS1302제어하기(3편)  (0) 2023.01.24
STM32로 DS1302제어하기(2편)  (1) 2023.01.07