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のデータの出し入れだけなので非常に簡単です。
Sponsored Link