2015年5月7日 星期四

[嵌入式系統]Ch2 嵌入式系統-The communication interface of SoC(System On Chip)

初階

===================================================================
GPIO(通用目的輸入輸出 : General Purpose Input/Output)
GPIO設定有三種模式 : 
1.軟體輸出模式
2.軟體輸入模式
3.硬體控制模式
前兩種為程式控制,亦就是設定成能讓程式去控制GPIO High / Low
後面一種則是讓硬體去決定作動方式(若無特別需求一般都是設定為這個)
電位係數 : 
分為高電位及低電位兩種,稱為pull high & pull low

程式控制(API) :
gpio_init() //初始化腳位
gpio_config(腳位號碼,控制模式) //控制腳位與模式
gpio_set(腳位號碼,電位高低) //設定腳位的電位高低
gpio_val() //(腳位號碼) //取得該腳位的電位狀態

一般我們會使用gpio來控制button 或 led
基本上各種低速的interface都可以透過GPIO兜起來,如PWM ADC I2C SPI等等,可以想成是interface的基本單位。
=====================================================================


ADC(類比數位轉換器 : Analog-to-Digital Converter)


=====================================================================
PWM(脈衝寬度調變 : Pulse Width Modulation)


=====================================================================
UART(通用非同步接收傳送器 : Universal Asynchronous Receiver/Transmitter)
Debug介面
有七個腳位 (以嵌入式系統開發 常用到腳位為 Vcc Tx Rx GND 四腳位)
特別注意的是 在轉接頭的採買 常會有廠商雞婆幫忙跳線Tx&Rx部分 買完之後記得用三用電表短路檔測試
Vcc(正電輸入) : 又分為3.3及5V兩種工作電壓
Tx(傳送) : 位於RS232第3隻腳位
Rx(接收) : 位於RS232第2隻腳位
RTS(要求傳送) : 位於RS232第7隻腳位
CTS(清除以傳送) : 位於RS232第8隻腳位
GND(接地) : 位於RS232第5隻腳位

分為中斷模式(互動式UART) 與Write / Read only UART

如果需要彼此互相溝通 必須將 兩個device tx rx對調 ,在一般情況我們不需考慮tx rx對調
Device A         Device B
           Vcc         Vcc
           Tx           Rx
                   X
           Rx           Tx
           GND       GND

此外,如果我們SoC跟外接走UART的裝置要dubug uart interface我們可以考慮分成兩個部分驗證:

1.從SoC 端Tx 接上我們debug工具的Rx直接看
2.裝置端 可以用工具的Rx接device的Tx來看

最後,分享一下RS家族的規格
Reference from : 

魚的方舟 *單晶片嵌入式系統工作室-[Article Collections] RS485 & RS232 簡介


RS232、RS423、RS422、RS485。

規格

RS232

RS423RS422

RS485

操作模式單端傳輸單端傳輸差動傳輸差動傳輸
線上允許之傳送/接受數目1 Driver
1 Receivers
1 Driver
10 Receivers
1 Driver
10 Receivers
32 Driver
32 Receivers
最大傳輸距離50 feet
(15 m)
4000 feet
(1.2 km)
4000 feet
(1.2 km)
4000 feet
(1.2 km)
最大傳輸速率20 kb/s100 kb/s10 Mb/s10 Mb/s
接收端之輸入靈敏度±3 V±200 mV±200 mV±200 mV

=====================================================================
JTAG(聯合測試工作群組 : Joint Test Action Group)
一種DEBUG的介面,使用時機在於UART interface無法正常工作時,用來讀取SoC訊息的工具介面,另一種使用情境為 剛打好的Main chip沒有任何code燒寫在nor flash或nand flash時提供手動燒寫(需main chip廠商有提供此種方式,原理為ddr initial)


進階

SPI (Serial Peripheral Interface)
圖片Reference : https://www.totalphase.com/support/articles/200349236-SPI-Background



















傳輸速率 : 有七種 156 312 625 1250 2500 5000 10000 Khz,
傳輸高低位元方向 : 分為MSB跟LSB兩種
訊息格式 : 16進制 0xff
訊息長度 : MOSI : 10240Bytes     &     MISO : 64Bytes (Buffer限制)
有四種Mode :
















SPI較I2C不常用,原因是因為接線需要較多條,但傳輸速率較I2C快
分別為:
Device A (Master)               Device B (Slave)
SCLK                           >     SCLK
MISO                           >     MISO
MOSI                           >     MOSI
Chip Select                  >     Chip Select

