官术网_书友最值得收藏!

1.2.1 pcDuino部分硬件功能介紹

1.I2C

I2C(Inter-Integrated Circuit)總線是由PHILIPS公司開發(fā)的兩線式串行總線,用于連接微控制器及其外圍設備,產(chǎn)生于20世紀80年代,最初的目的是進行音頻和視頻設備開發(fā),現(xiàn)在主要應用于服務器管理,包括單個組件狀態(tài)的通信。例如管理員可對各個組件進行查詢,以管理系統(tǒng)的配置和掌握組件的功能狀態(tài),如電源和系統(tǒng)風扇,可隨時監(jiān)控內(nèi)存、硬盤、網(wǎng)絡、系統(tǒng)溫度等多個參數(shù),增加了系統(tǒng)安全性,方便管理。由于接口直接在組件之上,因此I2C總線占用的空間非常小,減少了電路板的空間和芯片管腳的數(shù)量,降低了互聯(lián)成本,集中體現(xiàn)了I2C總線最主要的優(yōu)點——簡單和有效。

具體地說,I2C總線是由數(shù)據(jù)線SDA和時鐘SCL構成的串行總線,各種被控制器件均并聯(lián)在這條總線上,每個器件都有唯一的地址識別,可以作為總線上的一個發(fā)送器件或接收器件(具體由器件的功能決定)。I2C總線的接口電路結構如圖1-8所示。

圖1-8 I2C接口電路結構圖

I2C總線的幾種信號狀態(tài)具體分為以下幾種。

·空閑狀態(tài):SDA和SCL都為高電平。

·開始條件(S):SCL為高電平時,SDA由高電平向低電平跳變,開始傳送數(shù)據(jù)。

·結束條件(P):SCL為高電平時,SDA由低電平向高電平跳變,結束傳送數(shù)據(jù)。

·數(shù)據(jù)有效:在SCL的高電平期間,SDA保持穩(wěn)定,數(shù)據(jù)有效。SDA的改變只發(fā)生在SCL的低電平期間。

·ACK信號:數(shù)據(jù)傳輸?shù)倪^程中,接收器件每接收一個字節(jié)數(shù)據(jù)要產(chǎn)生一個ACK信號,向發(fā)送器件發(fā)出特定的低電平脈沖,表示已經(jīng)收到數(shù)據(jù)。

針對I2C總線的基本操作主要包括讀、寫及控制。主器件(通常為微控制器)控制I2C總線,產(chǎn)生串行時鐘(SCL)、控制總線的傳輸方向、產(chǎn)生開始和停止條件。數(shù)據(jù)傳輸過程中,主器件產(chǎn)生開始條件,隨后是器件的控制字節(jié)(前7位是從器件的地址,最后一位為讀寫位),接下來是讀寫操作的數(shù)據(jù),以及ACK響應信號。數(shù)據(jù)傳輸結束時,主器件產(chǎn)生停止條件。具體的過程如圖1-9所示。

圖1-9 I2C總線數(shù)據(jù)傳輸圖

通過分析I2C源碼可知,在drivers/I2C/目錄下,包含以下幾個重要文件和目錄。

1)文件I2C-core.c:I2C子系統(tǒng)核心功能的實現(xiàn)。

2)文件I2C-dev.c:通用的從設備驅(qū)動實現(xiàn)。

3)目錄busses:里面包括基于不同平臺實現(xiàn)的I2C總線控制器驅(qū)動,A20使用的源文件為I2C-sun7i.c。

在sys_config.fex中有5組I2C總線可供使用,分別是twi0、twi1、twi2、twi3和twi4。配置如下:

[twi0_para]
twi0_used=1
twi0_scl=port :PB0<2> <default>  <default> <default>
   twi0 _sda=port :PB1<2> <default> <default>  <default>
[twi1_para]
   twi1_used=1
   twi1_scl=port :PB18<2> <default> <default> <default>
   twi1_sda=port :PB19<2> <default> <default> <default>
[twi2_para]
    twi2_used=1
    twi2_scl=port :PB20<2> <default> <default> <default>
    twi2_sda=port :PB21<2> <default> <default> <default>
......

其中常用的為twi0、twi1、twi2,twi3與twi4使用時按照twi0等格式進行添加即可。

若使用哪一組I2C總線,將對應的twiX_used置為1即可。通常情況下,twi0、twi1、twi2均設置為1。

