본문 바로가기

Cortex-M/GigaDevice

GD32F130 - SPI 테스트, SPI 전송 속도 향상 및 DMA 사용하기

GD32F130의 SPI 클럭 속도는 18Mhz이다.

 

 

 

#define LED1    PA1 

void setup() { 
   digitalWrite(LED1, 0); 
   pinMode(LED1, OUTPUT);     
   
  Serial.begin(115200); 
  Serial.println("GD32 Test"); 
}

unsigned char buf[3] = {1,2};

void loop() { 
  SPI.transfer(buf, sizeof(buf)); 
  SPI.transfer(buf, sizeof(buf)); 
}

 

테스트 결과 18Mhz 클럭이 출력되고 SPI출력 지연 시간은 1.1us로 최대 속도를 위해서는 SPI DMA를 사용해야 할것 같다.

 


Arduino 코드 특성상 SPI Read, Write 부분을 1Byte식 처리 하도록 되어 있기 때문에 속도가 느려질 수 밖에 없다. 이부분을 블록 단위로 Read, Write 할 수 있도록 수정하면 SPI 처리 속도를 향상 시킬 수 있다.

 

unsigned int SPI_WriteBuf(unsigned char *pDataBuf, unsigned int Size)
{
  int count = 0;
  for(unsigned int i=0; i<Size; i++)
  {
    while ((RESET == spi_i2s_flag_get(SPIx, SPI_FLAG_TBE)) && (count++ < 1000));
    
    if (count >= 1000) {
        return -1;
    } else {
        SPI_DATA(SPI0) = pDataBuf[i];
    }
  }    
  return count;
}

unsigned int SPI_ReadBuf(unsigned char *pDataBuf, unsigned int Size)
{
  int count = 0;
  for(unsigned int i=0; i<Size; i++)
  {
    while ((RESET == spi_i2s_flag_get(SPIx, SPI_FLAG_RBNE)) && (count++ < 1000));
    if (count >= 1000) {
        return -1;
    } else {
        pDataBuf[i] = SPI_DATA(SPIx);
    }
  }    
  return count;
}


void loop() {
  SPI_WriteBuf(buf, 2);
  SPI_WriteBuf(buf, 2);
  delay(10);
}

 

 

블록 단위 전송시 SPI 전송 지연 시간은 1000ns에서 200ns로 줄어 들었다.

 

 

 

DMA를 사용하면 

void loop() {
  spi_dma_enable(SPI0, SPI_DMA_TRANSMIT);
  SPI.transfer(buf, sizeof(buf));
}

 

136ns로 좀더 줄어 드는 것을 확인 할 수 있다.

반응형