基于AVR單片機的SPI多機環(huán)路通信
一主機三從機的SPI通信程序如下:主機://ICC-AVR application builder : 2012-1-13 18:56:57// Target : M16// Crystal: 8.0000Mhz// 完整程序下載: http://www.51hei.com/f/djhltl.rar #include iom16v.h>#include macros.h>#define Load_High PORTB|=(14)#define Load_Low PORTB=~(14)unsigned char tab[]={0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//流水燈數組/*-----------------------------------------------------------------函數名稱: void SPImasterInit(void) 函數功能: SPI初始化為主機參 數: 返 回 值: 無SPI控制寄存器介紹SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0SPIE:中斷使能 SPE :SPI使能 DORD:數據次序 1為LSB首先發(fā)送,0為MSB首先發(fā)送MSTR:主從選擇 1為主,0為從MSTR置位時選擇主機模式,否則為從機.如果MSTR為"1",SS配置為輸入,且被拉低,則MSTR 被清零,寄存器SPSR 的SPIF 置位.用戶必須重新設置MSTR 進入主機模式。CPOL: 時鐘極性見ATMEGA16L(中文)P130CPHA: 時鐘相位SPR1, SPR0: SPI 時鐘速率選擇1 與0 SPR1 和SPR0 對從機沒有影響。-----------------------------------------------------------------*/void SPImasterInit(void) //SPI初始化{DDRB|=(17)|(15)|(14); //設置SCK,MOSI為輸出,其他為輸入SPCR|=(1SPE)|(1MSTR)|(1SPR1)|(1SPR0);//使能SPI,主模式,Fck/128}/*-----------------------------------------------------------------函數名稱: void SPIMasterTransmit(uchar TranData) 函數功能: SPI數據傳輸參 數: 返 回 值: 無-----------------------------------------------------------------*/void SPIMasterTransmit(unsigned char TranData) {SPDR=TranData; //數據放入SPI寄存器中while(!(SPSR(1SPIF))); //等待數據傳輸完畢}void delay(unsigned int ms){unsigned int i,j;for(i=0;ims;i++){for(j=0;j1141;j++);}}/*-----------------------------------------------------------------函數名稱: void Transmit(unsigned char i)函數功能: 封裝傳輸函數參 數: 返 回 值: 無-----------------------------------------------------------------*/void Transmit(unsigned char i){Load_Low; //等待數據傳輸,主機向SPDR中寫入數據前要將SS拉低SPIMasterTransmit(i); //傳輸數據Load_High; //數據傳輸完畢,ss恢復高電平}void main(){ unsigned char i=0;DDRC=0XFF;SPImasterInit(); //SPI初始化while(1){i++;if(i>8){i=0;}Transmit(tab[i]);//發(fā)送數據PORTC=SPDR;//主機接收從機的數據產生動作delay(100);}}從機:#includeiom16v.h>#includemacros.h>//#includedelay.h>#define uchar unsigned char#define uint unsigned intvoid delay(uint ms){uint i,j;for(i=0;ims;i++){for(j=0;j1141;j++);}}void spi_init(void){SPCR|=(1SPE)|(0MSTR)|(1SPR1)|(1SPR0);//使能SPI,從機模式,Fck/128DDRB|=(1PB6);}char SPI_SlaveReceive(void){/*等待接收結束*/while(!(SPSR(1SPIF)));/*返回數據*/return SPDR;}void main(){char a;spi_init();DDRC=0XFF;//DDRB=0X00;//PORTC=0XFF;while(1){ PORTC=SPI_SlaveReceive();//從機接收主機的數據做出動作SPDR=PORTC;//從機向主機傳輸數據//delay(100);}}
單片機相關文章:單片機教程
單片機相關文章:單片機視頻教程
單片機相關文章:單片機工作原理
通信相關文章:通信原理
評論