新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > avr單片機SPI串行外設接口初始化配置及說明

        avr單片機SPI串行外設接口初始化配置及說明

        作者: 時間:2016-11-18 來源:網絡 收藏
        串行外設接口 SPI允許 ATmega16 和外設或其他 AVR 器件進行高速的同步數據傳輸。7 種可編程的比特率,主機或從機操作,全雙工, 3 線同步數據傳輸,可以從閑置模式喚醒 ,作為主機時具有倍速模式 (CK/2)

        /*
        PB7 SCK (SPI 總線的串行時鐘 )
        PB6 MISO (SPI 總線的主機輸入 / 從機輸出信號 )
        PB5 MOSI (SPI 總線的主機輸出 / 從機輸入信號 )
        PB4 SS (SPI 從機選擇引腳 )
        SCK – 端口 B, Bit 7 SCK :SPI 通道的主機時鐘輸出,從機時鐘輸入端口。工作于從機模式時,不論 DDB7 設
        置如何,這個引腳都將設置為輸入。工作于主機模式時,這個引腳的數據方向由 DDB7 控
        制。設置為輸入后,上拉電阻由 PORTB7 控制。
        MISO – 端口 B, Bit 6 MISO :SPI 通道的主機數據輸入,從機數據輸出端口。工作于主機模式時,不論 DDB6 設
        置如何,這個引腳都將設置為輸入。工作于從機模式時,這個引腳的數據方向由 DDB6 控
        制。設置為輸入后,上拉電阻由 PORTB6 控制。
        MOSI – 端口 B, Bit 5 MOSI : SPI 通道的主機數據輸出,從機數據輸入端口。工作于從機模式時,不論 DDB5 設
        置如何,這個引腳都將設置為輸入。當工作于主機模式時,這個引腳的數據方向由 DDB5
        控制。設置為輸入后,上拉電阻由 PORTB5 控制。
        SS – 端口 B, Bit 4 SS: 從機選擇輸入。工作于從機模式時,不論 DDB4設置如何,這個引腳都將設置為輸入。
        當此引腳為低時 SPI 被激活。工作于主機模式時,這個引腳的數據方向由 DDB4 控制。設
        置為輸入后,上拉電阻由 PORTB4 控制。
        簡單定義:
        引腳 方向SPI主機 方向SPI從機
        MOSI 用戶定義 輸入
        MISO 輸入 用戶定義
        SCK 用戶定義 輸入
        SS 用戶定義 輸入
        //*************************************SPI 控制寄存器SPCR***************************************
        SPI 控制寄存器SPCR

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

        bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
        SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0
        SPIE: 使能SPI 中斷
        置位后,只要SPSR 寄存器的SPIF 和SREG 寄存器的全局中斷使能位置位,就會引發
        SPI 中斷
        SPE: 使能SPI
        SPE 置位將使能SPI。進行任何SPI 操作之前必須置位SPE
        DORD: 數據次序
        DORD 置位時數據的LSB 首先發送;否則數據的MSB 首先發送
        MSTR: 主/ 從選擇
        MSTR置位時選擇主機模式,否則為從機。如果MSTR為"1”,SS配置為輸入,但被拉
        低,則MSTR 被清零,寄存器SPSR 的SPIF 置位。用戶必須重新設置MSTR 進入主機
        模式。
        CPOL: 時鐘極性
        CPOL 置位表示空閑時SCK 為高電平;否則空閑時SCK 為低電平。
        CPOL 功能
        CPOL 起始沿結束沿 CPOL
        0 上升沿下降沿 0
        1 下降沿上升沿 1

        SPR1, SPR0: SPI 時鐘速率選擇1 與0
        確定主機的SCK 速率。SPR1 和SPR0 對從機沒有影響。SCK 和振蕩器的時鐘頻率fosc
        關系如下表所示:
        SCK 和振蕩器頻率的關系
        SPI2X SPR1 SPR0 SCK
        0 0 0 fosc/4
        0 0 1 fosc/16
        0 1 0 fosc/64
        0 1 1 fosc/128
        1 0 0 fosc/2
        1 0 1 fosc/8
        1 1 0 fosc/32
        1 1 1 fosc/64
        CPHA :數據模式
        決定數據是在 SCK 的起始沿采樣還是在 SCK 的結束沿采樣
        相對于串行數據, SCK 的相位和極性有4 種組合。CPHA 和CPOL 控制組合的方式。SPI
        數據傳輸格式。每一位數據的移出和移入發生于SCK不同的信號跳變沿,以保證有足夠的時
        間使數據穩定。
        CPOL 與CPHA 功能
        模式 起始沿 結束沿 SPI
        CPOL 0 CPHA=0 采樣(上升沿) 采樣(下降沿) 0
        CPOL 0 CPHA=1 設置(上升沿) 采樣(下降沿) 1
        CPOL 1 CPHA=0 采樣(下降沿) 采樣(上升沿) 2
        CPOL 1 CPHA=1 采樣(下降沿) 采樣(上升沿) 3
        ///****************************SPI 狀態寄存器SPSR*********************************************
        SPI 狀態寄存器SPSR
        bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
        SPIF WCOL – – – – – SPI2X
        SPIF: SPI 中斷標志
        串行發送結束后,SPIF 置位。若此時寄存器SPCR 的SPIE 和全局中斷使能位置位
        SPI中斷即產生。如果SPI 為主機, SS 配置為輸入,且被拉低, SPIF 也將置位
        進入中斷服務程序后SPIF自動清零?;蛘呖梢酝ㄟ^先讀SPSR,緊接著訪問SPDR來對
        SPIF清零。
        WCOL: 寫碰撞標志
        在發送當中對SPI 數據寄存器SPDR寫數據將置位WCOL。WCOL可以通過先讀SPSR,緊接
        著訪問SPDR 來清零。
        Bit 5..1 – Res: 保留
        保留位,讀操作返回值為零。
        SPI2X: SPI 倍速
        置位后SPI 的速度加倍。若為主機,則SCK 頻率可達CPU 頻率的一半。若為從機,
        只能保證fosc /4。
        ATmega16的SPI接口同時還用來實現程序和EEPROM的下載和上載。

        //********************************SPI 數據寄存器SPDR**************************************
        SPI 數據寄存器SPDR
        bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
        MSB LSB
        SPI 數據寄存器為讀/寫寄存器,用來在寄存器文件和SPI移位寄存器之間傳輸數據。寫
        寄存器將啟動數據傳輸,讀寄存器將讀取寄存器的接收緩沖器。
        */
        #include
        #include

        #pragma interrupt_handler SPI_END: iv_SPI_STC
        void SPI_MasterInit(void)// 初始化為主機
        {
        DDRB = (1<SPCR = (1<}
        void SPI_MasterTransmit(char cData) //主機數據發送
        {
        SPDR = cData; // 啟動數據傳輸
        while(!(SPSR & (1<}
        void SPI_SlaveInit(void)// 將SPI初始化為從機
        {
        DDRB = (1<SPCR = (1<}
        char SPI_SlaveReceive(void)//從機數據接收
        {
        while(!(SPSR & (1<return SPDR;// 返回數據
        }

        void SPI_END()
        {

        //add your code here!

        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 柞水县| 济宁市| 博湖县| 鞍山市| 南澳县| 宁化县| 新巴尔虎左旗| 永济市| 南通市| 凌云县| 合作市| 焉耆| 高平市| 科技| 清水县| 日土县| 金堂县| 合江县| 新安县| 芜湖市| 股票| 盐源县| 民权县| 塔城市| 岑巩县| 正蓝旗| 雅安市| 泰宁县| 甘肃省| 阳原县| 洪湖市| 新乐市| 东至县| 凤冈县| 馆陶县| 七台河市| 桃江县| 曲麻莱县| 沈阳市| 农安县| 淮南市|