본문 바로가기
Embedded SW/Embedded SW Introduction

SPI를 설계할때 꼭 알아야할 핵심 사항 정리(TC275 MCU)

by 방구석 임베디드 2022. 9. 12.
반응형

지금 SPI 시리즈를 계속 글을 쓰고 있습니다.

먼저 이 글들을 보고 오시면 좋을 것 같습니다.

1) SPI 통신이란 무엇인가?

https://embeddedchallenge.tistory.com/58 

2) SPI 예제 코드를 포팅, 동작 확인 1편 (T275 인피니언 MCU)

https://embeddedchallenge.tistory.com/444

3) SPI 예제 코드를 포팅, 동작 확인 2편 (T275 인피니언 MCU)

https://embeddedchallenge.tistory.com/445

4) Digital-to-Analog Converter (Pmod DA4)를 SPI를 이용하여 동작 1편 (TC275 MCU)

https://embeddedchallenge.tistory.com/442

5) Digital-to-Analog Converter (Pmod DA4)를 SPI를 이용하여 동작 2편 (TC275 MCU)

https://embeddedchallenge.tistory.com/443

 

그러면 SPI를 설계할때 가장 중요한 사항이 무엇인지 한번 정리를 해보도록 하겠습니다.

이 부분은 MCU가 달라도, SPI모듈을 사용하기 때문에

동일하게 적용할 수 있는 부분입니다.

 

결론부터 말씀드리면

1) 최대 주파수 대역 확인

2) Polarity 및 Phase 확인

3) 한번 전송시 보내야할 비트수 확인

4) Delay 설정 확인

 

총이렇게 4가지에 대해서 SPI 설정 확인을 하셔야 합니다.

2) SPI 예제 코드를 포팅, 동작 확인 1편 (T275 인피니언 MCU)
https://embeddedchallenge.tistory.com/444
3) SPI 예제 코드를 포팅, 동작 확인 2편 (T275 인피니언 MCU)
https://embeddedchallenge.tistory.com/445

위의 글에서 MCU와 MCU끼리 SPI를 통해서 통신을 하는 것을 확인해 보았습니다.

위의 동작은 인피니언에서 제공하는 데모코드를 포팅해서 동작을 해본 것인데요.

 

MCU끼리 통신을 하다보니 

제가 알아서 약속해서 설계를 하는 경우가 많이 있습니다.

 

하지만 MCU와 IC끼리 통신을 할경우에는

IC Chip의 데이터시트를 꼼꼼히 읽고 Spec을 확인하고 설계를 해야 합니다.

이 내용은 아래 글에서 확인을 할 수 있습니다.

4) Digital-to-Analog Converter (Pmod DA4)를 SPI를 이용하여 동작 1편 (TC275 MCU)
https://embeddedchallenge.tistory.com/442
5) Digital-to-Analog Converter (Pmod DA4)를 SPI를 이용하여 동작 2편 (TC275 MCU)
https://embeddedchallenge.tistory.com/443

그러면 IC의 어떠한 부분을 꼼꼼히 읽어야 할까요?

결론부터 말씀드리면

아래 4가지 항목은 기본으로 확인을 하셔야 합니다.

 

1) 최대 주파수 대역 확인

2) Polarity 및 Phase 확인

3) 한번 전송시 보내야할 비트수 확인

4) Delay 설정 확인

 

그러면 지금부터 저 4가지 항목을 SPI코드에서

어떻게 변경을 해야하는지를 알아 보도록 하겠습니다.

 

1) 최대 주파수 대역 확인

우선 인피니언 MCU의 SPI 모듈은 자체적으로 최대 50Mbit/s 까지 가능합니다.

하지만 IC는 보통 10Mbit/s under입니다.

또 32비트까지 보낼수 있다고 되어 있네요!

이전에 우리가 찍었던 데이터를 보면

8비트씩 보내는 것을 확인하실 수 있는데

이것이 32비트까지 보낼수 있다고 생각하시면 됩니다.

초기화 코드는 아래와 같습니다.

        /* set the maximum baudrate */
        spiMasterConfig.base.maximumBaudrate = 10000000;
        /* set the baudrate for this channel */
        spiMasterChannelConfig.base.baudrate = 5000000;

우선, maximumBaudrate을 10MHz

그리고 BaudRate을 5MHz로 설정하고 있습니다.

실제로 중요한 파라미터는 5MHz입니다.

한번 이렇게 설계된 코드를 동작시킬때

5MHz가 어떠한 의미를 가지고 있는지 알아 보도록 하겠습니다.

