STM32F103 SPI 통신 코드 작성하기

STM32F103 SPI 통신 코드 작성하기

STM32F103 SPI 통신 목차

  1. STM32F103 SPI 통신 CUBEMX로 초기 설정하기
  2. STM32F103 SPI 통신 코드 작성하기 (현재 포스팅)

 

SPI 통신의 기본 원리는 데이터를 쓴 만큼 데이터를 받는다. 이 말은 즉 데이터를 받고 싶으면 그 만큼 더미데이터를 보내야 한다는 뜻이다. 이번 포스팅은 SPI를 사용하는 ADC 칩과 통신하고자 한다.

 

처음 SPI를 시작할 때 ADC 칩을 초기화 해야한다. 이전에 어떤 데이터를 받아 그 일부가 남아있거나, 통신에 실패해 문제가 생겼을 수도 있기 때문이다. 따라서 칩에서 서술하는 초기화 방법을 숙지하고, 코드로 작성하기로 한다.

 

데이터 시트에서는 초기화 방법을 서술하고 있다.

 

ADC 칩에서는 DIN핀으로 1의 값을 32번 연속으로 주면 초기화가 된다고 서술하고 있다. 이전 포스팅에서 데이터 비트수를 8로 설정하였으므로, 0xFF 값을 4번 연속으로 호출하도록 한다.

 

따라서 먼저 SPI 통신을 시작한 후에, Chip Select 핀 출력을 Low로 준 다음 리셋을 시작한다. 그리고 안정시간으로 1ms를 준다. 데이터시트에서는 500us이지만, 맘 편이 1ms를 주었다.

 

따라서 작성한 코드는 아래와 같아진다.

  1. SPI를 동작시킴
  2. GPIO A라인에서 4번째 핀의 출력을 LOW로 설정한다. (PA4포트 출력 LOW)
  3. SPI1에서 RESET DATA( = 0xFF)를 4번 호출해 1의 값을 연속으로 32번 준다.
  4. GPIO A라인에서 4번째 핀의 출력을 HIGH로 설정한다. (PA4포트 출력 HIGH)
  5. 칩 안정화 시간을 준다.

 

겁먹지 마시라. SPI 통신 방식은 생각보다 간단하니. 데이터 전송과 수신을 동시에 하고 싶다면 HAL_SPI_TransmitReceive함수를 사용하도록 한다.

 

HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout)

 

어떤 spi를 사용하는지, 전송할 데이터 값과, 수신받을 데이터, 데이터의 길이와 타임오버 값을 주도록 한다.

 

P.S)

만약에 로직애널라이저로 찍었을 때 클럭 타이밍을 놓친다면 Timeout을 5정도로 늘려보시라.

 

5 Replies to “STM32F103 SPI 통신 코드 작성하기”

  1. 정리가 잘 돼 있어서 STM32 코드 테스트 하는데 큰 도움이 되었습니다. 감사합니다.

    그런데 HAL_SPI_Transmit이 끝나고 난 후 chip select는 high로 돌아가야 하므로 HAL_GPIO_WritePin에서는 GPIO_PIN_SET으로 설정해야 정상 동작을 하지 않을까 합니다. 혹시 GPIO_PIN_RESET을 하신 이유가 있는지 여쭤봐도 될까요?

    1. 죄송합니다. 요즘 애달픈 일이 많아서 블로그 관리를 통 못했습니다. SET이 맞습니다. 혼선을 드려서 죄송합니다.

  2. SPI slave 통신 프로그램에 대해서 문의하고 싶은데, 개인 email이 있으신지요?

    1. 안녕하세요. 답글로 공개하기 다소 여하하여 남겨주신 이메일로 메세지를 드렸습니다.
      Slave는 통신해 볼 경험은 없으나, 문의글을 남겨주시면 관련 레퍼런스를 찾아보고 답변 드리겠습니다.

댓글 남기기

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d 블로거가 이것을 좋아합니다: