wiringPi用戶手冊V001_第1頁
wiringPi用戶手冊V001_第2頁
wiringPi用戶手冊V001_第3頁
wiringPi用戶手冊V001_第4頁
wiringPi用戶手冊V001_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、wiri ngPi用戶手冊Deruiowirin gPi用戶手冊制作:Deruio 工作室時間:2014年8月24日版本:0.0.1硬件:Raspberry Pi Model B+軟件:Raspbia n版權聲明:本文內(nèi)容翻譯自http:/wiringP若需最新版本,請及時到網(wǎng)站查閱最新版本。2 / 31wiri ngPi用戶手冊Deruio版本號修訂時間修訂內(nèi)容0.0.12014824第一次發(fā)布3 / 31wiri ngPi用戶手冊Deruio目錄1 wiri ngPi 簡

2、介7.1.1 DevLib 簡介7.1.2 PiFace 簡介7.1.3 Gertboard 簡介8.1.4 wiri ngPi 擴展8.1.5 wiringPi 的安裝使用git工具離線安裝101.5.3 測試 wiringPi是否安裝成功 102 wiringPi 設置函數(shù)122.1 wiri ngPiSetup函數(shù)122.2 wiri ngPiSetupGpio函數(shù)122.3 wiri ngPiSetupPhys函數(shù)132.4 wiri ngPiSetupSys 函數(shù)133 wiringPi 核心函數(shù)133.1 pi nM ode 函數(shù)133.2 pullUp

3、D nCon trol函數(shù)143.3 digitalWrite函數(shù)143.4 pwmWrite 函數(shù)153.5 digitalRead函數(shù)153.6 an alogRead函數(shù)153.7 an alogWrite 函數(shù)154 Raspberry Pi 專用函數(shù) 164.1 digitalWriteByte 函數(shù)164.2 pwmSetMode函數(shù)164.3 pwmSetRa nge函數(shù)164.4 pwmSetClock函數(shù) 164.5 piBoardRev 函數(shù)1.74.6 wpiPi nToGpio 函數(shù)174.7 physP in ToGpio 函數(shù)174.8 setPadDrive 函數(shù)

4、1.75 I2C 庫185.1 wiri ngPil2CSetup函數(shù)185.2 wiri ngPil2CRead函數(shù)195.3 wirin gPil2CWrite函數(shù)195.4 wiringPil2CWriteReg8 和 wiringPil2CWriteReg16 函數(shù)195.5 wiringPil2CReadReg8 和 wiringPil2CReadReg16 函數(shù)196 SPI 庫206.1 int wiri ngPiSPISetup 函數(shù)206.2 wiri ngPiSPIDataRW函數(shù)207串口庫217.1 serialOpe n函數(shù)217.2 serialClose函數(shù)217

5、.3 serialPutchar 函數(shù)217.4 serialPuts 函數(shù)227.5 serialPri ntf 函數(shù)227.6 serialDataAvail 函數(shù)227.7 serialGetchar 函數(shù)227.8 serialFlush 函數(shù)227.9高級串口控制 238軟件PWM庫238.1 softPwmCreate函數(shù)248.2 softPwmWrite 函數(shù)249時間函數(shù)259.1 millis 函數(shù)259.2 micros 函數(shù)259.3 delay 函數(shù)269.4 delayMicroseconds函數(shù)2610優(yōu)先級/時間/線程2610.1 piHiPri 函數(shù)2.610

6、.2 waitForI nterrupt 函數(shù)2710.3 wiri ngPilSR函數(shù)2810.4 piThreadCreate 函數(shù)2810.5 piLock 禾口 piUnlock 函數(shù)2911轉換庫3011.1 shiftI n 函數(shù)3011.2 shiftOut 函數(shù) 3012軟件音頻庫3012.1 softT on eCreate函數(shù)31softTo neWrite函數(shù)317 / 31wiri ngPi用戶手冊Deruio1 wiri ngPi簡介wiringPi庫是由Gordon Henderson 所編寫并維護的一個用 C語言寫成的類庫。

7、起初, 主要是作為BCM2835芯片的GPIO庫。而現(xiàn)在,已經(jīng)非常豐富,除了 GPIO庫,還包括了 I2C庫、SPI庫、UART庫和軟件 PWM 庫等。由于其與Arduino 的"wiring ”系統(tǒng)較為類似,故以此命名。它是采用GNU LGPLv3許可證的,可以在 C或C+上使用,而且在其他編程語言上也有對應的擴展。wiringPi庫包含了一個命令行工具 gpio,它可以用來設置 GPIO管腳,可以用來讀寫GPIO管腳,甚至可以在 Shell腳本中使用來達到控制GPIO管腳的目的。1.1 DevLib 簡介DevLib是wiringPi的一部分,它可以讓您更方便的使用一些流行的外部

