新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于AVR單片機的SPI多機環路通信

        基于AVR單片機的SPI多機環路通信

        作者: 時間:2012-08-06 來源:網絡 收藏
        點擊瀏覽下一頁
        一主機三從機的通信程序如下:主機://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 masterInit(void) 函數功能: 初始化為主機參 數: 返 回 值: 無SPI控制寄存器介紹SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0SPIE:中斷使能 SPE :SPI使能 DORD:數據次序 1為LSB首先發送,0為MSB首先發送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]);//發送數據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);}}

        單片機相關文章:單片機教程


        單片機相關文章:單片機視頻教程


        單片機相關文章:單片機工作原理


        通信相關文章:通信原理




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 中西区| 东乌珠穆沁旗| 陆良县| 武清区| 刚察县| 满城县| 鄂托克前旗| 宜章县| 常宁市| 平乡县| 定陶县| 哈尔滨市| 济南市| 尉犁县| 连江县| 灵川县| 丰台区| 昌图县| 宜昌市| 云南省| 德化县| 瑞金市| 阳朔县| 屏山县| 绿春县| 洛扎县| 曲水县| 惠州市| 华坪县| 长寿区| 东安县| 辽源市| 鄂尔多斯市| 康平县| 潮州市| 芜湖市| 故城县| 奉节县| 南开区| 方城县| 石家庄市|