본문 바로가기

[ST_MICRO]/STM32G0

#STM32G-SSM EVM - Arduino 코드로 SPI 테스트

 

[STM32G-SSM] 보드에서 SPI 핀맵은 아래 그림과 같이 할당되어 있다.

 

 

#define PIN_SPI_MOSI            PA_4
#define PIN_SPI_MISO            PA_3
#define PIN_SPI_SCK             PA_0
#define PIN_SPI_SS              PC_14

 

 

Arduino 코드로 SPI출력 하면 멈춰 버린다.
variant.h 파일에서 핀맵 맞추고 PinMap_SPI_MOSI[0] 에 SPI2가 디폴트가 되도록 수정 했다.

#include <SPI.h>

unsigned char spixfer(unsigned char Data)
{
    return SPI.transfer(Data);
}

int cnt = 0;
void loop() 
{
 Serial.println(cnt++);

  
  digitalWrite(12, HIGH);
  delay(100);
  
  spixfer(0xff);

  digitalWrite(12, LOW);
  delay(100);  
}

 



SCLK출력은 나오는데(기본 4Mhz) MOSI 출력이 나오지 않는다.
  

STM32CubeMx 에서 생성된 코드를 보니 설정이 다르다.
GPIO_AF0_SPI2 에서  GPIO_AF1_SPI2 로 설정 하니 정상으로 출력이 된다.

#ifdef HAL_SPI_MODULE_ENABLED

WEAK const PinMap PinMap_SPI_MOSI[] =
{
  {PA_4, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_SPI2)}, 
  {PA_2,  SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_SPI1)},

  //{PA_10, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_SPI2)},

  {PA_12, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_SPI1)},
  {PB_5,  SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_SPI1)},
  {PB_7,  SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_SPI2)},
  {NC,    NP,    0}
};
#endif

 

 

STM32G0의 SPI 클럭 최대 주파수는 32Mhz이다. 최대 주파수 출력이 정상적으로 나오는지 확인해 보자.
 

 

SPI 클럭설정에서 에러가 발생한다.
 
d:\WORK\arduino\stm32g_ssm\st7789_txt_font\st7789_txt_font.ino:13:7: error: 'class SPIClass' has no member named 'SPISettings'; did you mean 'SPISettings SPIClass::spiSettings [4]'? (not accessible from this context)
   13 |   SPI.SPISettings(32000000, MSBFIRST, SPI_MODE0);
      |       ^~~~~~~~~~~
In file included from d:\WORK\arduino\stm32g_ssm\st7789_txt_font\st7789_txt_font.ino:1:
\AppData\Local\Arduino15\packages\STM32\hardware\stm32\1.9.0\libraries\SPI\src/SPI.h:233:19: note: declared private here
  233 |     SPISettings   spiSettings[NB_SPI_SETTINGS];
 
\AppData\Local\Arduino15\packages\STM32\hardware\stm32\1.9.0\libraries\SPI\src\SPI.cpp 에 spiSettings 함수가 없다
 
beginTransaction 함수를 사용하니 잘 동작한다.
#include <SPI.h> 
void setup(void)  
{ 
  Serial.begin(115200); 
  Serial.print("SPI Speed Test"); 
  pinMode(14, OUTPUT); 
  SPI.begin(); 
  //SPI.setFrequency(32000000); 
  //SPI.SPISettings(32000000, MSBFIRST, SPI_MODE0); 
  SPI.beginTransaction(SPISettings(32000000, MSBFIRST, SPI_MODE0)); 
}

void loop()  
{ 
  digitalWrite(14, HIGH);   // turn the LED on (HIGH is the voltage level) 
  SPI.transfer(0xF0); 
  digitalWrite(14, 0);   // turn the LED on (HIGH is the voltage level) 
}
 
 
SPI 클럭은 설정한 것과 같이 최대 32Mhz로 구동이 된다.

 

 

SPI 데이터 전송하는 시간은 5.6us로 측정이 된다.

반응형