8、設備。它支持的設備包括基于日立 HD44780U 芯片的LCD顯示屏和通用12864H 驅動芯片的128x64 像素的顯示屏。同時,也支持DS1302 RTC 時鐘芯片、基于Maxdetect 芯片(如RHT003) 的Gertboard 板和PiFace接口板等等。1.2 PiFace 簡介wiringPi對PiFace板子提供完全的支持,這里所講的PiFace板子是PiFace控制和顯示板,如下圖:通過使用PiFace板子,你可以不使用鍵盤和鼠標,僅通過遙控器即可控制樹莓派。此外,PiFace 的官網(wǎng)還提供其他的樹莓派外圍設備,具體可以訪問.uk/

9、。1.3 Gertboard 簡介Gertboard 是由Gert van Loo所開發(fā)的一款樹莓派的擴展板,它可以檢測和輸出模擬電壓、驅動電機和檢測按鍵等。1.4 wiri ngPi擴展Gadgetoid 提供了 Ruby、Perl 和 Python 的擴展,地址: ngPiJeroen Kransen 提供了 Java的擴展,地址: nsen /framboosDave Boult on 提供了 TCL的擴展,地址: ngPi-TclPi4J是另外一個使用 wiringPi的Java擴展,地址:1.5 wiri ngPi的安裝1.5.1 使用git工具如果您尚未安裝git工具,在Raspb

10、ian系統(tǒng)中,可以執(zhí)行如下的命令來安裝 git工具:sudo apt-get in stall git-core如果您安裝時,發(fā)生了某些錯誤,可以嘗試更新apt庫,命令如下:sudo apt-get update或者可能需要對系統(tǒng)進行更新,命令如下:sudo apt-get upgrade安裝git工具之后,就可以使用如下的命令來獲取wiringPi 了:git clone git:/如果您之前已經(jīng)使用過git的clone操作了,那么可以直接下載 wiringPi ,而不用再次clone,命令如下:git pull origi n上面的命令,將會為您獲取到wiringPi的最新版本,接下來,就

11、要編譯和安裝wiringPi 了,命令如下:cd wiri ngPi./build新的編譯腳本將會編譯和安裝wirin gPi到系統(tǒng)中,您不需要再進行其他設置。編譯腳本使用到了 sudo命令,所以,如果有必要,您可以在運行編譯腳本前,進行檢查。1.5.2離線安裝訪問下面的鏈接:https:/git.drogo n.n et/?p=wiri ngPi;a=summary將會打開如下的頁面:Gordons Pmiucts> PedTnpLevEl GIT/ wiri ngPi / smnniaTyffuimary 1 :shotloE 1 Lof 1 cowiit 1 coMitdiff 1

12、 "tree點擊齡上方的snapshot.圉為 它枕表的是帚新的版本KdescriptionwitinEPi 一 A 卩屮iriLUfi' like libtaEy for the Raspberry PiXDMnerGITXLat changeFri, IS Jul 2014 Q5t23;51 fflOO (22s23 +0100)Xjr'kicirt 1 口恭、nadcl 9, r.:曲恥1,2014-7-17men#2眄盼尉2M-05-2&Sorddncfisrdfc/t 屜曲nffisn2013-07-2&石口rdbn jfeufrcnPard

13、on 廉打和"anjiiTler + 口 jruppart. , & auf laukizltu.Fixed a bue in the 巴pio rcadall conand anUpdated Bost ly tn +h.c jpin rE9kdliLl 1 EDBBiuidFijcud abtlR. in thB 1SR *t(i>d» vhaxe itBujipcd ?ersion to 2. 15ltp>dates for the Hnspnerry Pi iCo>>pute lodule clhanfcs.- chiU3<&#

14、171;d to pxn mu dlei t u supp 口it a of IPvhAdded sone tweaks to 卵io> to set all nodes on pins. r Bim.pr:d ivierio'nIt helps jL£ you. add the -fHes intu CITa .Rinar chanes to the files and removed a bit of dsbueetrnhij.wnl| 詳 WLbiL:fF I| 亡 f L1占 ifFI eEELl.dli.:EF| 亡 tflGLlELfFI CHlLtdLff

15、I列上戸比魂 | 融HWplhdl. I £ntp£hol | 三 D.町MbiM. | nAnk1!I盂11沖訪01I SDlkPShiI ecnriLldlLffI EUkpstlDl然后,你會下載到一個.tar.gz的壓縮包,名子可能為wiringPi-df45388.tar.gz ,由于不同的發(fā)行版本,后面的 df45388字符串可能會不同。下載完成后,你可以執(zhí)行下面的命令來安裝wiringPi :tar xfz wiri ngPi-df45388.tar.gzcd wirin gPi-df45388./build請注意,實際的文件名可能會不同,因此需要做相對的改變

