1. SPI(Serial Peripheral Interface)
- 근거리에서 많이 사용하는 통신
- 전압차 이용하여 2가닥 통해 데이터 주고받음
1-1. Timebase (RS485, RS232 ...)
: 내가 보낼 데이터를 서로 약속한 시간으로 쪼개서 보냄
ex) bps 9600 (1초를 9600개로 나눔)
: 1초마다 내가 보낸 데이터를 9600개로 나누어서 1/0으로 구분
1-2. 클럭
: LOW에서 시작하면 HIGH -> LOW가 하나의 주기
: 클럭 기준으로 데이터가 HIGH이면 1, LOW면 0으로 구분
=> SPI는 클럭을 이용
=> 따라서, SPI통신은 데이터 선과 클럭 선이 반드시 존재 해야함
2. SPI통신의 데이터 주고받는 방식
2-1. 1:1
- 데이터 주고 받는 선이 1개인 경우 (반이중 방식)
: A가 데이터 선으로 전압을 내보낼 때 B는 아무것도 하면 안됨 - 데이터 주고 받는 선이 2개인 경우 (전이중 방식)
: A와 B가 각각 말하는 전용 선이 존재하고 클럭 선이 연결
: A는 A의 전용선을 통해, B는 B의 전용선을 통해 데이터 전송 (이때 클럭선 하나)
=> SPI통신은 이 방식을 많이 사용
2-2. 1:다
- 1 : A가 말하는 전용선
- 2,3,4 : A-B,A-C,A-D가 통신하는 선으로 각각 B,C,D가 말하는 전용선
=> 이때 A입장에서는 본인 선까지 4개이므로 B,C,D가 말하는 전용선을 묶어놓음
(1) 문제점
- A가 말하면 B,C,D 모두가 듣게됨 (B,C,D 모두 A의 전압을 체크 가능)
=> A가 보낸 걸 아는 상황에서는 누구한테 말한거지?
=> 실질적으론 누가 보냈는지 모름
1) "실질적으로 누가 보냈느냐?" 의 해결방법
- Master / Slave 관계 정의
- 기계를 만들 때 SPI통신에서의 SLAVE / MASTER 기계로 만든다
- Slave : 말하는 권한 X
=> 무조건 말을 듣고 응답만 하는 역할
ex) B,C,D는 A가 말하는지는 모르지만 일단 무조건 주인이 어떤 말을 하는구나 라고 생각하고 동작 - Master : 말하는 권한 ㅇ
=> 반드시 1:다에서 Master는 1개
2) "마스터가 말하는 건진 알겠는데 마스터가 누구에게 말하는 건가?" 의 해결방법
- CS 선 추가 (Chip Select)
=> GPIO선으로 많이 이용 - 평상시엔 High로 있다가 A가 B,C,D에게 데이터를 보내고 싶은 경우 B의 GPIO선의 전압을 LOW로 낮춰줌
- A가 B와 D의 CS 선의 GPIO를 LOW로 떨어트리고 데이터를 전송하면 B와 D가 동시에 듣게 됨
3. SPI통신의 기본 뼈대
: 말하는 전용선 , 듣는 전용선, 클럭선, CS(Chip Select) 선 존재
cf. I2C : Data / Clk 선 2개 존재 ( 반이중 방식 )
=> 이때 1:다를 SW적으로 해결(주소 이용)
4. STM의 SPI통신 지원
- 총 2개 지원
- MOSI : Master가 말하는 전용 선 이름 (Master Out Slave In : Master는 말하고 Slave는 듣는다)
- MISO : Master가 듣는 전용 선 이름 (Master In Slave Out : Master는 듣고 Slave가 말한다)
- SCK : 클럭
- NSS : HW로 CS 조절
- Slave 입장에서 SI(Slave in : 듣는 선)/SO(Slave out : 말하는 선)이라고도 표기
4-1. SPI통신의 Mode (CS 선 사용안하는 경우 존재)
- Full Duplex : 전이중
=> A - B 사이에 데이터 선 2개 존재하기에 CLK까지 총 3개의 선 존재 - Half Duplex : 반이중
=> A - B 사이에 데이터 선 1개 존재하기에 CLK까지 총 2개의 선 존재 - Receive Only : 수신 전용
=> A - B 사이에 데이터 선 1개 존재하기에 CLK까지 총 2개의 선 존재 - Transmit Only : 송신 전용
=> A - B 사이에 데이터 선 1개 존재하기에 CLK까지 총 2개의 선 존재
4-2. SPI통신의 HW NSS Signal (CS를 어떻게 컨트롤?)
=> 자동으로 CS를 LOW로 떨어트려서 데이터 전송
=> HW적으로 CS 제어하는 것은 내가 통신할 상대가 한개인 경우에만 사용해야함
=> 따라서 GPIO로 여러 개 제어하는 경우가 많기에 보통 HW NSS Signal은 Disable
4-3. SPI통신의 Option
- Frame Format : Motorola
=> SPI 통신 최초 설계하여 만든 곳으로 여기서 설계한 방식의 클럭 포맷 - Data Size : 8 /16 bits
=> 한 번 데이터를 전송할 때 8bit/ 16bit 씩 보낸다
=> 데이터 시트에 따라 bit수 정함 - First Bit : MSB/LSB First
=> 내가 보내고 싶은 숫자가 52일 경우 52 = 0011 0100인데, 왼쪽/오른쪽에서부터 결정
=> 데이터 시트에 따라 결정됨 - Prescaler(for Baud Rate) : 원래 클럭이 있는데 얼마나 나눌지 결정
- Clock Polarity : 클럭이 평상시에 LOW/HIGH ? 결정
=> 데이터 시트 보고 결정 - Clock Phase : 1 / 2 Edge
=> 어느 시점에 데이터를 어떻게 보느냐에 대한 설정
=> 데이터 시트 보고 결정
ex) 한 클럭 내에 보낸 데이터가 0인지 1인지 애매한 경우 사용
- NSS Signal Type : HW NSS Signal이 Disable이면 SW, Disable 아니라면 HW
=> SW라는 건 GPIO 이용하겠다는 것
cf. 만약 1:1인 경우
: cs선을 아예 LOW로 묶어서 Slave가 항상 듣는 상태로 만든다
'임베디드' 카테고리의 다른 글
[오제이 튜브의 임베디드 강의] 22강. STM32에서는 SPI기능을 제공한다구! (0) | 2025.01.26 |
---|---|
[오제이 튜브의 임베디드 강의] 21강. FND 제어 소스 분석! (0) | 2025.01.25 |
[오제이 튜브의 임베디드 강의] 19강. FND제어(실무 노하우) (1) | 2025.01.24 |
[오제이 튜브의 임베디드 강의] 18강. 내 힘으로 스위치 회로 만들기 (0) | 2025.01.24 |
[오제이 튜브의 임베디드 강의] 17강. 내 힘으로 LED회로 만들어서 제어하기! (0) | 2025.01.24 |