[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로 측정이 된다.
반응형