Raspberry Pi特殊的GPIO衝突:1-wire,pifm,PWM

Raspberry Pi提供了26個插針,用來鏈接外圍設備,其中就包括了這些功能:app

SPI x1: MISO, MOSI, CLK, CE0, CE1
UART x1: tx, rx
I2C x1: SDA, SCL
PWM x1: GPIO18:模擬信號輸出
GPIO x7:能夠本身寫數字信號
5V x2, 3V3 x2, GND x5

可是在我實際使用過程中,出現了這些問題:ide

image

Pin7(GPIO4)有GPCLK0的功能,而pifm須要使用此針,1-wire的DS18B20也須要使用此針。若是默認開機加載了1-wire的驅動,能夠正常讀取溫度以後,再運行pifm則會播放大約1s以後就變噪音了,這應該是此時1-wire的通訊致使了pifm失去對Pin7的控制,進而沒法播放。spa

若是先使用了pifm而在播放完成後modprobe w1-therm則w1-gpio不能被正確加載,dmesg當中有提示:code

w1-gpio: probe of w1-gpio failed with error –16orm

估計是由於pifm直接寫內存,致使模式不能被切換吧。不重啓的話我不知道如何解決問題。很好的一點,最新的kernel支持了w1的針腳指定輸出,所以我在/boot/cmdline.txt當中append這個參數就能夠了:blog

bcm2708.w1_gpio_pin=25內存

這樣就把1-wire的設備接到GPIO25,也就是CE0和CE1上面的那個針腳便可了,這樣就避免了Dallas 1-wire設備與pifm的衝突了。你能夠設置爲任意一個可使用的GPIO,好比17,22,24等等。據我所知,1-wire也是bit-bang出來的,因此更改針腳的話是很容易的。ci

 

還有一個問題,就是pifm與PWM之間的。這個問題令我十分不解,由於pifm用的Pin7(GPIO4)與PWM的Pin12(GPIO18)無關。可是實際狀況是:unicode

1. 若是我先運行了pwm,讓其輸出到單色LED,能夠觀察到亮度變化,再運行pifm,聲音正常播放,可是LED亮度不怎麼變,電壓表測量的電壓在3.05V-3.06V,退出後亮度無變化,可是pwm程序依然運行get

2.先運行pifm,正常播放聲音,而且PWM的燈是亮着的,亮度和上面的相似。再運行pwm,聲音中止,可是LED亮度在變化當中。我是使用「avconv -i test.mp3 -ac 1 -ar 22050 -b 352k -f wav - | sudo ./pifm」來播放的,看到轉換進度中止了,即便退出了pwm程序,pifm依然中止,由於轉換沒有前進。

總之,pifm與PWM佔用了不一樣針腳,可是卻有先來後到之分?

 

pifm的源代碼當中用到了PWM,可是不理解爲何要用,應該只用GPCLK0(Pin4/GPIO7)便可

相關文章
相關標籤/搜索