51單片機SPI協議與應用實例

来源:http://www.cnblogs.com/hughdong/archive/2017/07/02/7105979.html
-Advertisement-
Play Games

———————————————————————————————————————————— SPI匯流排 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ...


————————————————————————————————————————————

SPI匯流排

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

參考鏈接:

http://blog.csdn.net/fly__chen/article/details/52724109

http://blog.csdn.net/skyflying2012/article/details/11910173

http://blog.sina.com.cn/s/blog_9cc7125c0100yk1s.html

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

簡介:

  • 串列外圍設備介面
  • 全雙工三線同步,可以同時發出和接收串列數據
  • 採用主從(Master Slave)架構,支持多Slave模式應用,一般僅支持單Slave
  • 時鐘由Master控制,在時鐘移位脈衝下,數據按位傳輸,高位在前,低位在後
  • 目前應用中可以達到幾Mbps的水平
  • 優點:與普通的串列設備相比,可以按位傳輸,甚至可以暫停。當沒有時鐘跳變時,從設備不採集和傳送數據。不需要定址操作。全雙工通信。
  • 缺點:沒有應答機制確認。

特點:

  • 提供頻率可編程時鐘
  • 發送結束、中斷標誌;寫衝突保護
  • 匯流排競爭保護
  • SPI匯流排工作的4種工作方式中,使用最廣泛的是SPI0和SPI3方式

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

信號線情況:

  • SCLK提供時鐘脈衝,SDI/SDO基於此脈衝按位傳輸。當處於上升沿模式時,輸出:通過SDO線在時鐘上升沿時輸出,在緊接著的下降沿被讀取。輸入同理。
  • SS/CS是片選信號線,只有片選信號為使能信號時,對晶元的操作才有效,所以可以在同一匯流排上連接多個SPI設備
  • SDI:slave → master,從機要發送給主機的數據
  • SDO:master → slave,主機要發送給從機的數據

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

連接方式:

  • 級聯方式:此時所有設備的CS端都連在一起,只要選中一個設備,則全選。可以作為一個設備進行處理。

  • 獨立連接方式:設備獨立操作,為被選通的從設備均處於高阻隔離狀態。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

工作模式:

SPI模式

CPOL極性

CPHA相位

說明

0

0

0

第一個邊沿上升沿

1

0

1

第二個邊沿下降沿

2

1

0

第一個邊沿下降沿

3

1

1

第二個邊沿上升沿

