ADC和VCC/VDD/VSS/VEE/VBAT/VREF、SPI

一 ADC

  ADC,Analog-to-Digital Converter的縮寫,指模/數轉換器或者模數轉換器。是指將連續變化的模擬信號轉換爲離散的數字信號的器件。真實世界的模擬信號,例如溫度、壓力、聲音或者圖像等,需要轉換成更容易儲存、處理和發射的數字形式。模/數轉換器可以實現這個功能,在各種不同的產品中都可以找到它的身影。
  與之相對應的DAC,Digital-to-Analog Converter,它是ADC模數轉換的逆向過程。

二 關於Gain與Offet

1 偏移與增益誤差(Offset Gain Error)

  器件理想輸出與實際輸出之差定義爲偏移誤差,所有數字轉換都存在這種誤差。在實際中,偏移誤差會使傳遞函數或模擬輸入電壓與對應數值輸出存在一個固定的偏移。通常計算偏移誤差方法是測量第一個數字轉換或“零”轉換的電壓,並將它與理論零點電壓相比較。增益誤差是預估傳遞函數和實際斜率的差別,增益誤差通常在模數轉換器最末或最後一個傳輸代碼轉換點計算。
  爲了找到零點與最後一個轉換代碼點以計算偏移和增益誤差,可以採用多種測量方式,最常用的兩種是代碼平均法和電壓抖動法。代碼平均測量就是不斷增大器件的輸入電壓,然後檢測轉換輸出結果。每次增大輸入電壓都會得到一些轉換代碼,用這些代碼的和算出一個平均值,測量產生這些平均轉換代碼的輸入電壓,計算出器件偏移和增益。電壓抖動法和代碼平均法類似,不同的是它採用了一個動態反饋迴路控制器件輸入電壓,根據轉換代碼和預期代碼的差對輸入電壓進行增減調整,直到兩代碼之間的差值爲零,當預期轉換代碼接近輸入電壓或在轉換點附近變化時,測量所施加的“抖動”電壓平均值,計算偏移和增益。

2 Gain與Offset的真面目

  在討論gain與offset的時候,必須要有一個認知,他們不是隻有單一個點的數值,offset與gain,通常會反映在一連續的數值變化上。
  Gain與Offset說穿了對於數據而言,只是一個加減值(offset)與一個乘除值(gain)而已,在作量測與訊號處理的同時(放大、衰減等)我們希望經過處理後的訊號,保有一定的線性度,什麼叫做線性?也就是希望所得到的連續數據是呈現一直線的情況,例如下圖:藍線
在這裏插入圖片描述
  藍色的線是我們假定的標準值,也就是依照一定比例的遞增趨線,此時offset與gain我們可以視爲:offset = 0, gain = 1。但是經過實際的驗證結果,我們可能會得到一個測試值,如上圖棕色線,也就是測試數據所得到的趨線,很明顯的可以發現,與我們所想要的結果不同,故透過圖表來看,我們可以很清楚的知道offset與gain的關係,offset可以視爲是一個基底存在的值,而gain指的也就是斜率的變化,當所測得的數據保有一定的線性度(沒有很嚴重的失真),此時就可以做單一次的修正,就可以獲得較小誤差的修正值(如上圖內表格所示)。
  測得實際量測數據後,我們可以透過簡單的加減乘除來處理:(原始值+offset)×Gain = 修正後數據。
  但是當假設當量測的原始數據不是線性時,在處理上就會比較麻煩。

三 LSB和MSB

  LSB(Least Significant Bit),最低有效位;MSB(Most Significant Bit),最高有效位,若MSB = 1,則表示數據爲負值,若MSB = 0,則表示數據爲正。
  一個12位串行轉換器,它會輸出由1或0組成的12位數串。通常,轉換器首先送出的是最高有效位(MSB)(即LSB+11)。有些轉換器也會先送出LSB。在下面的討論中,我們假設先送出的是MSB(如圖所示),然後依次送出MSB-1(即LSB+10)和MSB-2(即LSB+9)並依次類推。轉換器最終送出MSB-11(即LSB)作爲位串的末位。
在這裏插入圖片描述
  LSB這一術語有着特定的含義,它表示的是數字流中的最後一位,也表示組成滿量程輸入範圍的最小單位。對於12位轉換器來說,LSB的值相當於模擬信號滿量程輸入範圍除以212或4,096的商。如果用真實的數字來表示的話,對於滿量程輸入範圍爲4.096V的情況,一個12位轉換器對應的LSB大小爲1mV。但是,將 LSB 定義爲4096個可能編碼中的一個編碼對於我們的理解是有好處的。
  讓我們回到開頭的技術指標,並將其轉換到滿量程輸入範圍爲4.096V的12位轉換器中:
