SPI
데이터 주고받는 선 : 3가닥 ( 클럭, 데이터2 )
> 전압차이 이용 HIGH > LOW or LOW > HIGH
데이터 구분
1. Time base : bps (1초를 쪼개서)
2. CLK : 1주기에 대한 데이터의 값 구분
> SPI : CLK
전이중 > A의선 B의선 두개로 서로 말할 수 있음
반이중 > A와 B 가 하나의 선을 번갈아 사용
> SPI :default 전이중, + 둘다 사용
1:다수 통신
A 1) > B C D
2) > B C D
CLK > B C D
>> 단점1) A입장 >누구한테 말할지 알 수 없음
" 2) BCD입장 > 누가 말하는지 알 수 없음
(SPI 해결)
2)
Master, Slave 전용으로 만듬
slave : master에 따라 동작, 응답
A : Master(한개) > Slave (다수)
1)
CS선 : chip select
> A - B, A-C, A-D
GPIO로 보통 활용
> 평소 HIGH > LOW 로 낮춰서 듣도록함
<>
I2C : data , clk 2개만 사용 >> 반이중,
cs line X > '주소' sw 방식 활용
stm32 지금 칩에선 2개 SPI 지원
MOSI) M : out , S : in 마스터가 말함
(ex) 온도센서 : Slave <> stm32 : Master
온도에 대한 일정값이 되면 Master에게 정보를 줌
Hardware NSS
> CS를 하드웨어적으로(~= 물리적) LOW로 떨어뜨림
// 때마다 하는것이 아닌 그냥 바로
> 2개 이상일 경우 CS 의 의미가 사라짐
>> input 이 하나일때만 사용
> 잘안쓰고 GPIO로 제어
DATASIZE : 한번에 얼마나 보낼것인지
> DATASEET 따라갈것
// STB ~= CS line
DI/0 > DATASEET
ex) b0 b1 b2 b3 순서 >> LSB first == litter endian
prescaler (for baud rate)
> 데이터 시트상 속도 얼마까지 가능한지 파악후 셋팅
clock polarity : 평상시의 클럭이 HIGH 인지 LOW 인지
Clock phase :
// clock polarity 와 잘 조합해서 상승, 하강 엣지 설정 가능
1edge) 1주기의 시작이 기준
2edge) 1주기의 중간이 기준
>> DATASEET
>> SPI 된다고 그냥 쓰는것이 아닌
LSB, MSB first 인지 clock polarity 가 HIGH, LOW인지 등등
다 파악후 맞춰줘야함
//통신할게 1개뿐이라 CS 선을 쓰고싶지 않다면..
> Slave를 GND로 묶어버림