新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > AVR復習筆記--AVR單片機SPI多機通訊

        AVR復習筆記--AVR單片機SPI多機通訊

        作者: 時間:2016-11-19 來源:網(wǎng)絡 收藏
        最近決定復習下AVR單片機,其實也是為了借此復習下幾種簡單的通信協(xié)議,包括串口,SPI,I2­C等。

        本來以為一兩個晚上就能搞定的事兒,沒想到竟耗費了一周晚上空余的時間。

        本文引用地址:http://www.104case.com/article/201611/318417.htm

        當然主要是這次的要求要提高點,實現(xiàn)SPI的多機通信,

        不但要發(fā)數(shù)據(jù)還要回傳數(shù)據(jù)。

        實際中還是遇到了比我想象中要大的多的困難。

        即使是現(xiàn)在的實現(xiàn)方式也不是很理想。

        下面是spi部分的代碼,由于spi接收發(fā)送用的同一終端,感覺使用起來形式不怎么樣,還是采用了輪詢標志位的方式



        Code
        #include"spi.h"
        staticcharmode=1;
        voidspi_init(charflag)
        {
        chartmp=0;
        mode=flag;
        if(mode==1)
        {
        DDR_SPI=(1<SPCR=(1<}
        else
        {
        DDR_SPI=(1<SPCR=(1<}
        SPSR=0;
        tmp=SPSR;
        tmp=SPDR;
        }

        charspi_trans(chardata)
        {
        charret=0;
        if(mode==1)
        {
        SPDR=data;
        while(!(SPSR&(1<ret=SPDR;
        returnret;
        }
        else
        {



        while(!(SPSR&(1<ret=SPDR;
        SPDR=data;
        returnret;
        }
        }



        在我的例子中有一個主機,兩個從機

        進行如下通信

        發(fā)送至1號從機 1 ,2

        發(fā)送至2號從機 3 ,4

        發(fā)送至1號從機 5 ,6

        發(fā)送至2號從機 7 ,8

        從機1收到數(shù)據(jù)后回傳 1

        從機2收到數(shù)據(jù)后回傳 2

        下面還是看代碼



        Code
        #include"basic.h"http://自己寫的常用函式
        #include"usart.h"http://usart初始化函式
        #include"spi.h"
        intmain(void)
        {
        chartmp;
        usart_init(9600);
        spi_init(1);
        PORTB|=(1<<4)|(1<<1);
        DDRB|=(1<<4)|(1<<1);


        PORTB&=~(1<<4);
        tmp=spi_trans(0);
        usart_send();
        tmp=spi_trans(1);
        usart_send(tmp);
        tmp=spi_trans(2);
        usart_send(tmp);
        PORTB|=(1<<4)|(1<<1);

        delay_ms(5);//切換從機時,可能產(chǎn)生總線上的競爭,等待下
        //同時因為競爭等原因,下面的第一個數(shù)據(jù)可能不正確
        //至少我在調試時時有問題的所以發(fā)個0,算是同步下
        PORTB&=~(1<<1);
        tmp=spi_trans(0);
        usart_send();
        tmp=spi_trans(3);
        usart_send(tmp);
        tmp=spi_trans(4);
        usart_send(tmp);
        PORTB|=(1<<4)|(1<<1);

        delay_ms(5);

        PORTB&=~(1<<4);
        tmp=spi_trans(0);
        usart_send();
        tmp=spi_trans(5);
        usart_send(tmp);
        tmp=spi_trans(6);
        usart_send(tmp);
        PORTB|=(1<<4)|(1<<1);

        delay_ms(5);

        PORTB&=~(1<<1);
        tmp=spi_trans(0);
        usart_send();
        tmp=spi_trans(7);
        usart_send(tmp);
        tmp=spi_trans(8);
        usart_send(tmp);
        PORTB|=(1<<4)|(1<<1);

        return0;
        }



        從機程序如下,只列出用PB4的代碼,對應1號從機,接收數(shù)據(jù)正確回傳‘1’


        評論


        技術專區(qū)

        關閉
        主站蜘蛛池模板: 光泽县| 通榆县| 文安县| 陈巴尔虎旗| 南木林县| 鄱阳县| 柏乡县| 内江市| 文水县| 青铜峡市| 上犹县| 湛江市| 察哈| 吐鲁番市| 维西| 孝义市| 苗栗县| 大名县| 华阴市| 隆德县| 红原县| 横峰县| 明水县| 基隆市| 琼海市| 开平市| 静乐县| 白银市| 芦山县| 招远市| 南江县| 秦皇岛市| 麟游县| 南陵县| 萨嘎县| 延津县| 两当县| 乌兰浩特市| 叙永县| 巴塘县| 稻城县|