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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 9936|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

SPI協(xié)議工作過(guò)程詳解文檔,內(nèi)含實(shí)例代碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:92536 發(fā)表于 2018-7-7 10:12 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
SPI一種3線(xiàn)(有的沒(méi)有SS線(xiàn)(選擇主或從機(jī)模式))或4線(xiàn)的通信方式:
           MOSI:主機(jī)出從機(jī)進(jìn)數(shù)據(jù)線(xiàn)
                 MISO:主機(jī)進(jìn)從機(jī)從數(shù)據(jù)線(xiàn)
                 SCK: 時(shí)鐘線(xiàn)
                 SS:  主從模式選擇線(xiàn)
工作過(guò)程的理解:設(shè)置好相應(yīng)的配置后就可以發(fā)送或接收數(shù)據(jù),當(dāng)放送或接收完成后就會(huì)是SPIF置位,此時(shí)如果開(kāi)了中斷就會(huì)就入中斷服務(wù)程序。如果沒(méi)開(kāi)中斷就可以通過(guò)查詢(xún)?cè)摌?biāo)志位來(lái)做相應(yīng)的事。進(jìn)入中段服務(wù)程序后,或者讀(寫(xiě))SPDR寄存器都可以清零SPIF標(biāo)志位。從而可以開(kāi)始下一次的傳輸
相應(yīng)的寄存器
1SCPR:控制寄存器:SPI的大部分設(shè)置
2SPSR:標(biāo)志寄存器:(查看一些標(biāo)志(主要是SPIF位)和設(shè)置SPI速度)
3SPDR:數(shù)據(jù)寄存器:
SS引腳的說(shuō)明:(實(shí)質(zhì)就是當(dāng)配置為輸入時(shí):是主機(jī)還是從機(jī)由輸入的電平來(lái)決定)
從機(jī)模式: 當(dāng) SPI 配置為從機(jī)時(shí),從機(jī)選擇引腳 SS 總是為輸入。SS 為低將激活 SPI 接口, MISO
成為輸出 ( 用戶(hù)必須進(jìn)行相應(yīng)的端口配置 ) 引腳,其他引腳成為輸入引腳。當(dāng) SS 為高時(shí)
所有的引腳成為輸入, SPI 邏輯復(fù)位,不再接收數(shù)據(jù)。
SS引腳對(duì)于數(shù)據(jù)包/字節(jié)的同步非常有用,可以使從機(jī)的位計(jì)數(shù)器與主機(jī)的時(shí)鐘發(fā)生器同
步。當(dāng)SS 拉高時(shí)SPI從機(jī)立即復(fù)位接收和發(fā)送邏輯,并丟棄移位寄存器里不完整的數(shù)據(jù)。

