인프런 커뮤니티 질문&답변

sssss님의 프로필 이미지
sssss

작성한 질문수

HAL, CubeMX, TrueSTUDIO를 이용한 STM32F4 무료 강좌

SPI 통신 질문

작성

·

603

0

안녕하세요, SPI 통신 관련하여 질문이 있습니다.

RTOS를 활용하여 Master에서 Slave로부터 Buffer를 transmit하고 receive하고자 합니다.

Slave는 Mbed OS를 활용하여 코드를 작성하였고, slave MCU에서는 buffer가 receive는 매우 잘 되고 있습니다.

Master MCU에서는 transmit는 잘 되는데 반면, 크기가 66인 buffer를 받고 있는데, 각 데이터의 값은 16, 17, ..., 45, 0, ..., 0의 값을 받아야 합니다. HAL_SPI_TransmitReceive_DMA를 활용하고 있고, 이 과정에서 RTOS를 사용하였는데, osDelay를 5ms로 하면 잘 받아지는데 2ms로 하면 계속해서 값이 0과 받아야 하는 값으로 순차적으로 바뀌어 올바른 값이 받아지지 않습니다. static한 값을 받아야 하는데 계속해서 바뀌는 것으로 보아 제대로 되지 않는 것 같은데, 이 문제를 어떻게 해결해야 할지 모르겠습니다.

osDelay는 2ms로만 해야 해서 이를 변경하지 않고 문제를 해결할 방법이 있을까요?

감사합니다.

답변 1

0

안녕하세요, 인프런 AI 인턴이에요. SPI 통신과 관련된 질문이군요.

Master MCU에서 SPI 통신을 할 때 일부 데이터 값이 잘못 전달되는 문제가 발생하고 있습니다. RTOS를 사용하고 계신데, osDelay를 2ms로 설정하면 데이터 값이 계속해서 잘못 전달되는 것으로 보이네요. 정적인 값을 받아야 하는데 계속 바뀌어서 제대로 전달되지 않는 문제일 것으로 추측됩니다.

이런 경우에는 일반적으로 SPI 통신의 타이밍 문제로 인한 에러일 가능성이 높으니 확인해보시기 바랍니다. SPI의 클럭 속도와 데이터 전송 모드 등을 다시 한번 확인해보세요. 클럭 속도나 모드를 잘못 설정하면 통신 에러가 발생할 수 있습니다.

또한, RTOS의 타이밍 문제일 수도 있습니다. osDelay를 2ms로 설정하면 문제가 발생하는데, 이는 SPI 통신 속도에 따라 타이밍 문제가 발생할 수 있기 때문일 수 있습니다. 이 경우에는 osDelay의 값을 변경하지 않고 타이밍 문제를 해결할 방법이 있을 수 있습니다.

SPI의 통신 속도나 RTOS의 타이밍을 조정하기 어렵다면, DMA 모드를 사용하지 않고 일반적인 Blocking 모드로 전환하여 테스트해보세요. DMA 모드를 사용하면 데이터 전송 속도에 따라 문제가 발생하기도 하니 한번 시도해보시기 바랍니다.

만약 위의 방법들로 문제가 해결되지 않는다면, 더 상세한 코드와 하드웨어 환경 정보를 제공해주시면 더 자세한 도움을 드릴 수 있을 것 같습니다. 감사합니다.

sssss님의 프로필 이미지
sssss
질문자

SPI 클럭 속도라고 말씀하시면, Baudrate를 설정할 때의 부분인가요?? 그 부분은 원하는 값으로 설정이 잘 되어있습니다.

RTOS의 타이밍 문제를 osDelay의 값을 변경하지 않고 어떻게 해결할 수 있을까요? 인터넷에 검색해본 결과 osDelayUntil이라는 함수를 사용하긴 하던데, 제 결과에는 큰 변화가 없었던 것 같습니다.

처음에는 DMA 모드를 사용하지 않고, 일반적인 blocking 모드로 전환하여 하였지만 올바른 데이터 값을 받지 못하는 것을 확인하여 조금 더 delay가 적은 DMA 모드를 사용하게 되었습니다.

상세한 코드와 하드웨어 환경 정보를 혹시 이메일로 전달드려도 괜찮을까요?

sssss님의 프로필 이미지
sssss
질문자

RTOS를 사용하지 않고, main 내의 while문에서 돌리니 속도는 조금 개선되었지만, 아직도 여전히 문제는 해결되지 않았습니다.

타이밍을 조정하거나 SPI 통신 속도를 조절하는 다른 방법이 있을까요?

sssss님의 프로필 이미지
sssss

작성한 질문수

질문하기