16、。1.5.3測試wiringPi是否安裝成功打開命令終端,可以通過gpio命令來檢查 wiringPi是否安裝成功,運行下面的命令:gpio gpio readall運行第一條命令后,您可能得到如下的輸出結果:piraspberrypi :-/pi codE/VH id ngp$ gpi o 一v gpio version: 2.20匚opyright (c) 2012-2014 Gordon HendersonThis is free software with ABSOLUTELY NO WARRANTY.For details type: gpio -warrantyRaspberry

17、Pi Details:Type: Model B+ T Revlsi on: 1.2, Memory: 512me, Maker: Sony運行第二條命令,你可以獲取wiringPi與樹莓派的GPIO接口之間的對應關系,如下圖:14 / 31wiri ngPi用戶手冊Deruio# / 31wiri ngPi用戶手冊Deruiopira5pberrypi :*/picode wir igp-ia readl 1B P LJ5_+ViI v | Physi cal I v | Mode I Name | wPi卜i&

18、amp;. i ib, iiiS4 fti. iS.3- JV125v2SDA. 1ALTO345V3SCL.1ALTO156Ov斗GPIO. 7IN078ALTOTXD1514Ov1g10ALTORXD1615170GPIO. 0IN1112INGPIO. 11IB272CPIO- 2IN1314Ov223GPIO. 3IN1516GINGPIO. 44233- 3v17180INGPIO* 55I 241012MOSIALTO1920Ov13MISOALTO2122INGPIO* 62511145CLKALTO2324AL TOCEOEOv2526ALTOCE17030SDA.OALTO0

19、2728ALT'OSCL, 01521GPIO.21IN02930Ov622GPIO.22IN0JI320INGPIO. 2626121323GPIO. 23IN03334Ov1924GPIO.24IN01536INGPIO.27272625GPIO. 25IN0173SINGPIO*2fi28Ov3940INGPIO. 2929| 21v | Physical | v Mode I Namebcm | wPi I Name | ModeBCME4 SLK.iK, iBi1S4SiiK.I&4IB,bcm I wPi I Name | Mode上圖中的Physical列即代表樹

20、莓派物理上接口J8的管腳定義,wPi列即代表在wiringPi中所對應的數(shù)值,BCM列即代表在 BCM2835 的GPIO寄存器中的偏移地址,即在BCM2835 C Library 中對應的 GPIO的數(shù)值。wiri ngPi已經(jīng)安如果上述兩條命令,您均能得到類似于上圖中的輸出結果,證明您的裝成功了。2 wiri ngPi設置函數(shù)有四個函數(shù)來對 wiri ngPi進行初始化,它們是:int wiri ngPiSetup(void);int wiri ngPiSetupGpio(void);int wiri ngPiSetupPhys(void);int wiri ngPiSetupSys(vo

21、id);您的程序在開始需要調(diào)用上面的一個函數(shù)來進行初始化,否則,您的程序可能不能正常工作。在wiringPi的v1版本中,如果無論何種原因,這些函數(shù)執(zhí)行失敗,將會返回一個錯誤 代碼。v2版本中,一直會返回0。再和許多wiringPi的用戶進行討論后,很多人并不在意檢查返回值,如果這些設置函數(shù)返回失敗,那么就應該停止程序的執(zhí)行。如果您想使用v1版本,您需要設置一個環(huán)境變量,其名為WIRINGPI_CODES。它的值可以是任何值,只要這個環(huán)境變量存在即可。2.1 wiri ngPiSetup 函數(shù)該函數(shù)初始化 wiringPi,并假定程序將使用wiringPi的管腳定義圖。具體管腳映射,可以通過g

22、pio readall命令來查看。該函數(shù)需要root權限。2.2 wiri ngPiSetupGpio 函數(shù)該函數(shù)與wiringPiSetup函數(shù)類似,區(qū)別在于假定程序使用的是Broadcom 的GPIO 管腳定義,而沒有重新映射。該函數(shù)需要root權限,需要注意 v1和v2版本的樹莓派是不同的。2.3 wiri ngPiSetupPhys函數(shù)該函數(shù)與wiringPiSetup函數(shù)類似,區(qū)別在于允許程序使用物理管腳定義,僅支持P1接口。該函數(shù)需要root權限。2.4 wiri ngPiSetupSys函數(shù)該函數(shù)初始化wiringPi,使用/sys/class/gpio 接口,而不是直接通過操作