對于I2C總線控制器的配置,可通過命令make ARCH=arm menuconfig進入配置主界面,并按以下步驟操作:

1)選擇Device Drivers選項,進入下一級配置。

2)選擇I2C support選項,進入下一級配置。

3)選擇I2C HardWare Bus support選項,進入下一級配置。

4)選擇Allwinner Technology SUN7I I2C interface選項,可選擇直接編譯進內(nèi)核中,也可以選擇編譯成模塊,如圖1-10所示。

圖1-10 Allwinner Technology SUN7I I2C interface選項配置

此外,若需要獲取指定I2C總線控制器相關的調(diào)試打印信息,可選擇sun7i i2c print transfer information選項,并在bus num id選項中指定對應的I2C總線控制器編號,可輸入0、1、2和3、4,如圖1-11所示。

圖1-11 I2C總線控制器調(diào)試信息配置

2.I2C體系結構描述

位于drivers/I2C/busses目錄下的文件I2C-sun7i.c,是基于SUN7I平臺實現(xiàn)的I2C總線控制器驅(qū)動,功能是為系統(tǒng)中5條I2C總線實現(xiàn)相應的讀寫方法。控制器驅(qū)動自身不會進行任何的通信,而是等待其他設備驅(qū)動調(diào)用其函數(shù)。

如圖1-12所示是基于SUN7I平臺的I2C驅(qū)動層次架構圖,其中有5塊I2C adapter,分別對應SUN7I平臺上的5塊I2C控制器。

圖1-12 I2C驅(qū)動層次架構圖

系統(tǒng)開機時,I2C控制器驅(qū)動首先被裝載,I2C控制器驅(qū)動用于支持I2C總線的讀寫。在I2C_sun7i_algorithm結構體中定義了I2C總線通信方法函數(shù)I2C_sun7i_xfer(),該函數(shù)實現(xiàn)了對I2C總線訪問的具體方法。設備驅(qū)動通過調(diào)用這個函數(shù),實現(xiàn)對I2C總線的訪問;而在函數(shù)I2C_sun7i_probe()中完成了對I2C adapter的初始化。

I2C_adapter對應一個控制器。一個I2C控制器需要I2C_algorithm中提供的通信函數(shù)來控制控制器上產(chǎn)生特定的訪問周期。I2C_algorithm中的關鍵函數(shù)master_xfer()用于產(chǎn)生I2C訪問周期需要的信號,以I2C_msg(即I2C消息)為單位。I2C_msg是I2C傳輸?shù)幕締挝唬瑥脑O備的具體地址、消息的類型以及要傳輸?shù)木唧w數(shù)據(jù)信息。每個I2C消息傳輸前,都會產(chǎn)生一個開始位,緊接著傳送從設備。I2C_client對應于真實的物理設備,每個I2C設備都需要一個I2C_client來描述。I2C_driver對應一套驅(qū)動方法,其主要成員函數(shù)是probe()、remove()、suspend()、resume()等,另外id_table是該驅(qū)動所支持的I2C設備的ID表。I2C_driver與I2C_client的關系是一對多,一個I2C_driver上可以支持多個同等類型的I2C_client。

I2C常用接口如下所示:

·I2C_add_driver

·I2C_del_driver

·I2C_set_clientdata

·I2C_get_clientdata

·I2C_master_send

·I2C_master_send

·I2C_master_resv

·I2C_transfer

3.A20與LCD

A20有兩路顯示系統(tǒng),支持雙屏輸出,支持LCD屏的接口形式及最大分辨率如表1-1所示。

表1-1 LCD輸出I/O口

HVRGB接口和CPU/I80接口用于并行數(shù)據(jù)輸出,是TTL電平的屏接口,其中LCD0從PD口輸出,LCD1從PA口輸出。

LVDS接口用于串行輸出,是差分信號的屏接口,LVDS0從PD0~PD9輸出,LVDS1從PD10~PD19口輸出。

DSI接口使用A20+SSD2828的方式,通過A20的HV RGB接口輸出,由轉換IC轉成DSI接口。

如果一路輸出使用Dual Link LVDS,占用了LVDS的所有引腳,另外一路只能使用其他接口形式輸出。其他接口形式任意組合的雙屏輸出都支持。

以LVDS屏為例,LVDS屏接口分為Single Link和Dual Link兩種。LVDS屏使用LVDS差分信號,LVDS Single Link具有1組時鐘對和3組或4組數(shù)據(jù)對。

