新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于AVR單片機(jī)的SPI多機(jī)環(huán)路通信

基于AVR單片機(jī)的SPI多機(jī)環(huán)路通信

作者: 時(shí)間:2012-08-06 來源:網(wǎng)絡(luò) 收藏
點(diǎn)擊瀏覽下一頁
一主機(jī)三從機(jī)的通信程序如下:主機(jī)://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};//流水燈數(shù)組/*-----------------------------------------------------------------函數(shù)名稱: void masterInit(void) 函數(shù)功能: 初始化為主機(jī)參 數(shù): 返 回 值: 無SPI控制寄存器介紹SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0SPIE:中斷使能 SPE :SPI使能 DORD:數(shù)據(jù)次序 1為L(zhǎng)SB首先發(fā)送,0為MSB首先發(fā)送MSTR:主從選擇 1為主,0為從MSTR置位時(shí)選擇主機(jī)模式,否則為從機(jī).如果MSTR為"1",SS配置為輸入,且被拉低,則MSTR 被清零,寄存器SPSR 的SPIF 置位.用戶必須重新設(shè)置MSTR 進(jìn)入主機(jī)模式。CPOL: 時(shí)鐘極性見ATMEGA16L(中文)P130CPHA: 時(shí)鐘相位SPR1, SPR0: SPI 時(shí)鐘速率選擇1 與0 SPR1 和SPR0 對(duì)從機(jī)沒有影響。-----------------------------------------------------------------*/void SPImasterInit(void) //SPI初始化{DDRB|=(17)|(15)|(14); //設(shè)置SCK,MOSI為輸出,其他為輸入SPCR|=(1SPE)|(1MSTR)|(1SPR1)|(1SPR0);//使能SPI,主模式,F(xiàn)ck/128}/*-----------------------------------------------------------------函數(shù)名稱: void SPIMasterTransmit(uchar TranData) 函數(shù)功能: SPI數(shù)據(jù)傳輸參 數(shù): 返 回 值: 無-----------------------------------------------------------------*/void SPIMasterTransmit(unsigned char TranData) {SPDR=TranData; //數(shù)據(jù)放入SPI寄存器中while(!(SPSR(1SPIF))); //等待數(shù)據(jù)傳輸完畢}void delay(unsigned int ms){unsigned int i,j;for(i=0;ims;i++){for(j=0;j1141;j++);}}/*-----------------------------------------------------------------函數(shù)名稱: void Transmit(unsigned char i)函數(shù)功能: 封裝傳輸函數(shù)參 數(shù): 返 回 值: 無-----------------------------------------------------------------*/void Transmit(unsigned char i){Load_Low; //等待數(shù)據(jù)傳輸,主機(jī)向SPDR中寫入數(shù)據(jù)前要將SS拉低SPIMasterTransmit(i); //傳輸數(shù)據(jù)Load_High; //數(shù)據(jù)傳輸完畢,ss恢復(fù)高電平}void main(){ unsigned char i=0;DDRC=0XFF;SPImasterInit(); //SPI初始化while(1){i++;if(i>8){i=0;}Transmit(tab[i]);//發(fā)送數(shù)據(jù)PORTC=SPDR;//主機(jī)接收從機(jī)的數(shù)據(jù)產(chǎn)生動(dòng)作delay(100);}}從機(jī):#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,從機(jī)模式,F(xiàn)ck/128DDRB|=(1PB6);}char SPI_SlaveReceive(void){/*等待接收結(jié)束*/while(!(SPSR(1SPIF)));/*返回?cái)?shù)據(jù)*/return SPDR;}void main(){char a;spi_init();DDRC=0XFF;//DDRB=0X00;//PORTC=0XFF;while(1){ PORTC=SPI_SlaveReceive();//從機(jī)接收主機(jī)的數(shù)據(jù)做出動(dòng)作SPDR=PORTC;//從機(jī)向主機(jī)傳輸數(shù)據(jù)//delay(100);}}

單片機(jī)相關(guān)文章:單片機(jī)教程


單片機(jī)相關(guān)文章:單片機(jī)視頻教程


單片機(jī)相關(guān)文章:單片機(jī)工作原理


通信相關(guān)文章:通信原理




評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