23、硬件來實現(xiàn)。 該函數(shù)可以使用非root權限用戶,在此種模式下的管腳號是Broadcom 的GPIO管腳號,與wiringPiSetupGpio函數(shù)類似,需要注意v1和v2板子的不同。在此種模式下,在運行程序前,您需要通過/sys/class/gpio 接口導出要使用的管腳。你可以在一個獨立的 shell腳本中來導出將要使用的管腳,或者使用系統(tǒng)的system()函數(shù)來 調(diào)用gpio命令。3 wiri ngPi核心函數(shù)這些函數(shù)可以直接在樹莓派上使用,也可以在外部 GPIO模塊上使用。并不是所有的模塊都支持所有函數(shù),如PiFace預配置了固定的輸入和輸出管腳,并且樹莓派板上并沒有硬件上的模擬管腳。3

24、.1 pi nM ode函數(shù)該函數(shù)的原型為:void pinM ode(i nt p in, i nt mode);使用該函數(shù)可以將某個管腳設置為INPUT (輸入)、OUTPUT (輸出)、PWM_OUTPUT(脈沖輸出)或者 GPIO_CLOCK ( GPIO時鐘)。需要注意的是僅有管腳 1 ( BCM_GPIO 18)支持PWM_OUTPUT 模式,僅有管腳 7 (BCM_GPIO 4 )支持 CLOCK輸出模式。在Sys模式下,這個函數(shù)沒有影響。你可以通過調(diào)用gpio命令在shell腳本中來設置管腳的模式。3.2 pullUpD nCo ntrol函數(shù)該函數(shù)的原型為: void pul

25、lUpD nCon trol(i nt pi n, i nt pud);使用該函數(shù)可以設置指定管腳使用上拉或者下拉電阻模式,通常當需要管腳作為輸入引腳時,需要設定此項。不同于Arduino ,BCM2835有內(nèi)部上拉和下拉電阻,這兩種模式。參數(shù)pud可以為PUD_OFF (無上拉或下拉電阻)、PUD_D0WN (內(nèi)部下拉至地線)或者PUD_UP (內(nèi)部上拉至 3.3V )。在樹莓派上,內(nèi)部上拉和下拉電阻有接近50K Qo該函數(shù)在Sys模式下無作用。如果你需要激活上拉或下拉電阻的話,在啟動程序前,可以通過在腳本中調(diào)用 gpio命令來實現(xiàn)。3.3 digitalWrite 函數(shù)該函數(shù)的原型為: v

26、oid digitalWrite(i nt pi n, i nt value);使用該函數(shù)可以向指定的管腳寫入HIGH (高)或者LOW (低),寫入前,需要將管腳設置為輸出模式。wiringPi將任何的非0值作為HIGH (高)來對待,因此,0是唯一能夠代表LOW (低) 的數(shù)值。3.4 pwmWrite 函數(shù)該函數(shù)的原型為:void pwmWrite(i nt pi n, i nt value);使用該函數(shù)可以將值寫入指定管腳的PWM寄存器中。樹莓派板上僅有一個 PWM管腳,即管腳1( BCM_GPIO 18 ,物理管腳號為12 )??稍O置的值為 01024,其他PWM 設備可能有不同的

27、PWM范圍。當在Sys模式時,該函數(shù)不可用來控制樹莓派的板上PWM 。3.5 digitalRead 函數(shù)該函數(shù)的原型為:void digitalRead(i nt pi n);使用該函數(shù)可以讀取指定管腳的值,讀取到的值為HIGH( 1 )或者LOW( 0),該值取決于該管腳的邏輯電平的高低。3.6 an alogRead函數(shù)該函數(shù)的原型為:int an alogRead(i nt pi n);該函數(shù)返回所指定的模擬輸入管腳的值。你需要注冊額外的模擬模塊來啟用該函數(shù),比如 Gertboard , quick2Wire 模擬板等。3.7 an alogWrite函數(shù)該函數(shù)的原型為:void an

28、 alogWrite(i nt pin, i nt value);該函數(shù)將指定的值寫入到指定的管腳。你需要注冊額外的模擬模塊來啟用該函數(shù),比如Gertboard 等。18 / 31wiri ngPi用戶手冊Deruio4 Raspberry Pi專用函數(shù)這些函數(shù)并不是wiri ngPi的核心函數(shù)集中的函數(shù),但是,特定的適用于樹莓派。一些外部硬件驅動模塊可能也提供有一些與此相類似的函數(shù)。4.1 digitalWriteByte函數(shù)該函數(shù)的原型為:void digitalWriteByte(i nt value);該函數(shù)將一個8位的字節(jié)寫入到前 8個GPIO