整體流程如下 :
1.Master 選中Slave 用Chip Select腳位拉高電位 提醒Slave
2.
3.
4.

轉載自Ramax 喵董的Linux SPI subsystem (1)


目前進行中的項目是在 DaVinci 平台上開發 SPI 控制器驅動程式,不過由於手邊缺乏硬體平台可供測試的關係,現在仍然進度緩慢。不過這期間也研究了一下 Linux SPI 子系統,稍微有一些心得,來和各位分享一下。

SPI 是 Serial Peripheral Interface 的縮寫,它是一種串列式的 IO 介面,時脈約 1~ 70MHz,詳細資料可見 [1]。 DaVinci DM6446 上配備了一個 SPI 控制器,支援二個 chip select,時脈可達 33MHz。

Linux SPI 子系統將驅動程式分為三種類型:

  • SPI bus driver:
    主要目的為提供 API 給下層的 master driver 及上層的 protocol driver (稍後會提)來註冊,並傳送封包至下層的 driver。
  • SPI master driver:
    主要工作為初始化控制器,並負責對暫存器寫入以及中斷處理。
  • SPI protocol driver:
    主要為發送 SPI 訊息封包至所選擇的裝置。
從這樣的架構來看,bus driver 扮演了一個抽象層的角色,對上隱藏了硬體的細節,對下則隱藏了對特定裝置的通訊協定。是故 master driver 並不需要知道控制器接了什麼周邊,它只專注在如何操作控制器來將訊息封包送出;而 protocol driver 只需專心於和特定週邊的溝通,而不需了解要如何傳送訊息封包。

在子系統中,訊息封包的格式定義在 spi.h 的 spi_message 結構中。protocol driver 要傳送資料,只需填上 spi_message 結構相對應的欄位,並呼叫 spi_sync 以起始傳送。或者也可直接呼叫 spi_read/spi_write,參數則填入你的 buffer pointer 以及長度即可。

一般在嵌入式系統中,SPI 周邊多是直接固定在板子上,且硬體並無特別的方式可供偵測,因此我們需要在平台初始化時預先定義系統包含那些 SPI 周邊,而子系統也定義一個結構 spi_board_info 提供給開發者填入相對應的資訊,例如:

struct spi_board_info devices[] = {
     {
         .modalias = "mydevice",
         .max_speed_hz = 6000000,
         .bus_num = 0,
         .chip_select = 1,
         .mode = SPI_MODE_1,
     },
     {
         ......
     },
};

接著呼叫 spi_register_board_info 來註冊這些裝置。需要注意的是,modalias 欄位的值必須與 protocol driver 註冊的名字相同;bus driver 會以該值作為比對的依據。若需在執行時期註冊新的裝置,則可呼叫 spi_new_device 來加入。

關於 master driver 的部分留待下一篇來討論。

相關連結:
[1] Serial Peripheral Interface Bus
[2] TMS320DM644x DMSoC Serial Peripheral Interface (SPI) User's Guide
=====================================================================
i2c (I square c-)
I2C有分主從
訊息長度 : 可無限延伸
Master i2c可以外接很多slave 但有限制,就是slave端的slave address不能重複
i2c有兩條線   一條clock 一條data
持續保持高電位是start sequence拉低電位的第一個clock 為slave address記載著要把訊息傳給哪個slave device 會把訊息發送給該interface暫存器的所有device (較像是網路拓墣中的星狀網路架構)  clock開始震盪的這段期間所傳的訊息 被slave承認為訊息 其餘則非
clock拉高電位後持續一段時間 最後一個上升電位為stop sequence.

Data是8bits傳輸 是由MSB 開始傳輸 每八個bit傳輸完以後會有一個acknowledge bit 所以會有9個pulse。 
如果收到的ACK bit 是low的話 就代表device已經可以準備接收下一筆data, 但是如果收到的ACK bit是high的話
就表示不能再接收任何資料 此時mater應該要結束傳輸(傳送stop sequence)

=====================================================================
i2s()
LCD相關Interface-參考1
RGB Mode(大宗) :
MCU Mode() : 其中又分為i80(常用),m68
i80 : Vcc,GND,CS,RS(資料區分訊號),WR(Write),RD(Read),Data,Reset

m68跟i80大同小異暫不介紹



=====================================================================
高速傳輸Interface
USB()
SDIO(Secure digital input/output interface)





沒有留言:

張貼留言