Beaglebone Black – 连接 GY | 您所在的位置:网站首页 › 怎么祛斑最安全可靠呢 › Beaglebone Black – 连接 GY |
这次用 SPI。BBB 有两套 SPI 接口可用,两套都是默认 disable,需要用 overlay 方式启用,即: echo BB-SPIDEV0 > /sys/devices/bone_capemgr.9/slots 我的 BBB 当前配置当前配置 /opt/source/Userspace-Arduino/overlay/BB-SPI0-01-00A0.dts/dts-v1/; /plugin/; / { compatible = "ti,beaglebone", "ti,beaglebone-black"; /* identification */ part-number = "spi0pinmux"; fragment@0 { target = ; __overlay__ { spi0_pins_s0: spi0_pins_s0 { pinctrl-single,pins = < 0x150 0x30 /* spi0_sclk, INPUT_PULLUP | MODE0 */ 0x154 0x30 /* spi0_d0, INPUT_PULLUP | MODE0 */ 0x158 0x10 /* spi0_d1, OUTPUT_PULLUP | MODE0 */ 0x15c 0x10 /* spi0_cs0, OUTPUT_PULLUP | MODE0 */ >; }; }; }; fragment@2 { target = ; __overlay__ { #address-cells = ; #size-cells = ; status = "okay"; pinctrl-names = "default"; pinctrl-0 = ; spidev@0 { spi-max-frequency = ; reg = ; compatible = "linux,spidev"; }; }; }; };
说明书第三十页,BMP280 支持 Mode 00 和 11,自动选的。可三线或四线连接。 dts 档内可见,当前就是 mode 0,可以直接连 BMP280了。 SPI 接线 – BMP280原理图在上一篇博文,从图可以得知,BMP280 的片选是 CSB,NCS 是九轴 MPU9250 的片选引脚。 我那很烂的焊接,锡明显过多,烙铁温度过高,家里没洗板水,脏兮兮的。SPI0 的接线如下: BBB GY-91 说明 P9_1 GND 地 P9_3 3V3 电源 P9_22 SCL 时钟 P9_17 CSB 片选 P9_18 SDA MOSI P9_21 SA0 MISO启用 SPI0 : echo BB-SPIDEV0 > /sys/devices/bone_capemgr.9/slots 然后在 /dev 就会出现了: spidev1.0 代表总线号 1 片选号 0。 SPI 读取 BMP280 的 ID Register 值注意事项如上图,图片截取自 BMP280 Datasheet,BMP280 的 SPI Read 方式从 BBB 发出的一个 byte 是 Control byte,Control byte 的 bit 7 用来控制读写,地址是后面余下的 7 个 bits。上图Control byte 后面的 Data byte 是接收的,比如我四线情况,它在 MISO 出现的,上图这样表达比较难理解……。 看一下时序图,看这个我比较好理解一些: 通讯过程中片选 pull down。 毕竟主角是九轴,BMP280温度气压就快速试一次,试试而已。C 代码。 有好几段小插曲,我首先想用 Python,易写易改,找到了SPIDEV,可是无论如何都无法用双工连,最终由于时间关系,放弃了。PY-SPIDEV见以此链接: https://pypi.python.org/pypi/spidev 。后来改用 C,各种百度FQ再 Google,多半是 Arduino 和用上 Adafruit 的类库,看到各种 Digital Write,最后也放弃了。最后直接用 linux/spi/spidev 自己参考一下别人就直接写。 #include #include #include #include #include #include #include char buf[1]; char buf2[10]; struct spi_ioc_transfer xfer[2]; int spi_init(char filename[40]) { int file; __u8 mode = 0; __u8 lsb = 0; __u8 bits = 8; __u32 speed = 10000000; if ((file = open(filename,O_RDWR)) < 0) { printf("Failed to open the bus."); exit(1); } if (ioctl(file, SPI_IOC_WR_MODE, &mode) |
CopyRight 2018-2019 实验室设备网 版权所有 |