瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568 支持安卓 11 和 linux 系统,主要面向物联网网关、NVR 存储、工控平板、工业检测、工控盒、卡拉 OK、云终端、车载中控等行业。
第194章 如何在Linux中使用模拟SPI
在讲解SPI基础的时候提到过SPI可以分为硬件SPI和软件SPI,在前面的章节中使用的都是硬件SPI,当硬件SPI不够用时,可以使用GPIO来模拟SPI,在本节课将对软件SPI进行讲解。
与I2C协议相比,SPI通信协议比较简单,没有起始信号、应答信号和终止信号,所以不会从零编写模拟SPI的驱动代码,直接使用Linux源码中已经写好的驱动程序即可。
194.1 内核和设备树配置
首先将模拟SPI驱动编译进内核,在make menuconfig图形化配置界面中选中如下选项
Device Drivers --->
[*]SPI support -->
<*> GPIO-based bitbanging SPI Master //选中
软件SPI选定的引脚为开发板背面的4个GPIO,具体引脚功能图如下所示:
设备树修改步骤如下所示:
首先对rk3568-evb1-ddr4-v10.dtsi设备树进行修改,在根节点添加SPI5节点,具体内容如下所示:
spi5: spi@gpiol {
compatible = "spi-gpio";
#address-cells = <1>;
gpio-sck = <&gpio0 RK_PB0_GPIO_ACTIVE_LOW>;
gpio-miso = <&gpio1 RK_PB0_GPIO_ACTIVE_LOW>;
gpio-mosi = <&gpio1 RK_PB1_GPIO_ACTIVE_LOW>;
cs-gpios = <&gpio1 RK_PB2_GPIO_ACTIVE_LOW>;
num-chipselects = <1>;
pinctrl-names = "default";
pinctrl-0 = <&spi5_gpios>;
status = "disabled";
};
然后对pinctrl节点进行追加,追加内容如下所示:
spi5_gpios: gpios {
rockchip,pins = <0 RK_PB0 0 &pcfg_pull_none>,
<1 RK_PB0 0 &pcfg_pull_none>,
<1 RK_PB1 0 &pcfg_pull_none>,
<1 RK_PB2 0 &pcfg_pull_none>,
>;
};
最后修改之前编写的mcp2515节点,修改之后的内容如下所示:
&spi5 {
status = "okay";
mcp2515:mcp2515@0 {
compatible = "rockchip,spidev";
reg = <0>;
spi-max-frequency = <10000000>;
status = "okay";
};
};
修改完成之后保存,然后重新编译内核镜像,编译完成的内核镜像存放路径为“iTOP-3568开发板\03_【iTOP-RK3568开发板】指南教程\02_Linux驱动配套资料\04_Linux驱动程序\120_soft_spi\01_修改好的内核”。
194.2 运行测试
首先要确保烧写的是上一小节编译出来的内核,烧写完成开发板启动之后,使用“ls /dev/spidev5.0”查看是否存在spidev5.0节点,如下图所示:
修改完成之后保存,然后重新编译内核镜像,编译完成的内核镜像存放路径为“iTOP-3568开发板\03_【iTOP-RK3568开发板】指南教程\02_Linux驱动配套资料\04_Linux驱动程序\120_soft_spi\01_修改好的内核”。
194.2 运行测试
首先要确保烧写的是上一小节编译出来的内核,烧写完成开发板启动之后,使用“ls /dev/spidev5.0”查看是否存在spidev5.0节点,如下图所示:
可以看到TX和RX收发的数据是一样,证明SPI回环成功,至此模拟SPI测试就完成了。
全部0条评论
快来发表一下你的评论吧 !