失調誤差=±3LSB=±3mV,
增益誤差=±5LSB=±5mV,
這些技術參數表明轉換器轉換過程引入的誤差最大僅爲8mV(或8個編
碼)。這絕不是說誤差發生在轉換器輸出位流的LSB、LSB-1、LSB-2、LSB-3、LSB-4、LSB-5、LSB-6和LSB-7八個位上,而是表示誤差最大是一個LSB的八倍(或8mV)。
準確地說,轉換器的傳遞函數可能造成在4,096個編碼中丟失最多8個編碼。丟失的只可能是最低端或最高端的編碼。例如,誤差爲+8LSB((+3LSB 失調誤差)+(+5LSB增益誤差))的一個12位轉換器可能輸出的編碼範圍爲0至4,088。丟失的編碼爲4088至4095。相對於滿量程這一誤差很小僅爲其0.2%。與此相對,一個誤差爲-3LSB((-3LSB失調誤差)(-5LSB增益誤差))的12位轉換器輸出的編碼範圍爲3至4,095。此時增益誤差會造成精度下降,但不會使編碼丟失。丟失的編碼爲0、1和2。這兩個例子給出的都是最壞情況。在實際的轉換器中,失調誤差和增益誤差很少會如此接近最大值。
在實際應用中,由於ADC失調或增益參數的改進而使性能提升的程度微不足道,甚至可以忽略。但是,對於那些將精度作爲一項設計目標的設計人員來說,這種假設太過絕對。利用固件設計可以很容易地實現數字校準算法。但更重要的是,電路的前端放大/信號調理部分通常會產生比轉換器本身更大的誤差。
通過上面的討論可以對本文開頭提到的錯誤結論有一個更爲全面而清晰的認識。事實上,上述的12位轉換器的精度約爲11.997位。採用微處理器或單片機可以利用簡單的校準算法消除這種失調和增益誤差,這對設計人員來說無疑是個好消息。
MSB指二進制中最高值的比特。在16比特的數字音頻中,其第1個比特便對16bit的字的數值有最大的影響。例如,在十進制的15,389這一數字中,相當於萬數那1行(1)的數字便對數值的影響最大。比較與之相反的“最低有效位”(LSB)。

四 stm32的VCC/VDD/VSS/VEE/VBAT/VREF的區別與聯繫

  先看一下stm32vet6的引腳圖:
在這裏插入圖片描述
  電路設計以及PCB製作中,經常碰見電源符號:VCC、 VDD、VEE、VSS、VREF,他們具有什麼樣的關係那?
  VCC:C=circuit 表示電路的意思,即接入電路的電壓;
  VDD:D=device 表示器件的意思,即器件內部的工作電壓;
  VSS:S=series 表示公共連接的意思,通常指電路公共接地端電壓;
  VEE:負電壓供電;場效應管的源極(S),或三極管的發射極(E);
  VBAT:BAT=Battery 表示電池電壓,鏈接電池正極;
  VREF:ref=reference 表示參考電壓。