29、管腳中。這是一次性設置8個管腳的最快的方法,盡管將會花費兩個寫入操作到樹莓派的GPIO硬件上。4.2 pwmSetMode函數(shù)該函數(shù)的原型為:void pwmSetMode(i nt mode);PWM 產(chǎn)生器可以運行在"balaneed ”(平衡)和"mark : space ”(標記和空格)模 式,后者是傳統(tǒng)的工作模式。然而,樹莓派的默認工作模式是“balaneed ”,你可以通過將mode 參數(shù)設置為 PWM MODE BAL 或者PWM MODE MS 來切換到不同的模式上。4.3 pwmSetRa nge函數(shù)該函數(shù)的原型為:void pwmSetRa nge( u

30、n sig ned int ran ge);該函數(shù)用來設置PWM發(fā)生器的范圍寄存器,它的默認值是1024.4.4 pwmSetClock函數(shù)該函數(shù)的原型為:void pwmSetClock(i nt divisor);該函數(shù)用來設置PWM時鐘的分頻值。19/31wiri ngPi用戶手冊Deruio需要注意的是,PWM控制函數(shù)在Sys模式下,是不可用的。要了解更多關于 PWM系 統(tǒng)的信息,請閱讀 Broadcom ARM外設手冊。4.5 piBoardRev 函數(shù)該函數(shù)的原型為:in t piBoardRev(void);該函數(shù)返回樹莓派的硬件版本,可能

31、為 1或者2.當從版本1到版本2時,一些 BCM_GPIO管腳號可能會有所改變,所以,如果你正在使用BCM_GPIO管腳號的話,你需要注意到這些。4.6 wpiPi nToGpio函數(shù)該函數(shù)的原型為:int wpiPi nToGpio(i nt wPiPi n);該函數(shù)返回所指定的 wiringPi管腳所對應的BCM_GPIO管腳號。需要考慮到不同的版 本中的wiringPi管腳定義的差別。4.7 physPi nToGpio函數(shù)該函數(shù)的原型為:in t physPi nToGpio(i nt physP in);該函數(shù)返回指定P1接口的物理管腳所對應的BCM_GPIO管腳號。4.8 setP

32、adDrive 函數(shù)該函數(shù)的原型為: void setPadDrive(i nt group, i nt value);該函數(shù)設置指定管腳組的驅動強度。樹莓派上共有3組管腳組,驅動強度的范圍為 07. 不用使用該函數(shù),除非你知道為什么要設置驅動強度。5 I2C 庫wiringPi包含了一個I2C庫,來讓您能夠更輕松的使用樹莓派的板上I2C接口。在使用I2C接口之前,您可能需要使用gpio命令來加載I2C驅動到內(nèi)核中:gpio load i2c如果你需要的波特率不是100Kbps ,那么您可以使用如下命令設置波特率為1000Kbps :gpio load i2c 1000使用I2C庫,需要包含

33、wiringPil2C.h文件。并且編譯時,同樣需要使用-lwiringPi來連接到wiringPi 庫。您仍然可以使用標準的系統(tǒng)命令來檢測I2C設備,如i2cdetect命令,需要注意的是,在v1版本的樹莓派上是 0,v2版本上是1,如下:i2cdetect 0 #Rev 1i2cdetect 1 #Rev 2當然,您也可以使用 gpio命令來調(diào)用i2cdetect命令,從而檢測I2C設備,這樣就不用在乎您的樹莓派版本了,如下:gpio i2cdetect5.1 wiri ngPil2CSetup 函數(shù)該函數(shù)的原型為:int wiri ngPil2CSetup(i nt devId);該函數(shù)

34、使用指定設備標示號來初始化I2C系統(tǒng)。參數(shù)devId是I2C設備的地址,可以通過i2cdetect命令可以查到該地址。該函數(shù)會獲取樹莓派的版本并依據(jù)此打開/dev目錄下對應的設備。返回值是標準的Linux文件句柄,如果有錯誤,則返回-1。比如,流行的 MCP23017 GPIO擴展器的設備ID是0x20,所以,你需要將這個數(shù)值傳遞給 wiringPil2CSetup()。5.2 wiri ngPil2CRead函數(shù)該函數(shù)的原型為:int wiri ngPil2CRead(i nt fd);簡單的設備讀操作。一些設備可以直接讀取,而不需要發(fā)送任何寄存器地址。5.3 wiri ngPil2CWri

35、te函數(shù)該函數(shù)的原型為:int wiri ngPil2CWrite(i nt fd, i nt data);簡單的設備寫操作。一些設備可以接受數(shù)據(jù),而不需要發(fā)送任何內(nèi)部寄存器地址。5.4 wiringPil2CWriteReg8禾口 wiringPiI2CWriteReg16函數(shù)該函數(shù)的原型為:int wiringPiI2CWriteReg8(int fd, int reg, int data);int wiringPiI2CWriteReg16(int fd, int reg, int data);使用這兩個函數(shù),可以寫一個 8位或16位數(shù)值到指定的設備寄存器。5.5 wiringPiI2C

