Atmel Studio入門:SPI

Atmel Studioで、AVRマイコンのSPI通信プログラムを作成する方法について説明したいと思います。

SPI Masterのサンプル・コード

SPI Masterの簡単なサンプル・コードで基本的な制御方法を見ていく事にします。

//SPI Master Sample Code
//Target Device: ATmega328p
//Author: easy labo
//Created: 2014.11.02

#include <avr/io.h>

void InitSpiMaster(void)
{
   //Set MOSI(PB3) and SCK(PB5) output, all others input in Port B
   DDRB = (1<<DDB3)|(1<<DDB5);
   //Enable SPI, Master, set clock rate fck/16
   SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
   //Double SPI Speed
   //SPSR |= _BV(SPI2X);
}

void TransSpiMaster(char tData){
   //Start transmission
   SPDR = tData;
   // Wait for transmission complete
   while(!(SPSR & (1<<SPIF)));
}

char RecieveSpiMaster(void)
{
   char rData;
   //Output Clolk without data
   SPDR = 0;
   // Wait for transmission complete
   while(!(SPSR & (1<<SPIF)));
   //Recieve 1 byte data
   rData = SPDR;
   return rData;
}

char TransceiverSpiMaster(char tData)
{
   char rData;
   //Start transmission
   SPDR = tData;
   // Wait for transmission complete
   while(!(SPSR & (1<<SPIF)));
   //Recieve 1 byte data
   rData = SPDR;
   return rData;
}

9行-17行
SPIに使用するMOSIとSCKのポートを出力にします。この例ではDDRBを設定して、PB3とPB5を出力にします。次に、SPCRレジスタで、SPIを有効、SPIマスター、周波数をFosc/16に設定します。なおSPSRの_SPI2Xを”1″に設定すれば、周波数を2倍に設定できます。

19行-24行
SPDRにデータを入力すると、MOSIからデータを送る事ができます。SPSRのSPIFが”1″になると送信完了です。

26行-36行
この例では、SPDRにダミーの”0″を入力してSCKを発生させます。SPSRのSPIFのビットが”1″になると送信完了で、この部分は19行から24行のデータ送信の例と同じです。SPDRは入出力のレジスタで送信完了後は、受信したデータが格納されているので、これをデータとして戻します。

38行-48行
送信と受信の例を組み合せて、送受信の構成にしています。

まとめ

SPI通信の制御は、初期設定さえしてしまえば、SPDRのデータの出し入れだけなので非常に簡単です。

→その他のAtmelマイコン関連情報

Sponsored Link