五 說明

  1、對於數字電路來說,VCC是電路的供電電壓,VDD是芯片的工作電壓(通常Vcc>Vdd),VSS是接地點。例如,對於ARM單片機來說,其供電電壓VCC一般爲5V,一般經過穩壓模塊將其轉換爲單片機工作電壓VDD = 3.3V。
  2、有些IC既有VDD引腳又有VCC引腳,說明這種器件自身帶有電壓轉換功能。
  3、在場效應管(或COMS器件)中,VDD爲漏極,VSS爲源極,VDD和VSS指的是元件引腳,而不表示供電電壓。
  但是,
  1,爲什麼要分5對VDD VSS出來?
  2,這5組VDD VSS分別負責哪些模塊的供電?是分開的?還是都在一起的?
  這和芯片的設計有關係。一般VDD和VSS管腳均勻分佈在芯片的四周的,是基於電源完整性的考慮,可以爲芯片提供最好的電源質量,降低電源阻抗,保證高速數字電路可靠工作的手段。
  1、DSP內部有很多功能單元,這些單元都需要供電,採用多引腳供電可以就近獲取電源,無需在內部穿越。
  2、不同單元之間,有時不希望電源互相影響,採用獨立的電源引腳,可以避免這種影響。
  3、實際使用時,每個引腳不但要連接電源,還應在電源引腳附近加上退藕電容。
  其目的是當器件工作時,電流的變化會引起電源的電壓微小波動,加上退藕電容後,這種波動就不容易傳遞到另外的電源引腳。
  關於VBAT:
  當使用電池或其他電源連接到VBAT腳上時,當VDD 斷電時,可以保存備份寄存器的內容和維持RTC的功能。如果應用中沒有使用外部電池,VBAT引腳應接到VDD引腳上。
  關於VREF:
  VREF是A/D的基準電壓,是A/D測量電壓的標準,VREF精度高,A/D轉換精度纔有保障。好比一把尺子,刻度不準,測量自然不準確。有的A/D芯片VREF可以直接由內部基準源提供,外電路就簡單,有的可以外部輸入更高精度的基準源。
  Vref就是指輸入的模擬電壓的最大值,用於比較輸入電壓,AD的輸入的有效範圍:0-Vref,如果是10bit ADC,Vref=5v,2^10(1024):5v,那麼ADC的分辨率爲5/1024=0.00488v。
  Vref爲芯片的參考輸出,VrefA爲芯片的外部參考基準輸入。把這兩者連接,就是使用Vref作爲VrefA的參考基準。
  Vref和AGND之間必須連接4.7uF和0.1uF的電容,其中0.1uF靠近芯片引腳,4.7uF在外側,這樣可以防止芯片數字噪聲的串擾。
  爲何要寫這篇文檔?
  百度上找出來的SPI接口中文描述都說的太過簡略,沒有一篇文檔能夠詳盡的將SPI介紹清楚的。wikipedia英文版[註釋1]中,SPI接口介紹的很好,但是畢竟是英文版,讀起來終究不如母語舒服,所以我結合自己的工作經驗,對其進行了漢化、整理。
  個人SPI接口相關經驗:

  1. 參與過國產某芯片SPI接口樣品驗證、SPI接口服務DEMO開發(C語言)。
  2. 使用國產某芯片GPIO接口模擬SPI接口(C語言)。
  3. 使用STM32芯片的SPI MASTER/SLAVE(C語言)。

一 SPI接口是什麼?

  SPI ( Serial Peripheral Interface,串行外設接口)是一種同步、串行通訊接口規格,常用於短距離通訊,主要是在嵌入式系統中。此接口由Mototola公司推出,已成爲一種事實標準(沒有統一的協議規範,但是基於其廣泛的使用,根據實際使用中大家通用的習慣形成了一個類似行規的標準)。
  SPI典型的應用場景包括SD卡(SD接口中包含SPI接口)和液晶顯示。
  SPI是一種高速的,全雙工,同步的通信總線。分爲主(master)、從(slave)兩種模式,一個SPI通訊系統需要包含一個(且只能是一個)maser(主設備),一個或多個slave(從設備)。
  SPI接口的讀寫操作,都是由master發起。當存在多個從設備時,通過各自的片選(slave select)信號進行管理。
  硬件開發人員設計、提供的SPI接口,其實只是一個數據讀寫通道 ,具體讀寫數據所代表的意義需要在應用中定義。不像SD接口那樣,對於命令有着明確詳細的定義。

二 SPI接口都包含哪些IO線?

  除了供電、接地兩個模擬連接以外,SPI總線定義四組數字信號:

  • 接口時鐘SCLK(Serial Clock,也叫SCK、CLK),master輸出至slave的通訊時鐘。
  • MOSI( Master Output Slave Input,也叫SIMO、MTSR、DI、DIN、SI)自master輸出至slave的數據線。
  • MISO (Master Input Slave Output,也叫SOMI、MRST、DO、DOUT、SO)自slave輸出至master的數據線。
  • SS(Slave select,也叫nSS、CS、CSB、CSN、EN、nSS、STE、SYNC)SPI從設備是否被選中的,只有片選信號爲預先規定的使能信號時(高電位或低電位),對此 SPI 從設備的操作纔有效。

  註釋:

  • 兩條數據線與SCLK的時序關係詳見下文。
  • SPI接口的片選信號一般都是低有效的,儘管有的地方命名爲SS/CS而有的地方命名爲nSS/nCS。(當然了,對於一個合格的硬件開發者,低電平有效的信號都應該在命名時加上個_n)