如圖1-13所示是一個典型LVDS Single Link屏的模組規(guī)格書的引腳定義。A20與該LCD屏的引腳連接如表1-2所示。

表1-2 LVDS Single Link顯示屏引腳定義

圖1-13 A20與LVDS Single Link顯示屏連接圖

該LCD屏有3組數(shù)據(jù)對,顯示要求為18bit色深,且不區(qū)分模式。故

lcd_lvds_colordepth=1,lcd_lvds_mode=0

該LCD屏參數(shù)如表1-3所示。時序參數(shù)配置與HVparallelRGB類似。區(qū)別于HVparallelRGB,該LCD屏參數(shù)沒有指定BackPorch和SyncWidth。根據(jù)A20時序要求,LCD控制器配置如下:

表1-3 LVDS Single Link顯示屏參數(shù)

·lcd_ht>lcd_x×cycle+lcd_hbp,得lcd_hbp<64。

·取lcd_hbp=20;lcd_hbp>lcd_hspw,取lcd_hspw=10。

·lcd_vbp=20,lcd_vspw=10。

LCD I/O必須配置為LVDS。

(1)LCD硬件參數(shù)

1)lcd_if為LCD接口選擇,參數(shù)值所對應的含義如下:

0——HVRGB接口;1——CPU/I80接口;2——Reserved;3——LVDS接口;4——DSI接口。

2)lcd_hv_if,這個參數(shù)只有在lcd_if=0時才有效,定義RGB同步屏下的幾種接口類型。設置相應值的對應含義如下:

0——ParallelRGB;8——SerialRGB;10——DummyRGB;11——RGBDummy。

3)lcd_hv_s888_if,這個參數(shù)只有在lcd_if=0且lcd_hv_if=1(SerialRGB)時才有效。定義奇數(shù)行RGB輸出的順序如下。

0: OddlinesR→G→B:EvenlineR→G→B
1: OddlinesB→R→G
2: EvenlineR→G→B OddlinesG→B→R
4: EvenlineR→G→B OddlinesR→G→B
5: EvenlineB→R→G OddlinesB→R→G
6: EvenlineB→R→G OddlinesG→B→R
8: EvenlineB→R→G OddlinesR→G→B
9: EvenlineG→B→R OddlinesB→R→G
10:OddlinesG→B→R:EvenlineG→B→R

4)lcd_hv_syuv_if,這個參數(shù)用來設置YUV輸出順序的,只有在lcd_if=0且lcd_hv_if=2(SerialYUV)時才有效。定義YUV輸出格式如下:

0——YUYV;1——YVYU;2——UYVY;3——VYUY。

5)lcd_cpu_if,只有在lcd_if=1時,即設置為CPU/180類型的接口,這個參數(shù)才有效。設置相應值的對應含義如下:

0——18bit/1cycle parallel(RGB666);4——16bit/1cycle parallel(RGB565);6——18bit/3cycle parallel(RGB666);7——16bit/2cycle parallel(RGB565)。

6)lcd_lvds_ch,設置相應值的對應含義如下:

0——Single Link;1——Dual Link。

LVDS接口的LCD屏,定義1組時鐘對+3/4組數(shù)據(jù)對,為1個link。若有2組時鐘對,則為兩個link。

7)lcd_lvds_bitwidth,設置相應值對應含義如下:

0——8bit per color;1——6bit per color。

8)lcd_lvds_mode,這個參數(shù)只有在lcd_lvds_bitwidth=0時才有效。設置相應值對應含義如下:

0——NS mode;1——JEDIA mode。

NS mode和JEDIA mode的定義如圖1-14所示。

圖1-14 LVDS JEDIA mode和NS mode

9)lcd_pin。

示例:lcdd0=port:PD00<3><0><default><default>

含義:lcdd0這個引腳,即PD0,配置為LVDS輸出。

第一個尖括號表示功能分配:0為輸入,1為輸出,2為LCD輸出,3為LVDS接口輸出,7為disable。

第二個尖括號表示內(nèi)置電阻:0表示內(nèi)部電阻高阻態(tài),如果是1則內(nèi)部電阻上拉,2代表內(nèi)部電阻下拉。使用default代表默認狀態(tài),即電阻上拉。其他數(shù)據(jù)無效。

第三個尖括號表示驅(qū)動能力:default表示驅(qū)動能力是等級1。

第四個尖括號表示默認值:即是當設置為輸出時,該引腳輸出的電平,0為低電平,1為高電平。

LCD PIN的配置如下:

LCD為HVRGB或DSI屏,CPU/I80屏時,必須定義相應的I/O口為LCD輸出(如果是0路輸出,第一個尖括號為2;如果是1路輸出,第一個尖括號為3)。

LCD為LVDS屏時,必須定義PD口對應的I/O口為LVDS輸出(即第一個尖括號為3)。

LCD PIN的所有I/O均可通過注釋方式去掉其定義,顯示驅(qū)動對注釋I/O不進行初始化操作。

10)lcd_gpI/O_x。

示例:lcd_gpI/O_0=port:PA06<0><0><default><default>

含義:lcd_gpI/O_0引腳為PA06。

第一個尖括號表示功能分配:0為輸入,1為輸出。

第二個尖括號表示內(nèi)置電阻:0內(nèi)部電阻高阻態(tài),如果是1則內(nèi)部電阻上拉,2就代表內(nèi)部電阻下拉。使用default代表默認狀態(tài),即電阻上拉。其他數(shù)據(jù)無效。

第三個尖括號表示驅(qū)動能力:default表示驅(qū)動能力是等級1。

第四個尖括號表示默認值:即是當設置為輸出時,該引腳輸出的電平,0為低電平,1為高電平。

A20配置中,共有6個可選的lcd_gpI/O引腳,lcd_gpI/O_0、lcd_gpI/O_1,lcd_gpI/O_2、lcd_gpI/O_3、lcd_gpI/O_4、lcd_gpI/O_5。

11)lcd_bl_en。

示例:lcd_bl_en=port:PH07<1><0><default><1>

含義:lcd_power引腳為PH07,PH07輸出高電平時打開LCD背光:上下拉不使能。

第一個尖括號表示功能分配:1為輸出。

第二個尖括號表示內(nèi)置電阻:0內(nèi)部電阻高阻態(tài),如果是1則內(nèi)部電阻上拉,2就代表內(nèi)部電阻下拉。使用default代表默認狀態(tài),即電阻上拉。其他數(shù)據(jù)無效。

第三個尖括號表示驅(qū)動能力:default表示驅(qū)動能力是等級1。

第四個尖括號表示輸出有效所需電平:LCD背光工作時的電平,0為低電平,1為高電平。

12)lcd_power。

示例:lcd_power=port:power2<1><0><default><1>

含義:LCD的供電定義gpI/O控制。

13)lcd_pwm。

示例:lcd_pwm=port:PB02<2><0><default><default>

含義:PB02輸出PWM信號。

A20方案固定PB02為PWM信號輸出引腳。建議使用此默認配置。

4.PWM

PWM(Pulse Width ModulatI/On,脈沖寬度調(diào)制)即脈寬調(diào)制,是一種脈沖編碼技術。一般PWM信號的周期不變,用占空比(有效電平在整個信號周期中的時間比率,為0%~100%)來表示編碼數(shù)值。PWM可以用于對模擬信號電平進行數(shù)字編碼方法,也可以通過控制高電平(或低電平)在整個周期中的時間來控制輸出的能量,從而控制電機轉速或LED亮度。

PWM控制技術以其控制簡單靈活和動態(tài)響應好的優(yōu)點成為電力電子技術中最廣泛應用的控制方式,也成為研究的熱點。當今科學技術的發(fā)展已經(jīng)模糊了學科界限,結合現(xiàn)代控制理論思想或無諧振波開關技術將會成為PWM控制技術發(fā)展的主要方向之一。如圖1-15所示為典型的PWM波形。

圖1-15 典型的PWM波形

PWM信號一般由計數(shù)器和比較器產(chǎn)生。計數(shù)器以一定的頻率自加,比較器中設定了一個閾值,當計數(shù)器中的數(shù)字小于這個閾值時,輸出一種電平狀態(tài)(如高電平);當數(shù)字大于這個閾值時,輸出另一種電平狀態(tài)(如低電平);當計數(shù)器計滿后清零,又回到最初的電平狀態(tài)。這樣通過I/O引腳的周期翻轉,就形成了PWM波形,如圖1-16所示。

圖1-16 產(chǎn)生PWM原理

pcDuino上的PWM信號如圖1-17所示。

圖1-17 pcDuino上的PWM

可用于輸出PWM信號的GPIO共有6個,其中GPIO3、9、10、11的PWM頻率為125Hz~2kHz,GPIO5、6的PWM頻率只能設置為195Hz、260Hz、390Hz、520Hz、781Hz中的某個特定值。Arduino庫中提供了analogWrite()函數(shù)來設置PWM占空比,增加了pwmfreq_set()函數(shù),用于設置PWM信號周期。5、6引腳為復用引腳。

