아하
검색 이미지
생활꿀팁 이미지
생활꿀팁생활
생활꿀팁 이미지
생활꿀팁생활
이타치처럼탈주
이타치처럼탈주19.06.17

Nucleo와 Arduino 간 SPI 통신 구현은 어떻게 하나요?

Nucleo는 STM32Cube IDE를 통해 Slave로 설정하고
Arduino는 sketch를 통해 Master로 설정했습니다.

먼저 아래는 Arduino로 구현한 코드입니다.

void setup(void) {
SPI.begin();
digitalWrite(SS, HIGH);
SPI.setClockDivider(SPICLOCKDIV16);
SPI.setDataMode(SPI_MODE1);
Serial.begin(9600);
}

void loop(void) {
digitalWrite(SS, LOW);
byte A = SPI.transfer(0x08);
delay(5);
digitalWrite(SS, HIGH);
Serial.println(A);
delay(1000);
}

아래는 Nucleo 코드입니다.

uint8t m[] = {0x06};
HAL
_SPI_Receive_IT(&hspi1,(uint8t*)m,(uint16_t)sizeof(m));
HALSPITransmitIT(&hspi1, (uint8t*)m, (uint16_t)sizeof(m));

간단하게 Slave인 Nucleo에게 0x08 값을 송신해주고
Nucleo는 SPI 통신의 특징으로 인해 0x06을 Arduino에게 보내주려고 하는 코드입니다.

그런데 이렇게 작성할 시 Arduino는 자꾸 8값만 출력하게 되는데
혹시 어떤 부분이 잘못 됬는지, 어떻게 고쳐야하는지 알 수 있을까요?

+추가 질문
Slave인 Nucleo는 Receive 함수를 사용하지 않고 Transmit 함수만 써도 둘 사이에 데이터를 주고 받을 수 있나요?

55글자 더 채워주세요.
답변의 개수
1개의 답변이 있어요!
  • 안녕하세요.

    Nucleo 보드에서 0x08을 m변수에 받아서 그 값을 다시 보내게 되므로 0x08이 나가는 것 같네요..

    변수를 rx, tx 별도로 두시고 사용해야 Nucleo에서 선언된 고정값이 나가는 것 같습니다.

    아래와 같이 수신값 0x08을 받으면 0x06이 나가도록 조건을 추가하면 될 것 같습니다.

    CS enable/disable은 정의하신 출력으로 제어하시면 됩니다.

    uint8_t rx = 0x00; uint8_t tx = 0x06; HAL_SPI_Receive_IT(&hspi1,(uint8t*)rx,1); if(rx == 0x08) { SPI_CS_Enable; //user define CS set low HAL_SPI_Transmit(&hspi1, tx, 1); HAL_Delay(10); SPI_CS_Disable; //user define CS set high }