三 SPI接口如何連接?

  在master/slave上,都能找到SCLK/MISO/MOSI/SS四個接口。
  當只有一個maser、一個slave時,將master與slave上名字相同的4對接口兩兩互聯,即可完成了接口的互聯。如下圖所示:
在這裏插入圖片描述
  註釋:

  • 某些芯片產品上,對SPI兩條數據線的命名爲SDO/SDI。此時需要將master的SDO連接到slave的SDI,將master的SDI連接到slave的SDO。
  • 當系統中只有一個SLAVE時,且SLAVE的SS是低電平有效時,Slave的SS接口直接接地也不影響通訊。當然了,實際應用中,如果要考慮到功耗等因素,處理起來或許就不那麼簡單了,具體問題具體分析。
  • 有的芯片SPI接口的SS信號,對電平敏感,通訊前確保SS是低電平就好;而有的SPI芯片的SS信號是下降沿敏感的。比如Maxim MAX1242 ADC,開始通訊前,需要SS信號有一個高→低的翻轉。
  • 多數SLAVE的MISO接口有三態輸出(高電平、低電平、高阻),當SS無效時,它們的MISO信號輸出高阻態(啥都沒接的狀態)。若SLAVE的MISO接口不支持高阻輸出,則無法應用於多SLAVE的SPI系統。
      當存在一個master、多個slave時(注意,當master上有n個SS時,對應可以連接n個slave),連接方式如下圖所示,注意SCLK/MOSI/MISO三個接口採取複用模式連接,不同SS單獨連接對應的slave,SS信號絕不可複用:
    在這裏插入圖片描述

四 SPI接口如何進行數據傳輸?

  SPI接口是一種典型的全雙工接口,通過同步時鐘SCLK的脈衝將數據一位位地傳送。所以在開始通訊前,master首先要配置接口時鐘(確定其通訊頻率是SLAVE可以支持的,通常爲數兆赫茲)。
  當MASTER片選一個SLAVE時,每向SLAVE發送一個週期的SCLK信號,都會有1bit的數據從MOSI發送至slave,與此同時,slave每收到一個週期的SCLK信號,都會從MISO向master發送1bit的數據。這種全雙工通訊,是由硬件保證的(MASTER與HOST中各有一個移位寄存器作爲收發數據的緩存)。
  SPI是一個很開放的接口,指令解析、幀大小、LSB/MSB(Least Significant Bit/Most Significant Bit)等規則並沒有一個完善的定義,不同的SPI設備在這些方面的定義會有不同:
  不同於SD等接口的嚴謹的command定義,SPI接口的master與slave之間的命令、數據解析都可以自定義,只要保證master與slave之間採用相同的規則就好。
  不同SPI芯片,每次連續傳輸的數據量的大小(取決於MASTER、SLAVE中緩存最小的那個)常常不同。當一次連續通訊的的數據量超過幀的大小時,會出現數據丟失的現象。所以,每完成1幀的傳輸後,MASTER會停止接口時鐘輸出,master、slave讀取、處理收到的數據,然後進行下一幀的傳輸。
  在SPI接口協議中,並沒有中斷的定義,但是實際應用中,我們可以使用接口中斷提高接口通訊速度。比如SLAVE是負責數據數據加解密的,MASTER下發一組明文給SLAVE加密,如果此時有個SLAVE輸出到MASTER的中斷信號,那麼MASTER可以清楚的知道何時SLAVE完成了數據處理並讀出處理結果,不必通過查詢一遍遍的等待結束。

五 SPI接口的變形

  以上我們講的SPI接口,一個時鐘週期可以進行全雙工的1bit數據通訊。實際應用中,如果對於全雙工的需求不高,而且期望提高通訊速度的話,SPI有兩種常見變形可供選用:

1 兩線模式的SPI

  CLK與SS信號保持不變,MOSI與MISO則變形爲DATA_0與DATA_1。
  DATA_0與DATA_1是輸入輸出狀態由MASTER配置的數據管腳:當MASTER打算向SLAVE中寫數據時,處於輸出狀態;當MASTER打算從SLAVE讀數據時,處於輸入狀態。

2 四線模式的SPI

  CLK與SS信號保持不變,MOSI與MISO刪除,新增四條數據線DATA0~3。
  DATA0_~3是輸入輸出狀態由MASTER配置的數據管腳:當MASTER打算向SLAVE中寫數據時,處於輸出狀態;當MASTER打算從SLAVE讀數據時,處於輸入狀態。
  這樣一來,大大提高了單方向上數據傳輸的速度,但是增加了接口資源的開銷。