하나의 비트를 보낼때 주기가 200ns인것을 확인할수 있습니다.

1/200ns는 주파수가 되고

주파수는 5MHz로 계산될 수 있습니다.

이것은 결국 하나의 비트를 전압으로 변화시켜 전달시킬때

그 전압유지시간과 관계가 있다는 것을 알 수 있습니다.

2) Polarity 및 Phase 확인

Clock polarity(CPOL)와 Clock phase(CPHA)라고 불리는

파라미터 설정 부분입니다.

초기화 초드에서 보면 아래와 같이 설계가 되어 있습니다.

config->mode.clockPolarity = SpiIf_ClockPolarity_idleLow;

config->mode.shiftClock = SpiIf_ShiftClock_shiftTransmitDataOnLeadingEdge;

이렇게 설정하면 결국 레지스터느는 아래와 같은 값이

들어가게 됩니다.

CPOL = 0;

CPHA = 1

 

이러한 경우, SCK는 아래 그림과 같이 Low로부터 시작됩니다.

그리고 Falling Edge일때 데이터를 취득이 되게 됩니다.

추후 IC와 통신을 할 경우에는 datasheet를 보고 IC에 맞추어서 CPOL과 CPHA를 설계하셔야 합니다.

지금은 MCU끼리 통신을 하는 것이니, 

설계자가 마음대로 설정을 하면 됩니다.

Master과 Slave끼리만 맞으면 되니까요!!

 

3) 한번전송할때 보내는 비트수

먼저 초기화 코드가 아래와 같이 설정이 되어 있다면

config->mode.dataWidth = 8;

한번에 날릴때 8비트를 날리게 됩니다. 

하지만 IC가 8비트가 아니라 32비트를 날리도록 약속이 되어 있다면

이 부분을 32비트로 날릴수 있도록 설정 변경을 해야 합니다.

인피니언 MCU는 아래와 같이 dataWidth라는 부분을 변경하여

32비트로 변경해 줄 수 있습니다.

uint32 dataWidth : 6; /**< \brief range 2 .. 32 bits (note 2 = 2-bits, 3 = 3-bits ... */

인피니언 MCU는 최대 32비트까지 설정 가능합니다.

4) Delay 설정

이것 역시 중요한 부분입니다.

Delay설정에 오류가 있으면아무리 SPI를 전달해도IC에게 제대로 값을 명령해줄수도값을 받아올 수도 없게 됩니다.

 

제가 예전에 아래와 같이 설정을 했다고 이야기한적이 있습니다.

spiMasterChannelConfig.base.mode.csLeadDelay = SpiIf_SlsoTiming_4;

spiMasterChannelConfig.base.mode.csTrailDelay = SpiIf_SlsoTiming_4;

 

여기서 csLeadDelay는 아래 그림에서 빨강색 동그라미를 친 부분과 일치 합니다.

이 부분도 우리가 레지스터 설정을 하여

정확하게 설정이 가능합니다.

물론 IC의 데이터시티를 꼼꼼히 읽어보고 설계를 수행해야 합니다.

그러면 지금부터 저부분을 어떻게 설계하는지 한번 알아 보도록 하겠습니다.

레퍼런스 메뉴얼을 보면 계산하는 식이 있습니다.

이제 수식은 알았으니!

우리는 저 clock이 얼마를 가지고 있는지 알아야 합니다.

이 클럭을 알려면

클럭설정 모듈을 살펴 보아야 합니다.

위의 레지스터가 1이라고 적혀있으니

200MHz입니다.

참고로 fsource는 200MHz를 사용하고 있습니다.

그러면 이제 SPI 레지스터를 한번 확인해 보도록 하겠습니다.

LPRE : 16

LEAD : 4

200MHz는 5ns의 주기를 가지고 있습니다.

다시 위의 수식을 보면 아래와 같이 계산이 될 수 있습니다.

5ns x 16 x 4 = 320ns

 

즉 지금 제가 설정한 것은

320ns의 딜레이를 주기위한 설정입니다.

그런데 실제로 Logic Analyzer를 이용하여 계측을 수행해 보니

380ns라는 오차가 있는것을 확인 할 수 있습니다.

이 부분의 오차는 Logic Analzer에서 디지털값으로 인식하는 부분에서

오차가 있기 때문에 발생하는 것입니다~

 

이렇게 4가지 설정에 대해서 IC 레퍼런스 메뉴어을 읽고

MCU SPI 모듈 설계시 맞추어서 설계를 해주셔야 합니다.

 

이상으로 금일 포스팅을 마치도록 하겠습니다.

반응형

댓글