36、ReadReg8禾口 wiringPil2CReadReg16函數(shù)該函數(shù)的原型為:int wiringPiI2CReadReg8(int fd, int reg);int wiringPiI2CReadReg16(int fd, int reg);使用這兩個函數(shù),可以從指定的設備寄存器讀取一個8位或16位的數(shù)值。6 SPI 庫wiringPi庫包含一個更易使用的SPI庫,來幫助您使用樹莓派上的板上SPI接口。在使用SPI接口前,你需要使用gpio命令來加載SPI驅動到內(nèi)核中:gpio load spi如果您需要的緩沖區(qū)大于4KB,需要在命令行進行指定緩沖區(qū)的大小,單位是KB:gpio load

37、 spi 100上述命令將會分配100KB的緩沖區(qū).(您可能很少需要改變這項設置,默認值對于絕大多數(shù)應用程序來說已經(jīng)足夠了).為了使用SPI庫,你也需要在你的程序中添加如下語句:#i nclude <wiri ngPiSPI.h>程序在編譯連接時,仍然需要添加-lwiri ngPi選項。6.1 int wiri ngPiSPISetup函數(shù)該函數(shù)的原型為:int wiri ngPiSPISetup( int cha nn el, i nt speed);使用該函數(shù)可以初始化一個SPI通道,樹莓派有兩個 SPI通道(0和1 )。speed參數(shù)是一個整數(shù)值,其范圍為5000003200

38、0000 ,代表SPI時鐘速度,單位是 Hz。返回值是一個標準的 Linux設備文件描述符,若返回值為-1,則失敗。若失敗,可以使用標準errno全局變量來查看失敗原因。6.2 wiri ngPiSPIDataRW函數(shù)該函數(shù)的原型為:int wiringPiSPIDataRW(intchannel, unsigned char* data, int len);該函數(shù)執(zhí)行一個同時讀寫操作,通過選定的SPI總線。緩沖區(qū)中的數(shù)據(jù),將會被 SPI總線的返回數(shù)據(jù)所覆蓋。若需要簡單的讀寫操作,可以使用標準的系統(tǒng)函數(shù):read()和write()。7串口庫wiringPi包含了一個簡單的串口處理庫。使用它可

39、以操作板上的串口或者USB串口設備,這兩者并無特殊的差別。只需要在初始化函數(shù)中指定設備名稱即可。為了能夠正常使用串口庫,您的程序必須包含下面的文件:#in clude <wiri ngSerial.h>7.1 serialOpe n函數(shù)該函數(shù)的原型為:int serialOpe n( char* device, i nt baud);該函數(shù)會初始化并打開串口設備,同時設置通訊的波特率。默認將端口設置為“raw ”模式(字符未經(jīng)過轉換),并且讀超時為10秒。返回值是一個文件描述符,如果失敗的話, 返回值為-1,這種情況下,將會依據(jù)不同的失敗原因來設置errno變量。7.2 seria

40、lClose 函數(shù)該函數(shù)的原型為:void serialClose(i nt fd);使用指定的文件描述符關閉設備。7.3 serialPutchar 函數(shù)該函數(shù)的原型為:void serialPutchar(i nt fd, un sig ned char c);將單個字節(jié)寫入指定設備的文件描述符。7.4 serialPuts 函數(shù)該函數(shù)的原型為:void serialPuts(i nt fd, char* s);該函數(shù)將一個以0結尾的字符串寫入指定設備的文件描述符。7.5 serialPri ntf函數(shù)該函數(shù)的原型為:void serialPri ntf(int fd, char* mes

41、sage, );與系統(tǒng)的printf函數(shù)類似,區(qū)別在于將內(nèi)容寫入到了串口設備。7.6 serialDataAvail函數(shù)該函數(shù)的原型為:int serialDataAvail(i nt fd);返回等待讀取的字符數(shù),如果發(fā)生錯誤,則返回-1,此種情況下,errno將會被設置為錯誤發(fā)生原因。7.7 serialGetchar函數(shù)該函數(shù)的原型為:int serialGetchar(i nt fd);返回串口設備的下一個待讀取字符。如果沒有數(shù)據(jù),該函數(shù)將會等待10秒,10秒后若仍無數(shù)據(jù)則會返回-1.7.8 serialFlush 函數(shù)該函數(shù)的原型為:void serialFlush(i nt fd)

