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

Raspberry Pi提供了26个插针,用来连接外围设备,其中就包括了这些功能:

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

但是在我实际使用过程当中,出现了这些问题:

image

Pin7(GPIO4)有GPCLK0的功能,而pifm需要使用此针,1-wire的DS18B20也需要使用此针。如果默认开机加载了1-wire的驱动,可以正常读取温度之后,再运行pifm则会播放大约1s之后就变噪音了,这应该是此时1-wire的通信导致了pifm失去对Pin7的控制,进而无法播放。

如果先使用了pifm而在播放完成后modprobe w1-therm则w1-gpio不能被正确加载,dmesg当中有提示:

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

估计是因为pifm直接写内存,导致模式不能被切换吧。不重启的话我不知道如何解决问题。很好的一点,最新的kernel支持了w1的针脚指定输出,因此我在/boot/cmdline.txt当中append这个参数就可以了:

bcm2708.w1_gpio_pin=25

这样就把1-wire的设备接到GPIO25,也就是CE0和CE1上面的那个针脚即可了,这样就避免了Dallas 1-wire设备与pifm的冲突了。你可以设置为任意一个可以使用的GPIO,比如17,22,24等等。据我所知,1-wire也是bit-bang出来的,所以更改针脚的话是很容易的。

还有一个问题,就是pifm与PWM之间的。这个问题令我十分不解,因为pifm用的Pin7(GPIO4)与PWM的Pin12(GPIO18)无关。但是实际情况是:

1. 如果我先运行了pwm,让其输出到单色LED,可以观察到亮度变化,再运行pifm,声音正常播放,但是LED亮度不怎么变,电压表测量的电压在3.05V-3.06V,退出后亮度无变化,但是pwm程序依然运行

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

原文地址:https://www.cnblogs.com/DaochenShi/p/3616580.html