full duplex. SPI 의 동작을 이해하는 열쇠다.
읽기만 하고 싶어도 써야 한다
uint8_t rx = spi_transfer(0xFF); /* 더미 0xFF 를 보내야 클럭이 나가고, 그래야 받는다 */
클럭은 마스터만 만든다. 슬레이브는 클럭이 있어야 자기 비트를 실을 수 있으므로, 받기만 하려 해도 마스터가 뭔가를 보내 클럭을 만들어야 한다.
시프트 레지스터로 보면 명확하다
마스터 [ 송신 레지스터 ] ──MOSI──► [ 수신 레지스터 ] 슬레이브
[ 수신 레지스터 ] ◄─MISO─── [ 송신 레지스터 ]
클럭 8번 = 두 레지스터의 내용이 서로 교환된 것
그래서 생기는 성질
- 보낸 바이트 수 = 받은 바이트 수. 항상 같다
- 응답은 한 박자 늦게 온다. 명령을 보낸 그 전송에서 받은 값은 대개 의미가 없다
- 이 지연을 처리하려고 더미 바이트를 넣는 시퀀스가 데이터시트에 자주 나온다