42、;拋棄所有已接收的數(shù)據(jù)或者等待寫入指定設備完成。7.9高級串口控制wiri ngSerial庫的目的是提供簡單的控制,對于大多數(shù)應用程序來說,已足夠。然而,如果您需要更高級的控制,比如校驗位等,那么你需要使用舊方法來設置。例如,需要設置數(shù)據(jù)位為7位、偶校驗,那么需要在程序中如下設置:#in clude <termios.h>在函數(shù)中,添加下面的代碼:struct termios opti ons;tcgetattr(fd, &opti on s);opti on s.c_cflag &= CSIZE;opti on s.c_cflag |= CS7;options.

43、c_cflag |= PARENB;tcsetattr(fd, &opti on s);上面代碼中的變量 fd,即是serialOpen()函數(shù)的返回值。如果需要更多關于tcgetattr的信息,可以使用 man tcgetattr 命令。8軟件PWM庫wiringPi中包含了一個軟件驅動的PWM 處理庫,可以在任意的樹莓派GPIO上輸出PWM信號。但是,也有一些限制。為了維護較低的CPU使用率,最小的脈沖寬度是 100微秒,結合默認的建議值為 100,那么最小的PWM頻率是100Hz。如果需要更高的頻率,可以使 用更低的數(shù)值。如果看脈沖寬度的驅動代碼,你會發(fā)現(xiàn)低于100微秒,wiri

44、ngPi是在軟件 循環(huán)中實現(xiàn)的,這就意味著CPU使用率將會動態(tài)增加,從而使得控制其他管腳成為不可能。需要注意的是,當其他程序運行在更高的實時的優(yōu)先級,Linux可能會影響產(chǎn)生信號的精度。盡管有這些限制,控制LED或電機還是可以的。使用前,需要包含相應的文件:#in clude <wiri ngPi.h>#in clude <softPwm.h>當編譯程序時,必須加上pthread 庫,如下:gcc -o myprog myprog.c-wiringPi-pthread必須使用 wiringPiSetup()、wiringPiSetupGpio() 或者 wiringPi

45、SetupPhys()函數(shù)來初始化wiringPi。wiringPiSetupSys()是不夠快的,因此,必須使用sudo命令來運行程序。一些外部擴展模塊有可能足夠快的處理軟件PWM,在MCP23S17 GPIO擴展器上已經(jīng)測試通過了。8.1 softPwmCreate 函數(shù)該函數(shù)的原型為:int softPwmCreate( in t p in, i nt in itialValue, i nt pwmRa nge);該函數(shù)將會創(chuàng)建一個軟件控制的PWM 管腳??梢允褂萌魏我粋€GPIO管腳,pwmRange 參數(shù)可以為 0 (關)100 (全開)。返回值為0,代表成功,其他值,代表失敗。8.2

46、 softPwmWrite 函數(shù)該函數(shù)的原型為: void softPwmWrite(i nt pi n, in t value);該函數(shù)將會更新指定管腳的 PWM值。value參數(shù)的范圍將會被檢查,如果指定的管腳之前沒有通過softPwmCreate初始化,將會被忽略。9時間函數(shù)盡管Linux系統(tǒng)提供了很多系統(tǒng)函數(shù)來實現(xiàn)定時和休眠,但是,有時使用起來會感覺到非常容易混淆,特別對于Linux新手來說。因此,為了方便使用,特意從 Arduino 平臺移植了代碼。需要注意的是,盡管你沒有使用任何的輸入或輸出函數(shù),你仍然需要調(diào)用wiri ngPi中的設置函數(shù)來進行初始化操作。如果你的程序中不需要ro

47、ot權限,你可以僅僅使用wiri ngPiSetupSys函數(shù),不要忘記加上 #i nclude <wiri ngPi.h> 。9.1 millis 函數(shù)該函數(shù)的原型為:un sig ned int millis(void);該函數(shù)返回從調(diào)用 wiringPiSetup函數(shù)后的毫秒數(shù)。返回值是一個無符號32位整數(shù)。在49天后,將會溢出。9.2 micros 函數(shù)該函數(shù)的原型為:un sig ned int micros(void);該函數(shù)返回從調(diào)用 wiringPiSetup函數(shù)后的微秒數(shù)。返回值是一個無符號32位整數(shù),在接近71分鐘后,將會溢出。9.3 delay 函數(shù)該函數(shù)的原