主機(jī)模式:當(dāng) SPI 配置為主機(jī)時(shí) (SPCR MSTR置位 ),用戶(hù)可以決定 SS 引腳的方向。
SS 配置為輸出,則此引腳可以用作普通的 I/O 口而不影響 SPI 系統(tǒng)。典型應(yīng)用是用來(lái)
驅(qū)動(dòng)從機(jī)的 SS 引腳。
如果 SS 配置為輸入,必須保持為高以保證 SPI 的正常工作。若系統(tǒng)配置為主機(jī),SS
輸入,但被外設(shè)拉低,則 SPI 系統(tǒng)會(huì)將此低電平解釋為有一個(gè)外部主機(jī)將自己選擇為從
機(jī)。為了防止總線(xiàn)沖突, SPI 系統(tǒng)將實(shí)現(xiàn)如下動(dòng)作:
1. 清零 SPCR MSTR 位,使 SPI 成為從機(jī),從而 MOSI SCK變?yōu)檩斎搿?/font>
2. SPSR SPIF 置位。若 SPI 中斷和全局中斷開(kāi)放,則中斷服務(wù)程序?qū)⒌玫綀?zhí)行。
因此,使用中斷方式處理 SPI 主機(jī)的數(shù)據(jù)傳輸,并且存在 SS 被拉低的可能性時(shí),中斷服
務(wù)程序應(yīng)該檢查 MSTR 是否為 "1”。若被清零,用戶(hù)必須將其置位,以重新使能 SPI 主機(jī)
模式。
管腳配置
一:SCPR:控制寄存器:(SPI的大部分設(shè)置都在該寄存器)
SPSR:標(biāo)志寄存器:(查看一些標(biāo)志和設(shè)置SPI速度,主要是用到SPIF這個(gè)標(biāo)志位,接收完成和發(fā)送完成都會(huì)置位這個(gè)標(biāo)志,進(jìn)入中斷服務(wù)程序或訪(fǎng)問(wèn)SPDR寄存  器都可以清零這個(gè)標(biāo)志
SPDR:數(shù)據(jù)寄存器:


應(yīng)用步驟:
1先根據(jù)是主還是從設(shè)置端口的模式(輸入還是輸出)
主機(jī):SS   MOSI   SCK 為出 MISO為入
從機(jī):SS   MOSI   SCK 為入 MISO 為出
2配置相應(yīng)的寄存器(就三個(gè)寄存器,注意用到中斷時(shí)要先開(kāi)總中斷)
3用中斷或查詢(xún)法發(fā)送或接收數(shù)據(jù)
注意:主機(jī)或者從機(jī)都可以發(fā)送或接收。發(fā)送完之后就可以馬上發(fā)下一個(gè)數(shù)據(jù)了。接收也是只要接收完了也可以馬上接收下一個(gè)數(shù)據(jù)了
發(fā)送:(一般用查詢(xún)方式發(fā)送比較好:此時(shí)只要查詢(xún)發(fā)送完畢的標(biāo)SPIF是否置位
常用:while(!(SPSR & (1<<SPIF))); //等待發(fā)送完畢或接收完畢
查詢(xún)法:實(shí)質(zhì)就是查詢(xún)SPSRSPIF位是否置位,接收完和發(fā)送完都可以置位,(如果開(kāi)了中斷的話(huà)就會(huì)進(jìn)入相應(yīng)的中斷)
例子:
  • 主機(jī)發(fā)送查詢(xún)方式)(只要發(fā)送完畢了就可以繼續(xù)發(fā)送了)
//主機(jī)模式下發(fā)送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使能,低位首發(fā),主機(jī)模式,時(shí)鐘模式00,上升沿采樣;時(shí)鐘速率Fosc/128
  9.     SPSR = 0x00; //SPI2x=0
  10. }
  11. void SPI_send_data(char cData)
  12. {
  13.               PORTB &=~ (1<<PB4); //強(qiáng)制接收方進(jìn)入從模式(在接收方的NSS引腳沒(méi)有接地時(shí))
  14. //              SPCR |= (1<<MSTR); // MSTR有時(shí)會(huì)被清零,這里強(qiáng)制進(jìn)入主機(jī)模式
  15.               SPDR =cData;
  16.               while(!(SPSR & (1<<SPIF))); //等待發(fā)送完畢
  17. //              PORTB |= (1<<PB4); //相當(dāng)于釋放總線(xiàn)(這樣可以讓別的主機(jī)控制從機(jī))

  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. }
復(fù)制代碼

2從機(jī)接收(查詢(xún)方式)

  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允許。從機(jī)方式
  16.               SPSR = 0x00; //                            SPI倍速.頻率為系統(tǒng)時(shí)鐘
  17. }

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

3從機(jī)中斷方式接收數(shù)據(jù)(注意:當(dāng)進(jìn)入中斷服務(wù)程序后SPIF會(huì)自動(dòng)清零)
  1. /*中斷方式接收數(shù)據(jù)*/
  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使能,低位首發(fā),從機(jī)模式,時(shí)鐘模式00,上升沿采樣;時(shí)鐘速率Fosc/128
  17.     SPSR = 0x00; //SPI2x=0
  18. }

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

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

  34.   PORTA=SPDR;

  35. }
復(fù)制代碼

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


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:25103 發(fā)表于 2018-9-16 22:32 | 只看該作者
感謝分享!! 共同學(xué)習(xí)共同進(jìn)步
回復(fù)

使用道具 舉報(bào)

板凳
ID:264733 發(fā)表于 2019-11-2 10:43 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

地板
ID:611955 發(fā)表于 2019-11-15 07:13 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕亚洲精品 | 涩爱av一区二区三区 | 国内毛片毛片毛片毛片 | 看av电影 | 亚洲欧美中文日韩在线v日本 | 七七婷婷婷婷精品国产 | 欧美精品1区2区3区 精品国产欧美一区二区 | 中文字幕乱码一区二区三区 | 久久久久久国产精品三区 | 欧美黄色小视频 | 亚洲精品一区二区另类图片 | 亚洲精品日韩综合观看成人91 | 国产精品久久久久久久久免费软件 | 精品国产乱码久久久久久88av | 国产乱码精品一区二区三区五月婷 | 久久亚洲欧美日韩精品专区 | 黄色在线观看网址 | 黄色免费网站在线看 | 人人干人人玩 | 国产精品一区二区三区在线 | a级毛片免费高清视频 | 91在线网 | 日韩精品成人免费观看视频 | 国产在线精品一区二区三区 | 亚洲国产精品久久久久秋霞不卡 | 国产精品福利在线 | 亚洲精品久久久久久久久久久久久 | 日本久久精品视频 | 国产精品精品视频一区二区三区 | 99精品国产一区二区三区 | 酒色成人网 | www.色综合 | 欧美精品综合在线 | 国产精品久久久久久高潮 | 国产日韩欧美在线 | 欧美一级二级在线观看 | 日韩中文字幕网 | 亚洲精品一区二区三区在线 | 欧美精品一区二区蜜桃 | 九九热在线观看视频 | 国产精品视频一区二区三区四蜜臂 |