六 SPI接口時序配置

  此部分參考crifan的博客。
  SPI的接口時序配置由兩個參數決定:
  1、 CPOL,clock polarity,譯作時鐘極性。
  2、 CPHA,clock phase,譯作時鐘相位。
  CPOL具體說明:
  CPOL用於定義時鐘信號在空閒狀態下處於高電平還是低電平,爲1代表高電平,0爲低電平。
  知道這些就好,很簡單的一個概念 。如果存在疑問,結合下面的時序圖理解就好。
  CPHA具體說明:
  首先,在同步接口中,肯定存在一個接口時鐘,用來同步採樣接口上數據的。
  CPHA就是用來定義數據採樣在第幾個邊沿的。爲1代表第二個邊沿採樣,爲0代表第一個邊沿採樣。
  以上兩個參數,總共有四種組合:
  MODE 0: CPOL=0, CPHA=0 ,CLK限制狀態爲低電平,第一個邊沿採樣,所以是上升沿採樣。
  MODE 1: CPOL=0, CPHA=1,CLK限制狀態爲低電平,第二個邊沿採樣,所以是下降沿採樣。
  MODE 2: CPOL=1, CPHA=0 ,CLK限制狀態爲高電平,第一個邊沿採樣,所以是下降沿採樣。
  MODE 3: CPOL=1, CPHA=1 ,CLK限制狀態爲高電平,第二個邊沿採樣,所以是上升沿採樣。
  具體見下圖。
  注意,假設是上升沿採樣,那麼MISO/MOSI就應該上升沿翻轉,這樣錯開半個時鐘週期以保證建立時間保持時間。
  忘了這個的建議去翻翻數電。
在這裏插入圖片描述
  由於SPI缺乏一個統一的規範,所以在時序描述上存在一定的差異性。CPOL與CPHA的定義,有些芯片DATASHEET中描述與通用的規則是相反的,所以選型時候一定要以DATASHEET中的時序圖爲準。
  另外,某些芯片上,關於SPI接口時序不使用CPOL/CPHA進行定義,而是使用CKP和CKE進行定義,在此不再詳細解釋這兩個概念的意義(比較繞,這些參數看多了特容易混淆),建議直接參考時序圖。
  關於SPI時序的說明,之前我參考了crifan的博客,其中還有個問題待解決:
  對於CPOL和CPHA這四種模式,不同的模式之間,相對來說有何優缺點,比如是否哪種模式更穩定,數據更不容易出錯等等,還是不清楚。
  我這裏給出我的思考結果:
  首先是CPOL的選擇,我們從芯片設計角度開始談這個問題。首先,如果寄存器賦值時沒有特殊要求必須是下降沿觸發賦值時,我們會選擇上升沿觸發,且時鐘關閉時固定爲低電平。這樣一來,保證了時鐘關閉時漏電最小(低電平下沒有電壓差,減小了漏電流IDDQ,同時上升沿觸發也保證了來了時鐘能夠立刻採樣信號,快速響應)。當然了,如果要求寄存器下降沿採樣,那麼時鐘關閉時固定爲高電平了。
  借用此思想,對於CPOL的選擇,如果配置可以選擇的話,我建議參考MASTER與SLAVE接口IO的配置參數。如果兩邊都是上拉,那麼建議選擇CPOL爲1,這樣一來,當我們配置CPOL時,不會在接口上製造出一個下降沿(單SLAVE的應用場景下,SLAVE的片選有時會直接連接GND,而此時MASTER本不想通訊但是傳入了一個下降沿,SLAVE那邊區分不出來這是不是有效通訊);而且這樣在IO上的漏電也能有效控制(沒有電勢差,沒有電流)。如果一邊上拉一邊下拉,如果從功耗的角度考慮,建議選擇下拉電阻更小(漏電流更大)的IO的上下拉配置進行CPOL賦值。
  關於CPHA的選擇,我個人更傾向於使用CPHA配置爲1的狀態。此配置下,第一個時鐘沿驅動數據數據輸出,第二個時鐘沿驅動數據採樣,比較符合硬件上的使用習慣。
  當然了,這都是紙上談兵,很多時候時序類型的選擇還要結合芯片硬件條件、功能實現需求等問題考慮。
  註釋1:維基百科上SPI接口的詳細描述http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus

參考連接

什麼是Gain offset:https://www.xuan.idv.tw/wordpress/?p=2525

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章