48、型為:void delay (un sig ned int howL on g);該函數(shù)將會中斷程序執(zhí)行至少howLong 毫秒。因為Linux是多任務的原因,中斷時間可能會更長。需要注意的是,最長的延遲值是一個無符號32位整數(shù),其大約為 49天。9.4 delayMicrosec on ds函數(shù)該函數(shù)的原型為:void delayMicrosec on ds( un sig ned int howL on g);該函數(shù)將會中斷程序執(zhí)行至少 howLong微秒。因為Linux是一個多任務的系統(tǒng),因此 中斷時間可能會更長。需要注意的是,最長的延遲值是一個無符號 32位整數(shù),其大約為71 分鐘。延

49、遲低于100微秒,將會使用硬件循環(huán)來實現(xiàn);超過 100微秒,將會使用系統(tǒng)的 nano sleep() 函數(shù)來實現(xiàn)。10優(yōu)先級/時間/線程wirin gPi提供一些函數(shù)來允許程序管理優(yōu)先級和從程序內(nèi)部啟動新線程。線程將會和主程序一同運行,可以用作不同的用途。要了解更多關于線程的知識,可以搜索“PosixThreads ”關鍵字。10.1 piHiPri 函數(shù)該函數(shù)的原型為:in t piHiPri(i nt priority);該函數(shù)會將程序(或多線程程序中的線程)移動到一個更高的優(yōu)先級,并且會開啟實時 調(diào)度功能。priority參數(shù)可以為099,0為默認值,99為最大值。更改優(yōu)先級并不會讓程序

50、運行更快,但是當其他程序正在運行時,會給其一個更大的時間片。優(yōu)先級參數(shù)可以與其他線程同時工作,因此,可以將一個程序設置為優(yōu)先級1,其他的設置為優(yōu)先級2,這與設置一個優(yōu)先級為10和另一個優(yōu)先級為90是同樣的效果(只要沒有其他程序有更高的優(yōu)先級)。該函數(shù)返回0代表執(zhí)行成功,返回-1代表執(zhí)行失敗。如果返回錯誤,程序可以通過查 看全局變量errno來得到失敗原因。需要注意的是,只有作為root權限運行的程序才能改變其優(yōu)先級。如果是非root權限,則沒有任何改變。10.2 waitForl nterrupt 函數(shù)該函數(shù)的原型為:int waitForInterrupt(int pin, int time

51、out);當調(diào)用該函數(shù)后,程序會一直在指定的管腳等待中斷事件的發(fā)生。 timeout參數(shù)的單位 是毫秒,其值為-1,代表永遠等待。如果有錯誤發(fā)生,函數(shù)將會返回-1.如果超時,將會返回0,如果等待中斷事件成功,將會返回1.在調(diào)用waitForInterrupt函數(shù)前,首先必須初始化GPIO管腳。可以通過在腳本或使用system。函數(shù)來調(diào)用gpio命令來實現(xiàn)。例如,在GPIO管腳0上等待一個下降沿中斷,可以使用如下的命令來設置硬件參數(shù):gpio edge 0 falli ng當然,上述命令需要在運行程序前執(zhí)行。10.3 wiri ngPilSR函數(shù)該函數(shù)的原型為:int wiringPilSR(i

52、nt pin, int edgeType, void (*function)(void);該函數(shù)會在指定管腳注冊一個中斷事件的函數(shù),當指定管腳發(fā)生中斷事件時,會自動調(diào)用該函數(shù)。edgeType 參數(shù)可以為 INT_EDGE_FALLING (下降沿)、INT_EDGE_RISING (上 升沿)、INT_EDGE_BOTH (上升沿或者下 降沿)或者INT_EDGE_SETUP 。如果是 INT_EDGE_SETUP,將不會初始化該管腳,因為它假定已經(jīng)在別處設置過該管腳(比如使 用gpio命令),但是,如果指定另外的類型,指定管腳將會被導出并初始化。完成此操作 使用的是gpio命令,所以,必須

53、保證 gpio命令是可用的。這里的管腳號可以使用的模式有:wiringPi模式、BCM_GPIO 模式、物理或Sys模式。這個函數(shù)在所有的 GPIO模式均可正常工作,并且不需要root權限。注冊函數(shù)在中斷觸發(fā)時,將會被調(diào)用。在調(diào)用注冊函數(shù)前,中斷事件將會從分配器中清除,所以,即使有后續(xù)的觸發(fā)發(fā)生,在處理完之前,也不會錯過此次觸發(fā)。(當然,如果在正在處理觸發(fā)時,有不止一個的中斷發(fā)生,已經(jīng)發(fā)生的中斷將會被忽略)。這個函數(shù)將會運行在一個高的優(yōu)先級(如果程序使用sudo或者root用戶),并且與主程序同時執(zhí)行。它可以訪問全局變量、打開文件句柄等等。查看isr.c代碼,從而了解如何使用該函數(shù)。10.4 piThreadCreate 函數(shù)該函數(shù)的原型為:in t piThreadC

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論