# work log ###### tags: `專題` ## 2022/3/8 meeting ### 》TARGET ![](https://i.imgur.com/1yV8GEw.png) + SPI 4 modes + 主僕式 MOSI MISO SCLK CS(Chip Select) + UART + connect Raspberry Pi to FPGA by using SPI ### 》WHAT IS SPI? ----- http://wiki.csie.ncku.edu.tw/embedded/SPI#introduction ----- https://zhuanlan.zhihu.com/p/32803973 ----- https://ithelp.ithome.com.tw/articles/10245910 ----- https://www.cnblogs.com/gmpy/p/12461461.html ----- https://zhuanlan.zhihu.com/p/32803973 ----- https://www.eet-china.com/mp/a63094.html #### <font color="#897d46">**OVERVIEW**</font> > + <font color="#7f429e">**S**erial **P**eripheral **I**nterface</font> > + 一種 4 線同步序列資料協定,最早由 Motorola 設計並實現,適用於可攜式裝置平臺 > + 串列外設介面一般是 4 線,有時亦可為 3 線,分別為: >> + **Master In Slave Out (MISO)** >> + **Master Out Slave In (MOSI)** >> + **Serial Clock (SCLK)** >> + **Slave Selection (SS)**:也作 ++CS (Chip Select)++。傳輸要開始的第一步,就是 <font color="#fbc77a">**把對應的 SS 拉低</font> <font color="#dd404a">(要跟哪一個 slave 進行傳輸,就把誰的 SS 拉低)**</font> > > + 可連接: >> + memory >> + RTC:<font color="#7f429e">(Real-time cloc)</font>,是指可以像時鐘一樣輸出實際時間的電子設備,一般會是積體電路,因此也稱為時鐘晶片 >> + ADC:<font color="#7f429e">(Analog-to-Digital Converter)</font>,類比數位轉換器 >> + DAC:<font color="#7f429e">(Digital-to-Analog Converter)</font>,數位類比轉換器 >> + ... > + ![](https://i.imgur.com/ADeQveR.png) #### <font color="#897d46">**INTRODUCTION**</font> > + SPI 為主從式同步串列通訊,可分為: >> + <font color="#579d6d">**單工**</font>:線路上的訊號只能做 ++單向++ 傳送 >> + <font color="#579d6d">**半雙工**</font>:線路上的訊號 ++可以雙向傳送++,<font color="#fbc77a">**但是不能同時傳送**</font> >> + <font color="#579d6d">**全雙工**</font>:線路上的訊號 ++可以同時雙向傳送++ >> + <font color="#579d6d">**同步**</font>:傳送端和接收端 <font color="#fbc77a">**共用同一個 Clock**</font> > > + 所有的傳輸都會根據一個共同的頻率訊號,此頻率訊號產生自 "主控裝置(Master 端)",從屬裝置(Slave 端) 會用此頻率訊號來對收到的位串流進行 <font color="#6392d1">++**同步**++</font> >>> + <font color="#6392d1">**同步串列傳輸:**</font><font color="#63bfd1">對接收端而言並沒有自己的時脈產生電路,而是依據傳送端送過來的時脈來接收資料 (即 <font color="#fbc77a">**傳送端和接收端共用同一個 Clock**</font> ),傳送端 ++**以一條導線送出資料,同時以另一條導線送出傳送時脈,提供接收端之同步訊號**++</font>![](https://i.imgur.com/28v0Hs8.png) >> >>> + <font color="#6392d1">**非同步串列傳輸:**</font><font color="#63bfd1">傳送端與接收端只需 <font color="#fbc77a">++約定是以 X 速率(clock rate)來傳輸++</font>,接收端的接收時脈(Receiver Clock,RxC) 產生方式和傳送者的位元傳輸時脈(Transmitter Clock,TxC) 是 ++**互相獨立無關**++ 的,此種傳輸方式是 ++允許傳送與接收時脈的頻率不那麼同步 (允許一定程度的誤差)++ 的情況下進行,故稱為非同步傳輸</font>![](https://i.imgur.com/2Q2GKPG.png) >> >>> + 串列通訊 V.S. 並行通訊: >>> https://www.getit01.com/p20180130729033993/ >>>> + 並行通訊的缺點: >>>>> + <font color="#579d6d">**線路的成本高**</font>:如果每個 clock 發送 16 個 bit,則需要 16 根數據線(另外還需要多根控制線) >>>>> + <font color="#579d6d">**體積大**</font>:並行介面佔用空間大,對應線纜佔用空間也大 >>>>> + <font color="#579d6d">**信號線之間的干擾大,不能用於長距離傳輸**</font>:在 ++進行高速傳輸++ 時,會在 ++每條信號線的周圍產生微弱的電磁場++,出現 **++串音干擾++**,進而影響到其它信號線中的數據傳輸。++傳輸距離越長,串音干擾越嚴重++ >>>>> + <font color="#579d6d">**並行傳輸具有同步問題**</font>:如果並行的線路之間的 ++**物理性質**++ 不一致,例如 ++長度上有細微差別++,會導致並行線路中傳輸的比特不是同時到達接收方,接收器接收數據時容易出錯 >>>>> + <font color="#579d6d">**傳輸頻率低**</font>:如果++傳輸頻率高++ 的話,++數據線之間會產生很大的干擾++,造成數據出錯,即使為數據線 ++添加屏蔽層,也不能保證屏蔽掉高頻率產生的干擾++。所以,並行傳輸的 ++**最高傳輸頻率有一定限制**++ > > + 如果有多個周邊晶片被連到同一個 SPI 介面,主控裝置能透過 ++**SS pin腳的電位高低**++ 來選擇接收資料的周邊裝置 > + ![](https://i.imgur.com/PYXEoFs.png) #### <font color="#897d46">**MODES**</font> > + <font color="#57bc6d">**CPOL ( **C**lock **Pol**arity,極性 )**</font>:用以決定在總線空閒時,SCLK 信號是高電位還是低電位。 >>> CPOL = 1:時脈在沒有傳輸資料的時候會維持 <font color="#fbc77a">**高**</font> 電位 >>> CPOL = 0:時脈在沒有傳輸資料的時候會維持 <font color="#fbc77a">**低**</font> 電位 >>> ![](https://i.imgur.com/YQfgVeg.png) > > + <font color="#57bc6d">**CPHA ( **C**lock **Pha**se,相位 )**</font>:用來決定在時脈的哪個相位把資料鎖住 (latch)。 >>> CPHA = 0:是在時脈的 <font color="#fbc77a">**前**</font> 半個週期鎖住資料 >>> CPHA = 1:是在時脈的 <font color="#fbc77a">**後**</font> 半個週期鎖住資料 >>> ![](https://i.imgur.com/dks6RF8.png) > > + CPOL 和 CPHA 的不同組合,形成了 SPI 總線的不同模式 > ![](https://i.imgur.com/fhiNJpE.png) >> ![](https://i.imgur.com/2066SzP.png) >> ![](https://i.imgur.com/hh27Veh.png) >> ![](https://i.imgur.com/SxZWjcQ.png) >> ![](https://i.imgur.com/r8I8bwq.png) ### 》WHAT IS UART? ----- https://silverwind1982.pixnet.net/blog/post/361701597-uart ----- https://makerpro.cc/2016/07/learning-interfaces-about-uart-i2c-spi/ ----- https://www.eettaiwan.com/20210713ta71-uart-a-hardware-communication-protoco/ #### <font color="#897d46">**OVERVIEW**</font> > + <font color="#7f429e">**U**niversal **A**synchronous **R**eceiver/**T**ransmitter</font> > + 是最常用的裝置間通訊協定之一 > + 是一種 <font color="#dd404a">**非同步串行通信 (Asynchronous serial communication)**</font> 的方式,透過規定編碼格式、bit rate,產生通信所需 bit 流的標準 > + 會將數據透過串列通訊和平行通訊作傳輸轉換,通常用以與其他通訊接口(如 EIA RS-232)連接 > + 使用的訊號線如下: >> <font color="#57bc6d">**TX (Transmitter)**</font>:發送器,輸出訊號 >> <font color="#57bc6d">**RX (Receiver)**</font>:接收器,接收訊號 > + 範例,由兩個 UART 裝置組成: > ![](https://i.imgur.com/K3eSE9d.png) >>> + 裝置的 RX 要與另一個裝置的 TX 互接 >>> + ++==沒有同步 clock 的機制==++,而是在兩個 UART 裝置 ++**約定好使用相同的頻率**++,所以為 asynchronous (非同步) >>> + 在 UART 使用的頻率稱為 ++鮑率(BAUD rate)++,可能為 9600、19200、 38400、115200、… Hz > #### <font color="#897d46">**INTRODUCTION**</font> > + 經由正確配置,UART 可以配合許多不同類型的涉及發送和接收串列資料的串列協定工作 > + 在串列通訊中,資料透過 ++單條線路或導線逐位元傳輸++;在 ++雙向通訊++ 中,++使用兩根導線來進行連續的串列資料傳輸++ > + 根據應用和系統要求,串列通訊 ++需要的電路和導線較少++,可 <font color="#fbc77a">**降低實現成本**</font> > > + 具有匯流排的 UART:![](https://i.imgur.com/uP8PdzC.png) > + ==發送UART== 連接到 ++以並列形式發送資料的控制資料匯流排++。然後,資料將在傳輸線路上 (導線) ++1 位元 1 位元地序列傳輸到==接收UART==++。反過來,**對於接收裝置,<font color="#fbc77a">++串列資料會被轉換為並列資料++**</font> > + 因 <font color="#dd404a">**不使用時脈訊號來同步**</font> 發送器和接收器裝置,++==發送器==根據其時脈訊號產生的位元流取代了時脈訊號++,++==接收器==則使用其內部時脈訊號對輸入資料進行採樣++ > + 對於 UART 和大多數串列通訊,發送和接收裝置需要 <font color="#fbc77a">**將串列傳輸速率設定為相同的值**</font> >> + 同步點是透過兩個裝置的相同串列傳輸速率來管理,如果串列傳輸速率不同,發送和接收資料的時序可能會受影響,導致資料處理過程出現不一致。++允許的串列傳輸速率差異最大值為 **10%**++,超過此值,位元的時序就會脫節 > + 下表總結了關於UART必須瞭解的幾點:![](https://i.imgur.com/5CPCGGG.png) #### <font color="#897d46">**DATA TRANSPORTATION**</font> > + ![](https://i.imgur.com/JD03rPj.png) >> 在 UART 中,傳輸模式為 **++資料封包++** 形式。連接發送器和接收器的機制包含 ++串列資料封包的創建和物理硬體線路的控制++,資料封包由起始位元、資料幀、同位檢查位元和停止位元組成: >>> + <font color="#57bc6d">**起始位元**</font>:當 <font color="#fbc77a">++**不傳輸資料**++</font> 時,UART 資料傳輸線通常保持 <font color="#fbc77a">**高電壓位準**</font>。若要 ++開始資料傳輸++,==發送UART== 會將傳輸線 <font color="#fbc77a">**從高位準拉到</font> <font color="#dd404a">低位準</font> ++並保持 1 個時脈週期++**。當接收UART **++檢測到高到低電壓躍遷++** 時,便開始以串列傳輸速率對應的頻率讀取資料幀中的位元![](https://i.imgur.com/qVGscd0.png) >>> >>> + <font color="#57bc6d">**資料幀**</font>:包含所傳輸的實際資料。如果 ++使用同位檢查位元,資料幀長度可以是 5 位元到 8 位元++;如果 ++不使用同位檢查位元,資料幀長度可以是 9 位元++。在大多數情況下,資料以 <font color="#fbc77a">**最低有效位元優先**</font> 方式發送![](https://i.imgur.com/REe5bSR.png) >>> >>> + <font color="#57bc6d">**同位檢查位元**</font>:透過同位檢查位元,==接收UART== 判斷 ++傳輸期間是否有資料發生改變++。<font color="#fbc77a">**電磁輻射、不一致的串列傳輸速率或長距離資料傳輸**</font> 都可能改變資料位元,==接收UART== 讀取資料幀後,將計數 <font color="#dd404a">**值為 1 的位元**</font>,<font color="#fbc77a">++**檢查總數是偶數還是奇數**++</font>。++如果同位檢查位元為 0 (偶數同位),則資料幀中的 1 或邏輯高位總計應為偶數++;++如果同位檢查位元為 1 (奇數同位),則資料幀中的 1 或邏輯高位總計應為奇數++。當同位檢查位元與資料匹配時,UART 認為傳輸未出錯,但是,如果同位檢查位元為 0,而總和為奇數,或者同位檢查位元為 1,而總和為偶數,則 UART 認為資料幀中的位元已改變 >>> ![](https://i.imgur.com/MZHSsDj.png) >>> >>> + <font color="#57bc6d">**停止位元**</font>:為了表示 <font color="#fbc77a">**資料封包結束**</font>,==發送UART== 將資料傳輸線 **++從低電壓驅動到高電壓++** 並保持 1~2 位元時間![](https://i.imgur.com/1H5dF3p.png) ### 》RASPBERRY PI WITH SPI ----- Raspberry Pi pinout: > https://pinout.xyz/pinout/spi ----- Controlling an SPI device with the Raspberry Pi: > https://www.takaitra.com/spi-device-raspberry-pi/ ----- 在樹莓派上讀取土壤濕度感測器讀數: > https://codingnote.cc/zh-tw/p/141653/ >> 由於樹莓派沒有模擬訊號引腳,所以沒有辦法直接輸出模擬訊號數值,此時需要使用 MCP3008 積體電路 >>> MCP3008 IC(Integrated Circuit)是一個8通道,10位的具有SPI串列介面的A / D轉換器(模擬-數字轉換器),共有16個引腳,可以用來解決模擬引腳問題(MCP3004也是ADC,不過為4路,體型更小)。MCP3008使用SPI匯流排協議從樹莓派接收模擬輸入值。它有8個模擬輸入(ch0-ch7),另外一列的8個引腳中有4個電源和地引腳和4個連接樹莓派的引腳,它產生範圍為0-1023的輸出值(注意:0表示0V, 1023表示3.3V)。 ----- how to use the SPI in Raspberry Pi (also use Arduino UNO): > https://radiostud.io/understanding-spi-in-raspberry-pi/ --- ## 2022/3/15 meeting ### 》TARGET ![](https://i.imgur.com/yFZJjgd.jpg) + 實作 SPI、UART + 熟悉視窗介面寫法 ---