5.G-Sensor

在人機交互過程中,G-Sensor起著非常重要的作用,G-Sensor作為輸入設備,能感知當前其所處的空間狀態(tài),將它附著在終端上配合使用,能測量出終端在空間上的坐標狀態(tài),從而獲知終端用戶的操作意圖,如橫豎屏切換、轉彎變向等。

通常G-Sensor通過4個引腳與主機連接,分別為VCC、GND、SDA、SCL。引腳正常工作時候的高電平均為3.3V。

在G-Sensor的硬件調(diào)試過程中,需要確認下列項:

1)各個引腳與HOST正確連接。

2)電源電壓是否正常,即VCC接入電壓為3.3V,GND電壓為0V。

3)I2C引腳電平是否匹配。

4)設備使用的I2C地址,特別是對一臺設備進行多個地址設置時。

(1)G-Sensor的體系結構(如圖1-18所示)

圖1-18 G-Sensor體系結構

G-Sensor設備為使用I2C總線進行通信的輸入設備,G-Sensor driver通過調(diào)用I2C驅(qū)動的相應接口來實現(xiàn)對G-Sensor設備的控制與通信,如G-Sensor driver對G-Sensor設備硬件和各寄存器的讀寫訪問等。

G-Sensor driver將底層硬件對用戶輸入訪問的響應轉換為標準的輸入事件,再通過核心層(Input Core)提交給事件處理層;核心層向下提供了G-Sensor driver的編程接口,向上又提供了事件處理層的編程接口。事件處理層(Input Event Drivers)為用戶空間的應用程序提供了統(tǒng)一訪問設備的接口,并對驅(qū)動層提交的事件進行處理;用戶空間(User space)將根據(jù)設備的節(jié)點進行數(shù)據(jù)的讀取以及相應的處理。

(2)模塊數(shù)據(jù)結構描述

1)struct I2C_driver bma250_driver:該變量會注冊到I2C_driver中,driver.name為匹配設備名,probe為設備的偵測函數(shù),address_list為I2C的偵測地址,suspend為休眠喚醒函數(shù)。

代碼清單1-1:bma250_driver注冊

static struct I2C_driver bma250_driver = {
.class = I2C_CLASS_HWMON,
.driver = {
.owner   = THIS_MODULE,
.name= SENSOR_NAME,
},
.id_table= bma250_id,
.probe= bma250_probe,
.remove= bma250_remove,
#ifdef CONFIG_HAS_EARLYSUSPEND
#else
#ifdef CONFIG_PM
.suspend = bma250_suspend,
.resume = bma250_resume,
#endif
#endif
.address_list = normal_I2C,
};

2)struct bma250_data:代表了G-Sensor驅(qū)動所需要的信息的集合,用于幫助實現(xiàn)對采樣信息的處理。

代碼清單1-2:struct bma250_data注冊

struct bma250_data {
struct I2C_client *bma250_client; 
atomic_t delay;
atomic_t enable;
unsigned char mode; 
struct input_dev *input; 
struct bma250acc value;
struct mutex value_mutex;
struct mutex enable_mutex; 
struct mutex mode_mutex;
struct delayed_work work;
struct work_struct irq_work;
#ifdef CONFIG_HAS_EARLYSUSPEND
struct early_suspend early_suspend;
unsigned char range_state;
unsigned char bandwidth_state;
#endif
};

3)struct bma250acc:用于記錄采樣時獲得的x軸、y軸、z軸的坐標信息。

代碼清單1-3:struct bma250acc注冊

struct bma250acc{ s16 x,
y,
z;
} ;
主站蜘蛛池模板: 永修县| 遂昌县| 桦甸市| 山东省| 元氏县| 房产| 新田县| 安达市| 海兴县| 长垣县| 阿鲁科尔沁旗| 曲沃县| 天祝| 尤溪县| 清水县| 胶南市| 永川市| 丰镇市| 芮城县| 舞阳县| 锦屏县| 大同市| 定州市| 磐安县| 尉氏县| 延吉市| 梁山县| 沙田区| 高雄市| 兴文县| 普安县| 丹巴县| 驻马店市| 蚌埠市| 南开区| 疏附县| 电白县| 大石桥市| 台中县| 大连市| 涟源市|