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)便可

相关文章
相关标签/搜索