IoT|Embedded/[STM32] 고추건조기 개발기

SPI 통신

jinyess 2024. 9. 30. 15:49
  • 보드와 보드 사이 근거리에서 사용하는 경우 많음
  • 하나의 보드 내에서 A 칩과 B 칩 사이 통신(소자와 소자, 모듈과 모듈간 통신)
  • 클럭에 대한 제한이 없어 이론상 무제한 빠르게 통신 가능
  • MCU에서 어떤 플래시 메모리에 데이터를 기록하고싶다면 SPI 통신
  • A와 B가 선 하나를 가지고 통신할 때 두개가 동시에 전기적 신호를 보낼 수는 없음
    • SPI는 기본적으로 2가닥을 기준으로 통신 (데이터 통신)
  • 말하는 전용 선, 듣는 전용 선, 클럭선, CS(Chip Select)선
  • 클럭의 간격이 SPI 통신에서는 반드시 일정하게 동작하지는 않음

전압차이로 데이터 통신

  • 전압 한번 올라갔다 내려오면 1
  • ex) GPIO 이용해서 3V 전압 조절하며 데이터 전송함
  • ex) 1이 여러개 전송될 경우(붙어있는 신호) 1이 몇 개인지 알수 없음. - 구분점으로 사용하기 위한 방법
    • Time base
      • 시리얼통신 RS485 RS232에서 주로 쓰임
      • 서로 약속한 시간 (bps) ex) bps9600 이면 1초를 9600으로 나눔
    • 클럭
      • 클럭 한 주기를 기준으로 한 주기동안 신호가 어디를 유지하고 있었는지
        • 그 주기 때 클럭을 확인했을 때 HIGH이면 1

SPI통신은 클럭 방식

  • 데이터를 주고받는 선과 클럭선이 반드시 있어야함
  • 전이중 방식, 반이중 방식 모두 사용할 수 있지만 기본은 전이중 방식

전이중 방식

  • 각각의 선을 사용함. 서로 신호를 내보내더라도 각각의 선을 사용하므로 신호에 문제 발생하지 않음

반이중 방식

  • 데이터를 주고받을 때 하나의 선을 사용함
  • A 가 전압 내보낼 때 B도 신호를 내보낸다면 신호 문제발생

1:다

  • A전용선을 이용해 B, C, D 에 통신
    • A - B
    • A - C
    • A - D
    • 각각 통신할 때 B가 말하는 전용선 따로, C가 말하는 전용선 따로.. 이렇게 따로 둘 경우
    • A 입장에서는 데이터 선만 4가닥이 연결되어야하므로, A 말하는 전용선 한개, 여러개가 말하는 전용선을 묶음
  1. A 가 말하면 B, C, D 가 모두 신호를 받고, 누구에게 통신을 시도한 것인지를 모름
  • CS 선을 추가. (Chip Select)
  • 평상시에는 전압을 HIGH로 두었다가 B 에게 말하고 싶다면 GPIO선의 전압을 LOW로 낮춤
  • 여러개를 LOW로 낮추면 낮춘거 모두 들음
  1. 누가 누구에게 통신을 시도한 것인지도 모름 (누가 말하는지 모름)
  • Master - Slave 관계를 정함.
    • Slave는 무조건 통신 듣고 응답 하는 역할
    • 누군가 통신을 시도하면 무조건 Master 라고 앎
I2C
  • SPI 통신과 비슷하긴 하지만 다른점
  • 선을 2가닥 사용함 - 데이터 통신선, 클럭선(반이중 방식)
  • CS선이 없지만 1대다 통신 가능함
    • 소프트웨어 적으로 해결.
    • B에게 보내고 싶다면 B를 먼저 외친 후 데이터 전송
    • 전기적 신호조차 C, D, E 도 다 듣긴 하지만 내가 아니라면 응답하지 않음
  • 패킷에 내 주소 데이터를 포함해서 전송

STM IDE

  • MOSI(Master output, Slave input) Master에서 말하는 전용선
  • MISO(Master input, Slave output) Master에서 듣는 전용선
  • SCK 클럭
  • NSS 하드웨어로 CS를 조절
Mode
  • Full Duplex (전이중) - 3가닥
  • Half Duplex (반이중) - 2가닥
  • Receive Only (수신 전용) - 2가닥
  • Transmit Only (송신 전용) - 2가닥
  • 개발 시 Master로 지정할 지 Slave로 지정할 지에 따라 Mode 설정
Hardware NSS Signal
  • CS를 어떻게 컨트롤할 것인지
  • 내가 통신할 것이 하나일 경우에만 사용 가능하므로 기본적으로 Disable 인 경우가 많음
기타 옵션(데이터시트를 보고 )
  • DataSize : 한 번 전송할 때 몇 비트씩 보낼 것인지
  • 맨 첫번째 먼저 보내면 MSB, 맨 뒤 부터 먼저 보내면 LSB -> 데이터 시트 확인 후 설정
  • 칩의 SPI 통신이 최대 몇 MBit/s 까지 가능한지 확인 후 설정 - 빠르면 빠를수록 좋긴 하다..
  • Clock Polarity : CLK가 평상시에 HIGH인지 LOW인지를 확인
  • Clock Phase : 1 Edge, 2 Edge 어느 시점에 데이터를 어떻게 볼지
    • 1Edge: 0인지 1인지 구분이 안갈 때 클럭이 내려가는 시점의 값으로 결정
    • 2Edge: 0인지 1인지 구분이 안갈 때 클럭이 올라가는 시점의 값으로 결정

# 드디어 FND 제어