HAL SPI DMA 1바이트씩 데이터 송신 시 송신함수 갯수?
0x00 0x01 0x02 0x03 이라는 데이터를 1바이트씩 송신하려고 합니다.
master 측에서
uint8_t buff = { 0x00, 0x01, 0x02, 0x03};
HAL_SPI_Transmit_DMA(&hspi2, buff, 1);
HAL_SPI_Transmit_DMA(&hspi2, buff, 1);
HAL_SPI_Transmit_DMA(&hspi2, buff, 1);
HAL_SPI_Transmit_DMA(&hspi2, buff, 1);
while(HAL_SPI_GetState(&hspi2) != HAL SPI STATE READY) {}
이렇게 사용해줘야 맞는건가요?
만약 그렇다면 slave 측에서도 receive 함수를 4번을 써야하는건가요??
#### 추가사항
SLAVE와 MASTER 둘 다 송수신 함수를 사용합니다.
둘 사이에 서로 다량의 바이트인 데이터를 주고 받으려는게 현재 목표입니다!
안녕하세요.
SPI 통신을 하기 위해서는 slave를 선택하는 CS 신호를 먼저 enable하고 송신 함수를 처리해야 합니다.
아래 코드는 가장 기본적으로 구성한 예 입니다. 또는 한 번에 송신해도 됩니다.
uint8_t buff = { 0x00, 0x01, 0x02, 0x03}; SPI_CS_ENABLE; //<<HAL_GPIO_WritePin() Set / Reset으로 제어 여기서는 reset값이 enable HAL_SPI_Transmit(&hspi1, buff[0], 1, 100); SPI_CS_DISABLE; //<<HAL_GPIO_WritePin() Set / Reset으로 제어 여기서는 set값이 disable HAL_Delay(10); SPI_CS_ENABLE; HAL_SPI_Transmit(&hspi1, buff[1], 1, 100); SPI_CS_DISABLE; HAL_Delay(10); SPI_CS_ENABLE; HAL_SPI_Transmit(&hspi1, buff[2], 1, 100); SPI_CS_DISABLE; HAL_Delay(10); SPI_CS_ENABLE; HAL_SPI_Transmit(&hspi1, buff[3], 1, 100); SPI_CS_DISABLE; HAL_Delay(10);4개의 버퍼값을 한 번에 보낼 때는 다음과 같습니다.
SPI_CS_ENABLE; HAL_SPI_Transmit(&hspi1, buff, 4, 100); SPI_CS_DISABLE; HAL_Delay(10);흐, 이게 말로 설명하기 보다는 동영상 강의를 하고 싶은 욕망이 드네요
그냥 쉽게 더 설명을 드리자면,
마스터/슬레이브 역활을 하는 임베디드이든 그 무엇이든(중요)
동기화가 중요하구요 사람으로 치면,
마스터 - 손바닥에 있는 1개의 공을 슬레이브 쪽으로 던지는 역활
슬레이브 - 눈과 귀가 멀어서, 언제 손바닥에 공이 올지 모르지만,
공이 손바닥에 닿으면 그 공을 호주머니에 넣는 역활이 되는거죠.
그러니깐 , 슬레이브가 준비가 안되어 있는데 무조건 글자를 보내면,
슬레이브의 상황에 따라 첫번째 글자는 받을수 있으나,
호주머니에 공을 넣기도전에 또 마스터가 글자1개 보내고 또 글자 1개 보내면,
슬레이브는 셋팅 상황에 따라 가운데 글자는 못받고 다음 글자를 받을수도 있습니다
(보통 버퍼크기보다 작게 글자수 들어오면 탈락없이 다 수신되기는 합니다)
이런걸 유념해두고 개발하시면 됩니다!
이제 위 질문에 대한 답변을 하자면,
둘 사이에 서로 다량의 바이트인 데이터를 주고 받으려는게 현재 목표라고 하셨죠?그러면 지금과 같은 방식을 사용하시면 안됩니다 ^^
이게 워낙 다양한 내용인지라 한번에 답변은 안되고, 최저 통신사양(능력)에 맞춰서 프로그램을 개발하시라는 말밖에 못드리겠네요