SPI 통신과 DMA 관련 내용정리

 

SPI : Serial Peripheral Interface 로 통신 종류 중 하나이다. 일반적으로 동기식 직렬 통신 방식이고 데이터 출력 입력 신호선이 따로 있어 동시에 송수신이 가능하고 1:N 통신이 가능하다.

 

DMA : Direct Memory Access 로 CPU가 처리해야할 메모리 관련 제어를 DMA 모듈을 통해 메모리에 직접 접근할 수 있게 해주는 기능이다. 일반적으로 통신류의 처리는 CPU가 처리하기에는 너무 많은 양의 데이터 이동으로 점유율이 높아지는데 DMA를 사용하게 되면 CPU는 response 를 보내두고 다른 처리를 진행하면 되기 때문에 효율적으로 MCU를 다루는데 용이하다.

 

 

SPI는 일반적으로 다음과 같이 구성되어있다.

 - 총 4개의 핀으로 구성 (SIMO(Slave In Master Out), SOMI(Slave Out Master In), STE(Slave Transmit Enable, 일반적으로 CS(Chip Select) 로도 부름), CLK)

 - 마스터가 STE 핀을 LOW로 설정하여 active 한다. (Low Active)

 - 마스터와 슬레이브 모두 SPITXBUF를 통해 데이터를 SPIDAT으로 전송하면 동기화 CLK에 맞춰

  (1) 마스터를 기준으로 MSB를 우선으로 SIMO 핀을 통해 데이터를 출력한다. 이때, 슬레이브는 동시에 LSB를 우선으로 데이터를 수신한다.

  (2) 슬레이브를 기준으로 MSB를 우선으로 SOMI 핀을 통해 데이터를 출력한다. 이때, 마스터는 동시에 LSB를 우선으로 데이터를 수신한다.

 - (1), (2) 절차는 동시에 이뤄진다. 이러한 데이터 이동 과정을 data shifted 라고 표현한다.

 

SPI FIFO

 - 여기서 FIFO(First In First Out) 은 선입선출 이라고 불리며, 일반적으로 데이터 통신에서 스케줄링 기법 중 하나이다. 먼저 입력된 것 부터 차례대로 출력하는 방식이라고 생각하면 된다.

 - SPI FIFO는 TX/RX 둘 다 존재하며 각각 16개의 FIFO를 가지고 있다.

 

SPI with DMA

 - SPI를 DMA를 통해 사용하려면 FIFO 모드로 사용해야한다.

 - 아래 그림을 참고한다.

 - RX FIFO : SPIDAT에 들어온 데이터는 SPIRXBUF로 이동하고, SPIRXBUF에 있는 데이터는 RX FIFO에 순차적(0부터 15 순으로)으로 쌓이게된다. 이때 RX FIFO에 쌓인 데이터의 개수를 RXFFST로 확인할 수 있다. 유저가 설정할 수 있는 RXFFIL보다 RXFFST가 크면 SPI RX FIFO Interrupt가 발생하는데, DMA 모드일 때 SPIRXDMA도 동작하게 된다. DMA 설명은 말하자면 너무 길어서 아래에서 다루도록 하고, 쉽게 설명하자면 RX FIFO에 쌓인 데이터를 유저가 지정해둔 RAM 영역(일반적으로 Global Shared RAM)으로 옮기는 행위를 말한다. 즉, DMA 모듈이 RXFIFO에 데이터가 어느정도 쌓이면 RAM 영역으로 알아서 데이터를 옮기는 방식을 나타낸다.

 

 - TX FIFO : RX FIFO와는 반대로 생각하면 편하다. 유저가 설정할 수 있는 TXFFIL 보다 TXFFST(TX FIFO에 쌓인 데이터의 개수)가 작으면 SPI TX FIFO Interrupt가 발생한다. 이때 DMA 모드가 켜져있다면 RAM에 저장되어있는 데이터를 TX FIFO로 옮겨준다. SPI 특징상 TX FIFO에 데이터가 쌓이면 그 데이터는 SPITXBUF로 옮겨지고, SPITXBUF데이터는 SPIDAT으로 옮겨진다. 이후 SPIDAT는 SPI 통신방식에 의해 외부로 전송된다.

 

 

 

DMA

 - DMA를 사용할 때 크게 필요한 지식은 다음과 같다.

  (1) DMA Trigger : 유저가 직접 trigger를 발생시킬수도 있으나 SPI의 경우 위에서 설명했던 것 처럼 FIFO interrupt 가 발생했을 때 DMA Trigger가 발생한다. Trigger가 발생하게 되면 DMA 에서 사용하는 용어인 burst, transfer 라는 행위를 진행한다.

  (2) word : MCU마다 word size 가 정해져있는데 TI F28003x 의 경우 16bits로 설정되어있다. 일반적으로 16bits 나 32bits를 사용한다.

  (3) burst : 여러개의 word로 구성되어있다.

  (4) transfer : 여러개의 burst로 구성되어있다.

  (5) source/destination(SRC/DST) address : 데이터를 불러오거나 저장할 주소

  (6) source/destination(SRC/DST) step : 데이터를 불러오거나 저장할 주소의 step

 

 - DMA 동작 방식

  (1) 데이터를 옮길 주소에 대한 설정을 진행한다. 즉, SRC/DST address를 지정하는 것인데, 맨 처음 DMA transfer가 시작할 때 SRC address에 있는 데이터가 DST address 로 옮겨진다. 이후 설정해둔 step 만큼 주소가 이동한다.

 

  (2) 데이터를 옮길 단위를 설정한다. DMA는 burst loop(inner loop)와 transfer loop(outer loop) 로 이루어져 있다. 첫 transfer가 수행되면 transfer size 만큼 burst가 일어나야 transfer가 종료되는데, burst의 경우 그냥 발생하는 것이 아니라 DMA trigger가 발생했을 때 한번 발생한다. 즉, 여기서 Burst, transfer의 사이즈로 설정해야한다.

 

  (3) 데이터를 어떻게(어떤방식) 으로 옮길지 설정한다. 이 말은 step 설정을 통해서 주소를 어떻게 가져갈것인가 에 대한 설정을 진행한다.

 

글로 봤을 때 무슨 의미인지 모를 수 있으니 아래 그림을 통해 이해해보도록 하자 (글씨체.. 는 궁금한 내용 있으시면 댓글 주세요 하하)

 

결국 SPI 에서 DMA를 사용한다면, DMA 특정 채널에서 SPI TX FIFO는 DST_ADDR가 될 것이고, 다른 DMA 채널에서는 SPI RX FIFO 가 SRC_ADDR로 설정 될 것이다. 

 

https://eteo.tistory.com/m/336
해당 링크에서도 많은 공부를 진행했었으니 참고.

 

TMS320F28388D ] DMA 파악하기

DMA CPU의 관여 없이 하드웨어적으로 메모리간 또는 메모리와 페리페럴간 데이터를 이동시킬 수 있는 컨트롤러이다. DMA의 특징 DMA 모듈이 데이터 이동을 시작하기 위해서는 페리퍼럴 또는 소프트

eteo.tistory.com

+ Recent posts