STM32 SPI_DMA 통신 시 데이터 송수신이 랜덤하게 되는 현상

2019. 07. 15. 01:08

slave master 간 서로의 데이터 송수신 버퍼 크기도 똑같이 설정했구

단지 rxcpltcallback 함수에서 rx로 들어온 버퍼를 tx 버퍼로 memcpy하여 다시 master로 보내는 작업을 진행하는 도중

어쩔 때는 값이 잘 송수신되는데 어쩔 때는 쓰레기 값을 송수신하는 경우가 있습니다.

왜 이러는 걸까요?

그리고 master에서 보내려는 데이터의 크기를 slave에서 미리 알아내서 rx 데이터 크기를 동적으로 설정할 수 있나요?

공유하고 돈벌기 ♥︎

총 1개의 답변이 있습니다.

질문자 채택 답변

우선 송수신 프로그램을 개발할때는 버퍼링에 대해 아셔야 합니다

예를 들어 버퍼크기가 10글자라면 글자를 받는쪽에서 7개의 글자를 받고 다른거 처리하느라 나머지 3개를 못받는 상황에서 추가로 20개의 글자를 받는다면?

수신측 컴퓨터는 중간의 글자를 분실하고 최근기준 10개의 글자만 받게되는 상태가 되므로, 버퍼의 크기를 시스템에 맞게 정하는것이 매우 중요합니다

그리고

어쩔 때는 값이 잘 송수신되는데 어쩔 때는 쓰레기 값을 송수신하는 경우가 있습니다.

왜 이러는 걸까요?

라고 질문하셨는데요, 처음에는 무조건 잘되다가? 두번째 이후부터 문제가 생기는건지

아니면

처음에도 어쩔때는 잘되고 어쩔때는 안되는지에 따라 답변이 틀려지는데요

우선 처음1회는 무조건 잘되는데 그 이후부터 안된다

이럴경우에는 첨에 설명한 버퍼문제일 가능성이 있습니다

버퍼 또는 메모리크기 확보를 잘 조정해보세요

또는 처음에도 불특정하게 되다 안되다 한다면?

그건 선로에 노이즈가 있어서 그렇게 될 가능성도 있습니다

주변에 전파를 강하게 내뿜거나 또는 고주파차단제(명칭이 가물가물)라고

자석처럼 검게생겨서 선을 감싸주는게 있습니다.. 그거를 선에다가 장착해주세요

그리고 master에서 보내려는 데이터의 크기를 slave에서 미리 알아내서 rx 데이터 크기를 동적으로 설정할 수 있나요?

이것은 가능합니다

단순하게 보내시면 안되구요

마스터/슬레이브끼리 통신 규약을 본인이 정하셔야 합니다

저 같으면 이렇게 하겠습니다

마스터는 슬레이브에 자료 보내기전에 기초자료를 제일먼저 보낸다

CMD/1024/TEXT[enter]

수신측 그러니깐 슬레이브는 첫단어가 CMD 라면 기초자료 설정값으로 인식하여

해당 기초자료값을 토대로 버퍼크기를 셋팅한다

그리고 마스터에 나 준비되었어요~~ 하고 응답을 보낸다

RES/OK[enter]

마스터는 RES 코맨드로 OK 라는 단어가 들어오면

데이타를 보내기 시작한다

이런식으로 작성하시면 됩니다

2019. 07. 15. 02:58
98