STM32F103 SPI 데이터시트 공부하기

STM32F103 SPI 데이터시트 공부 포스팅입니다.

 

STM32F103 SPI 통신 LL 드라이버 목차

  1. STM32F103 LL SPI CUBEMX로 초기 설정하기
  2. STM32F103 LL SPI 데이터시트 공부하기 (현재 포스팅)
  3. STM32F103 LL SPI 코드 작성하기

 

HAL 드라이버는 구조 몰라도 코드 끌어다 쓰면 그만이었지만, LL은 안그렇다. 이번 포스팅을 공부하면서 HAL이 정말 혜자구나..할 수도 있다.

SPI 통신 도식도

SPI 구조는 위처럼 생겼다.

 

이전 포스팅에서 다뤘듯이, SPI는 데이터를 보내는 것과 수신하는 것이 동시에 이뤄진다.

근데, 이게 곧 내가 어떤 데이터를 보고 싶다고 데이터를 떤지면,

그 즉시 데이터가 수신되는 것이 아니다.

 

위를 보면 마스터와 슬레이브 단에 각각 쉬프트 레지스터가 있다.

중간 단계가 있단 이야기다.

 

절차 – CUBEMX 설정 했다면 안봐도 됨

첫 번째로 클럭의 속도를 지정해 줘야 한다.

내가 쓰는 칩은 높은 속도를 지원 안해서 1Mhz로 설정했다.

두번째로 CPOL, CPHA 비트를 설정해줘야한다.

이것도 이전 포스팅에서 다뤘다. 하지만 밑에 한번 더 다루겠다.

세번째로 데이터의 길이를 정해줘야한다.

8비트로 할건지, 16비트로 할 것인지를 말이다.  난 8비트로  설정했다.

네번째로 LSB FIRST로할건지, MSB First로 할 것인지를 정해야한다.

제어할 칩이 MSB이므로 나는 MSB로 설정했다.

다섯번째 설정부터는 NSS를 소프트웨어로 제어할 경우인데,

난 칩선택을 수동으로 할 것이므로 안읽었다.

 

데이터 클럭 다이어그램 – CUBEMX 설정 했다면 안봐도 됨

CPOL 핀은 SPI 통신하지 않을 때 클럭 핀을 high상태로 유지할 것인지,

Low 상태로 유지할 것인지를 설정하는 레지스터이다.

이건 제어할 칩을 보고 선택하는데 내가 제어하는 칩은 High였다.

NSS는 칩 선택 핀 개념이다.

제어할 칩은 Low로 놓고 통신이 끝나면 High로 올리는 식이다.

그래서 SPI핀에 다수의 칩을 연결해 놓아도 개별 제어가 가능하다.

MSB, LSB는 8비트 데이터를 보낼때

처음 비트부터 보낼건지 역순으로 보낼 것인지를 지정하는 것이다.

만약 데이터가 0xF0이라면 MSB First라면 0xF0로 데이터가 전송되겠지만,

LSB라면 0x0F로 전송될 것이다. M은 Most고 L은 Least이다.

MSB는 최 앞단을 대표하는 비트, L은 최 후단을 대표하는 비트다.

CPHA는 클럭이 상승할 때 하강할 때 급격하게 변화하잖나,

그것을 Edge라고 하는데, 첫번 째 edge를 기준으로 데이터를 계측할 지,

두 번째 edge를 기준으로 데이터를 계측할 것인지를 지정하는 비트다.

CPHA가 1이면 두번째 엣지에 계측하고 0이면 첫 번째 엣지에서 계측한다.

내가 사용하는 칩은 두번째 엣지에서 캡쳐해야하므로 1로 설정했다.

송신 시퀀스

송신(Tx) 버퍼에 데이터를 쓰는 것으로 시작으로 시퀀스가 시작된다.

데이터를 버퍼에 보내면 TXE 플레그가 Set 되는데

만약에 SPI_CR2 레지스터에 있는 TXEIE 비트를 설정해두면 인터럽트도 생성된다.

수신 시퀀스

데이서 전송이 완성되면 수신 버퍼가 차 있을 것 아닌가. 그러면 RXNE 플레그가 켜진다.

만약에 SPI_CR2 컨트롤 레지스터에 있는

TXNEIE 비트를 ON해두었으면 인터럽트도 생성될거다.

SPI_DR 데이터를 읽으면 플레그는 꺼진다.

 

마스터 모드 – Full Duplex

Tx 버퍼로 데이터를 보내면 동시에 수신 데이터도 도착할 것이다.

그러니 데이터를 한번 읽어달라는 내용이다.

 

DATA Handling

TXE 플레그가 생기고 난 뒤에, 데이터 전송이 다 되면 플레그 해제되고,

RXNE 플레그는 생기고 난다음 데이터 들어있는거 읽어주면 해제된댄다.

아래에 도식도 첨부될 건데 먼저 번역하면 이렇다.

 

  1. 일단 SPI 동작시켜라
  2. SPI_DR 데이터 레지스터에 데이터 써라 – 그러면 플레그 생기것지?
  3. TXE가 1이 될 때까지 기다린 뒤에 두번째 데이터를 보낸다. 그러면 쉬프트 레지스터로 수신해야하는 데이터가 올테니 RXNE 플레그가 1이 될때까지 기다렸다가 데이터를 수신해라.
  4. 나머지 한 개더 수신해야 보낸 횟수랑 수신한 횟수가 같아진다. 그러니까 RXNE 플레그가 1이 될 때까지 기다렸다가 마지막 데이터를 수신해라
  5. TXE가 1이 될때까지 기다렸다가 BSY이 0이 될때까지 기다린 다음 SPI 사용 종료해라

 

위 그림을 보면 데이터를 보내고 TXE = 1 될때까지 기다렸다가 데이터 한번 더 보낸다.

그리고 바로 RXNE가 1이 될때까지 기다렸다가

TXE = 1이 될때까지 기다린 후 데이터를 보낸다.

그리고 RXNE 플래그를 다시 기다린 후 데이터 수신하고,

마지막 데이터를 수신한다.

 

레지스터 정리

  • SPI_CR2 : 컨트롤 레지스터 2 – CUBEMX로 설정했다면 이걸 다시 만질 일은 없을 것이다. 보통 인터럽트 만질 때 쓰는 거 같더라.
  • SPI_DR : 데이터 레지스터. 수신 할때나 송신할 때나 이 레지스터를 사용한다. 이 레지스터에 데이터를 넣거나 읽으면 된다.

 

댓글 남기기

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.