久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10102|回復: 3
收起左側

SPI協議工作過程詳解文檔,內含實例代碼

[復制鏈接]
ID:92536 發表于 2018-7-7 10:12 | 顯示全部樓層 |閱讀模式
SPI一種3線(有的沒有SS線(選擇主或從機模式))或4線的通信方式:
           MOSI:主機出從機進數據線
                 MISO:主機進從機從數據線
                 SCK: 時鐘線
                 SS:  主從模式選擇線
工作過程的理解:設置好相應的配置后就可以發送或接收數據,當放送或接收完成后就會是SPIF置位,此時如果開了中斷就會就入中斷服務程序。如果沒開中斷就可以通過查詢該標志位來做相應的事。進入中段服務程序后,或者讀(寫)SPDR寄存器都可以清零SPIF標志位。從而可以開始下一次的傳輸
相應的寄存器
1SCPR:控制寄存器:SPI的大部分設置
2SPSR:標志寄存器:(查看一些標志(主要是SPIF位)和設置SPI速度)
3SPDR:數據寄存器:
SS引腳的說明:(實質就是當配置為輸入時:是主機還是從機由輸入的電平來決定)
從機模式: SPI 配置為從機時,從機選擇引腳 SS 總是為輸入。SS 為低將激活 SPI 接口, MISO
成為輸出 ( 用戶必須進行相應的端口配置 ) 引腳,其他引腳成為輸入引腳。當 SS 為高時
所有的引腳成為輸入, SPI 邏輯復位,不再接收數據。
SS引腳對于數據包/字節的同步非常有用,可以使從機的位計數器與主機的時鐘發生器同
步。當SS 拉高時SPI從機立即復位接收和發送邏輯,并丟棄移位寄存器里不完整的數據。