CPOL=0SCLK有效時為高電平(active-high

CPOL=1SCLK有效時為低電平(active-low

CPHA=0:表示第一個邊沿

CPHA=1:表示第二個邊沿

Toggling edge為切換邊沿,輸出信號

Sampling edge為採樣邊沿,輸入信號

時序圖:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

SPI協議舉例

  • 主機8位寄存器存放的是1010 1010,從機存放的是0101 0101,將主從機數據交換
  • SDI:slave → master
  • SDO:master → slave
  • 上升沿發送、下降沿接收

初始化就緒狀態:

  • 主機SBUFF = 1010 1010
  • 從機SBUFF = 0101 0101

操作過程:如圖所示,經過8個脈衝後,master和slave數據交換

SPI的8個時鐘周期的數據:

————————————————————————————————————————————

基於SPI協議,DS1302顯示時鐘實例

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

實現效果:

實現代碼:

  1 #include <reg52.h>
  2 typedef unsigned char uchar;
  3 typedef unsigned int uint;
  4 //寫操作控制位元組,D7=1,D0=0
  5 uchar code write_address[] =
  6 {
  7     //秒,分,小時,日,月,星期,年
  8     0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c
  9 };
 10 //讀操作,D7=1,D0=1,地址同寫操作
 11 uchar code read_address[] =
 12 {
 13     0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d
 14 };
 15 uchar code table[] =
 16 {
 17     //0,1,2,3,4,5,6,7,8,9
 18     0xfc, 0x60, 0xda, 0xf2, 0x66, 0xb6, 0xbe, 0xe0, 0xfe, 0xf6
 19 };
 20 //dat1和dat2存放讀出來的時間,初始值寫入12年5月9日1時1分1秒,dat1存放1234位,dat2存放567位
 21 uchar dat1[] = {0x01, 0x01, 0x01, 0x09, 0x05, 0x02, 0x12};
 22 uchar dat2[] = {0x01, 0x01, 0x01, 0x09, 0x05, 0x02, 0x12};
 23 sbit rst = P3 ^ 0;
 24 sbit scl = P3 ^ 1;
 25 sbit sda = P3 ^ 2;
 26 sbit ACC7 = ACC ^ 7;
 27 void Delay(uint m)
 28 {
 29     while(m--);
 30 }
 31 /* SPI協議操作,讀位元組 */
 32 uchar ReadByte()
 33 {
 34     uchar i;
 35     for (i = 0; i < 8; ++i)
 36     {
 37         ACC = ACC >> 1; //累加器左移1位,補上未知數x
 38         ACC7 = sda; //從sda引腳寫入ACC最高位
 39         scl = 1;
 40         scl = 0; //時鐘下降沿讀入
 41     }
 42     return ACC;
 43 }
 44 /* SPI協議操作,寫位元組 */
 45 void WriteByte(uchar byte)
 46 {
 47     uchar i;
 48     for (i = 0; i < 8; ++i)
 49     {
 50         byte >>= 1; //byte左移1位存入CY
 51         scl = 0;
 52         sda = CY; //從CY移入sda,發送給DS102
 53         scl = 1; //時鐘上升沿寫入
 54     }
 55 }
 56 void Write1302(uchar address, uchar dat) //寫地址子程式
 57 {
 58     rst = 0;
 59     scl = 0;
 60     rst = 1; //rst上升沿開始寫數據
 61     WriteByte(address); //先寫入地址控制位元組
 62     WriteByte(dat); //再寫入數據位元組
 63     rst = 0;
 64 }
 65 uchar Read1302(uchar address)
 66 {
 67     uchar temp;
 68     rst = 0;
 69     scl = 0;
 70     rst = 1; //讀過程中保持rst高電平狀態
 71     WriteByte(address | 0x01); //寫入地址並置R/W位為1(讀)
 72     temp = ReadByte(); //在單片機寫入命令位元組的最後一位的第一個下降沿處即讀出數據
 73     scl = 1; 
 74     rst = 0;
 75     return temp;
 76 }
 77 void SetRST()
 78 {
 79     uchar i;
 80     Write1302(0x8e, 0x00); //向10001110防寫寄存器,寫入指令0x00
 81     for (i = 0; i < 7; ++i)
 82         Write1302(write_address[i], dat1[i]); //從秒到年各寄存器寫入對應初始值
 83     Write1302(0x8e, 0x80); //向防寫寄存器,寫入數據0x80
 84 }
 85 void ReadTime()
 86 {
 87     uchar i, temp1, temp2, temp3;
 88     temp3 = 0x80; //temp3存放時間寄存器地址
 89     for (i = 0; i < 7; ++i) //分別讀出秒分小時日月星期年
 90     {
 91         temp1 = Read1302(temp3);
 92         temp2 = temp1;
 93         dat1[i] = (temp1 >> 1) & 0x0f; //讀出的數據1234位存入dat1,屏蔽其他位
 94         dat2[i] = (temp2 >> 5) & 0x07; //讀出的數據567位存入dat2,屏蔽其他位
 95         temp3 = temp3 + 0x02; //下一個寄存器地址
 96     }
 97 }
 98 void main()
 99 {
100     rst = 0;
101     SetRST(); //時鐘建立
102     while(1)
103     {
104         ReadTime(); //讀時間
105         P2 = 0xfe;
106         P1 = table[dat1[0] % 10];
107         Delay(500);
108         P2 = 0xfd;
109         P1 = table[dat2[0] % 10];
110         Delay(500);
111         P2 = 0xfb;
112         P1 = 0x02; // -
113         Delay(500);
114         P2 = 0xf7;
115         P1 = table[dat1[1] % 10];
116         Delay(500);
117         P2 = 0xef;
118         P1 = table[dat2[1] % 10];
119         Delay(500);
120         P2 = 0xdf;
121         P1 = 0x02; // -
122         Delay(500);
123         P2 = 0xbf;
124         P1 = table[dat1[2] % 10];
125         Delay(500);
126         P2 = 0x7f;
127         P1 = table[dat2[2] % 10];
128         Delay(500);
129     }
130 }


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文出處:http://www.cnblogs.com/wy123/p/7106861.html (保留出處並非什麼原創作品權利,本人拙作還遠遠達不到,僅僅是為了鏈接到原文,因為後續對可能存在的一些錯誤進行修正或補充,無他) 最近在SQL Server中多次遇到開發人員提交過來的有性能問題的SQL, ...
  • JDBCJava DataBase Connectivity,java資料庫連接,是一種用於執行SQL語句的Java API。JDBC是Java訪問資料庫的標準規範,可以為不同的關係型資料庫提供統一訪問,它由一組用Java語言編寫的介面和類組成。 驅動JDBC需要連接驅動,驅動是兩個設備要進行通信, ...
  • 一、如何打開執行計劃? 在Microsoft SQL Server Management Studio中打開“包括實際的執行計劃”(快捷鍵:Ctrl+M),執行SQL語句就可以看到實際的執行計劃(圖文格式,非常直觀),這無疑是最友好的查閱方式。 二、如何看懂實際執行計劃? 執行複雜的腳本之後,看到的 ...
  • 最近在工作中遇到一個問題: 我們系統的一些邏輯處理是用存儲過程實現的,但是有一天客服反饋說訂單下單失敗,查了下單牽扯到的產品基礎資源,沒有問題。 下單的存儲過程中有這樣兩句代碼: 執行存儲過程後 變數_err會返回1,只能調試存儲過程找問題了。調試到下麵這段的時候,發現執行完這句sql,_err就變 ...
  • 環境:oracle 11g pl/sql 橫縱表相互轉化 項目中有時候會用到把縱表轉化成橫表,或是橫表轉化成縱表,以下是我在請教別人和自己思考後想到的方法。以下提供一個小實例,供大家參考。 縱表轉橫表 1、縱表如下: 說明:共有四個城市,和四個項目,每個城市最多有四個項目。 2、轉化成橫表如下: S ...
  • Kali 2.0更新源kali-rolling:#中科大deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contribdeb-src http://mirrors.ustc.edu.cn/kali kali-rolling ...
  • 1.安裝: 首先找到git的官網,內部有下載鏈接。 也可以用下麵的,我的是win7的64位系統: 可以在此處下載:Git-2.13.0-64-bit.exe鏈接:http://pan.baidu.com/s/1dFIOU1V 密碼:xky2 下麵是安裝後的效果: git作用:可以用一個代碼文件來表達 ...
  • ———————————————————————————————————————————— 1-Wire匯流排 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...