STM32 SPI_DMA 통신 시 동적 데이터 송수신 방법?
만약 MASTER가 AAAA라는 데이터를 송신하려 하고 SLAVE는 MASTER가 송신하는 데이터의 크기를 알지 못한다는 가정 하에
SLAVE는 MASTER가 송신하려는 데이터의 크기를 미리 알아낼 수 있나요?
애초에 HALSPI_Receive_DMA(&hspi, 버퍼, 데이터 크기) 이 함수에서 마지막 매개변수가 받으려는 데이터의 크기를 적어놔야 하는데...
아니면 혹시 AAAA 라는 데이터를 송신하면 slave는 receive함수를 4번 실행하는 매커니즘인가요?
그렇게 된다면 receive 함수 안에 카운터 변수를 만들어 데이터의 크기를 측정하면 될 거 같은데...
spi에 대한 강의나 자료를 구하기 어려워 이렇게 질문 남겨봅니다...
HALSPI_Receive_DMA()는 지정한 배열(*pData)에 지정한 길이(size)만큼 채워지면 자동으로 event가 발생이 됩니다. 수신되는 데이터의 길이가 가변이 된다면 1byte씩 데이터를 받아서 수신된 데이터 배열을 가지고 master에서 가공해서 사용하는 방법이 있습니다.
위와 같이 사용하시려면 당연히 수신되는 데이터의 패턴을 알고 있어야 가공이 가능합니다.
HALSPIReceive_DMA(&hspi1, Rdata, 4);
와 같이 정의하면 수신되는 4바이트가 들어오면 Rdata 배열에 저장하고 다시 수신 대기하는 방식이고
HALSPIReceive_DMA(&hspi1, Rdata, 1);
와 같이 설정하면 1바이트마다 Rdata 배열에 저장하고 다시 수신 대기하는 방식이 됩니다.
아래의 경우 1바이트 데이터가 수신되면 Rdata를 다른 버퍼에 stack할 수 있도록 별도의 배열을 만들어서 처리해야 합니다.
애초에 HALSPI_Receive_DMA(&hspi, 버퍼, 데이터 크기) 이 함수에서 마지막 매개변수가 받으려는 데이터의 크기를 적어놔야 하는데...
이 부분에서 데이터크기는 개발자가 임의로 데이터 크기는 n 개다 라고 fix 한 값이구요
얼마만큼의 자료를 상대방으로부터 받아서 버퍼에 저장했는지 모르겠으나,
수신측은 n개만큼만 통신버퍼에서 가져오는것입니다
보통 토큰링 방식을 이용하며, key값은 최종적으로 받은 글자위치를 가지고 있습니다
이해를 돕기 위해 워키토키(무전기)와 비교하겠습니다
휴대폰 아니에요...무전기입니다 ^^
무전기는 한쪽이 말을 다 끝난다음 오바(over) 이야기하잖아요
예를 들어서
a:여기는 hqx199 들리나 오바?
b: 잘 들린다 오바!
a:지금부터 내가 4개의 글자를 보내겠다, 잘 듣고 적어라 오바!
b: 알겠다 4개의 글자를 받아서 잘 적어놓겠다 오바!
a: abc , 오바!
b: 4개의 글자가 아니다 , 다시 불러달라 오바
a:abcd , 됐나?오바?
b: abcd 확인했다 오바
이런식으로 컴퓨터도 a역활과 b 역활이 있어야 합니다
단순하게 상대측 컴퓨터가 4개의 글자 보냈다고 하여,아~ 4개 보냈구나 하고 알수가 없습니다
즉, 이런것들을 프로토콜이라고 말하는데, 컴퓨터는 바보이므로 이렇게 통신규약으로 순서에 맞게 개발해주셔야 합니다
프로토콜이 틀리면, 정확한 자료를 받을 수 없습니다....