강좌 & 팁
안녕하세요 초보회원입니다.
오늘은 양방향 직렬 통신으로 많이 쓰이는 SPI(Serial Peripheral Interface)의 전송모드 세팅에 대해 알아봅니다.
STM32로 외부 모듈과 통신을 시도하던 중에 CPOL과 CPHA 플래그를 이용해서 다양한 전송 모드를 구현할 수 있다는 것을 알았습니다.
보통 ST예제에서는 하나의 칩에 있는 SPI1이나 SPI2를 이용해서 아래와 같은 세팅으로 하기 때문에 전송모드가
일치되어 있어서 쉽게 통신이 가능합니다.
/* SPI1 configuration ------------------------------------------------------*/
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;//SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
/* SPI2 configuration ------------------------------------------------------*/
SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
SPI_Init(SPI2, &SPI_InitStructure);
SPI_SSOutputCmd(SPI1, ENABLE);
하지만 외부 모듈과 통신하기 위해서는 외부 모듈의 데이터 시트에서 요구되는 전송모드로 세팅을 해야 통신이 됩니다.
ST 예제를 그대로 긁어왔다면 잘 안되는 경우가 많을 겁니다. 저도 이것 때문에 고생 좀 했습니다.^^;;
이러한 경우는 위의 SPI_InitStructure의 SPI_CPOL과 SPI_CPHA 값을 변경해서 전송모드를 변경하면 됩니다.
CPOL은 마스터 클럭의 Polarity를 결정하는데 반전과 비반전으로 설정할 수 있습니다.
CPHA는 데이터 샘플링을 마스터 클럭의 Rising 또는 Falling edge에서 할 것인지를 설정할 수 있습니다.
이렇게 하면 아래와 같이 총 4가지의 전송모드로 세팅 가능합니다. 통신하려고 하는 IC나 모듈의 데이터 시트의
SPI 타이밍 차트를 보고 이러한 전송 모드를 구현해서 SPI 통신이 가능합니다.
아래의 링크에 가시면 SPI 인터페이스에 대한 더욱 자세한 정보를 볼 수 있습니다.
https://www.diolan.com/dln_doc/spi-transfer-modes.html