생활
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 둘 다 송수신 함수를 사용합니다.
둘 사이에 서로 다량의 바이트인 데이터를 주고 받으려는게 현재 목표입니다!
2개의 답변이 있어요!
안녕하세요.
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개 보내면,
슬레이브는 셋팅 상황에 따라 가운데 글자는 못받고 다음 글자를 받을수도 있습니다
(보통 버퍼크기보다 작게 글자수 들어오면 탈락없이 다 수신되기는 합니다)
이런걸 유념해두고 개발하시면 됩니다!
이제 위 질문에 대한 답변을 하자면,
둘 사이에 서로 다량의 바이트인 데이터를 주고 받으려는게 현재 목표라고 하셨죠?그러면 지금과 같은 방식을 사용하시면 안됩니다 ^^
이게 워낙 다양한 내용인지라 한번에 답변은 안되고, 최저 통신사양(능력)에 맞춰서 프로그램을 개발하시라는 말밖에 못드리겠네요