---
# System prepended metadata

title: work log
tags: [專題]

---

# 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
+ 熟悉視窗介面寫法
---