主機模式: SPI 配置為主機時 (SPCR MSTR置位 ),用戶可以決定 SS 引腳的方向。
SS 配置為輸出,則此引腳可以用作普通的 I/O 口而不影響 SPI 系統。典型應用是用來
驅動從機的 SS 引腳。
如果 SS 配置為輸入,必須保持為高以保證 SPI 的正常工作。若系統配置為主機,SS
輸入,但被外設拉低,則 SPI 系統會將此低電平解釋為有一個外部主機將自己選擇為從
機。為了防止總線沖突, SPI 系統將實現如下動作:
1. 清零 SPCR MSTR 位,使 SPI 成為從機,從而 MOSI SCK變為輸入。
2. SPSR SPIF 置位。若 SPI 中斷和全局中斷開放,則中斷服務程序將得到執行。
因此,使用中斷方式處理 SPI 主機的數據傳輸,并且存在 SS 被拉低的可能性時,中斷服
務程序應該檢查 MSTR 是否為 "1”。若被清零,用戶必須將其置位,以重新使能 SPI 主機
模式。
管腳配置
一:SCPR:控制寄存器:(SPI的大部分設置都在該寄存器)
SPSR:標志寄存器:(查看一些標志和設置SPI速度,主要是用到SPIF這個標志位,接收完成和發送完成都會置位這個標志,進入中斷服務程序或訪問SPDR寄存  器都可以清零這個標志
SPDR:數據寄存器:


應用步驟:
1先根據是主還是從設置端口的模式(輸入還是輸出)
主機:SS   MOSI   SCK 為出 MISO為入
從機:SS   MOSI   SCK 為入 MISO 為出
2配置相應的寄存器(就三個寄存器,注意用到中斷時要先開總中斷)
3用中斷或查詢法發送或接收數據
注意:主機或者從機都可以發送或接收。發送完之后就可以馬上發下一個數據了。接收也是只要接收完了也可以馬上接收下一個數據了
發送:(一般用查詢方式發送比較好:此時只要查詢發送完畢的標SPIF是否置位
常用:while(!(SPSR & (1<<SPIF))); //等待發送完畢或接收完畢
查詢法:實質就是查詢SPSRSPIF位是否置位,接收完和發送完都可以置位,(如果開了中斷的話就會進入相應的中斷)
例子:
  • 主機發送查詢方式)(只要發送完畢了就可以繼續發送了)
//主機模式下發送1-255
  1. #include <avr/io.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. void spi_init(void)
  5. {
  6.     PORTB |= (1<<PB4) | (1<<PB5) | (1<<PB6) | (1<<PB7); //
  7.     DDRB |= (1<<DDB5) | (1<<DDB7) | (1<<DDB4);     //Set MOSI, SCK AND SS as outputs
  8.     SPCR = 0x73; //SPI使能,低位首發,主機模式,時鐘模式00,上升沿采樣;時鐘速率Fosc/128
  9.     SPSR = 0x00; //SPI2x=0
  10. }
  11. void SPI_send_data(char cData)
  12. {
  13.               PORTB &=~ (1<<PB4); //強制接收方進入從模式(在接收方的NSS引腳沒有接地時)
  14. //              SPCR |= (1<<MSTR); // MSTR有時會被清零,這里強制進入主機模式
  15.               SPDR =cData;
  16.               while(!(SPSR & (1<<SPIF))); //等待發送完畢
  17. //              PORTB |= (1<<PB4); //相當于釋放總線(這樣可以讓別的主機控制從機)

  18. }

  19. void Delay(uint z) //
  20. {
  21.    unsigned int i,j;
  22.    for(i=z;i>0;i--)
  23.     for(j=2000;j>0;j--);

  24. }

  25. int main(void)
  26. {
  27.               unsigned int i=0;
  28.               spi_init();
  29.               while(1)
  30.               {
  31.                             for(i=255;i>0;i--)
  32.                             {
  33.                                 SPI_send_data(i);
  34.                                           Delay(100);
  35.                             }
  36.               }
  37. }
復制代碼

2從機接收(查詢方式)

  1. #include <avr/io.h>
  2. #include <avr/delay.h>
  3. #define uchar              unsigned char
  4. #define uint              unsigned int
  5. void port_init(void)
  6. {
  7.               PORTA = 0x00;
  8.               DDRA  = 0xFF;
  9.               PORTB = 0xFF;
  10. }

  11. void spi_init(void)
  12. {
  13.     DDRB = (1<<5) |(1<<7);
  14.               DDRB&=~(1<<4)|(1<<6);
  15.               SPCR = 0x63; //                            SPI允許。從機方式
  16.               SPSR = 0x00; //                            SPI倍速.頻率為系統時鐘
  17. }

  18. void init_devices(void)
  19. {
  20.               port_init();
  21.               spi_init();
  22. }
  23. //主函數
  24. int main(void)
  25. {
  26.               init_devices();
  27.      while(1)
  28.               {            
  29.                             while(!(SPSR & (1<<SPIF)));//等待數據接收完成
  30.                             PORTA=SPDR;//把接收到的數據賦給A口
  31.                             _delay_loop_2(900);
  32.             
  33.               }
  34. }
復制代碼

3從機中斷方式接收數據(注意:當進入中斷服務程序后SPIF會自動清零)
  1. /*中斷方式接收數據*/
  2. #include <avr/io.h>
  3. #include <avr/interrupt.h>
  4. #define uchar              unsigned char
  5. #define uint              unsigned int

  6. //端口初始化
  7. void port_init(void)
  8. {
  9.               PORTA = 0xFF;
  10.               DDRA  = 0xFF;
  11. }

  12. void spi_init(void)
  13. {
  14.               PORTB |= (1<<4) | (1<<5) | (1<<6) | (1<<7); //
  15.     DDRB |= (1<<5) | (1<<7) | (1<<4);     //Set MOSI, SCK AND SS as outputs
  16.     SPCR = 0xE3; //SPI中斷使能,SPI使能,低位首發,從機模式,時鐘模式00,上升沿采樣;時鐘速率Fosc/128
  17.     SPSR = 0x00; //SPI2x=0
  18. }

  19. void init_devices(void)
  20. {
  21.               port_init();
  22.               spi_init();
  23.               sei();//開全局中斷
  24. }

  25. //主函;
  26. int main(void)
  27. {
  28.     init_devices();
  29.               while(1);
  30. }
  31. //SPI中斷函數
  32. SIGNAL(SIG_SPI)
  33. {

  34.   PORTA=SPDR;

  35. }
復制代碼

完整的Word格式文檔51黑下載地址:
SPI.doc (663.5 KB, 下載次數: 42)


回復

使用道具 舉報

ID:25103 發表于 2018-9-16 22:32 | 顯示全部樓層
感謝分享!! 共同學習共同進步
回復

使用道具 舉報

ID:264733 發表于 2019-11-2 10:43 | 顯示全部樓層
謝謝分享
回復

使用道具 舉報

ID:611955 發表于 2019-11-15 07:13 | 顯示全部樓層
感謝分享
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 激情麻豆视频 | 亚洲 成人 av | 久久久久久国产精品mv | 日本精品一区二区三区在线观看 | 国产精品a久久久久 | 久久久精品国产 | 久久久久9999亚洲精品 | 国产欧美一区二区三区在线看蜜臀 | 亚洲成人av| 99伊人网| 亚洲黄色一区二区三区 | 欧美精品久久久久久久久老牛影院 | 日韩av啪啪网站大全免费观看 | 81精品国产乱码久久久久久 | 一区二区三区精品视频 | 天堂av在线影院 | 黄色一级片在线播放 | av高清毛片 | 91在线观看免费视频 | 成人高清视频在线观看 | 成人免费一级视频 | 国产精品免费一区二区三区 | 天堂在线中文字幕 | 欧美久久一区 | 久久久蜜臀国产一区二区 | av黄色在线| 免费精品久久久久久中文字幕 | 成人欧美一区二区三区在线播放 | 黄色av大片| 国家aaa的一级看片 h片在线看 | 国产精品久久久久久久久免费相片 | 精品免费看 | 中文字幕一区在线 | 欧美日韩综合视频 | 国产精品一区二区三区免费观看 | 免费骚视频 | 久久久久久亚洲欧洲 | 精品少妇一区二区三区在线播放 | 男女网站视频 | 日韩视频精品 | 欧美日韩在线综合 |