안녕하세요 초보회원입니다.

오늘은 양방향 직렬 통신으로 많이 쓰이는 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 통신이 가능합니다.


1.PNG

2.PNG

3.PNG

4.PNG




아래의 링크에 가시면 SPI 인터페이스에 대한 더욱 자세한 정보를 볼 수 있습니다.


https://www.diolan.com/dln_doc/spi-transfer-modes.html