# imx6ul基于hi3585增加spi驱动
# 1.介绍
hi-3595是spi转429的
芯片,该芯片可直接接入429总线进行读写操作。对于
iMX6ULL来说就是使用spi总线接口根据hi3585的
用户手册进行配置,然后进行正常的读写操作。
# 2.spi配置编译
通过
MAKE menuconfig对imx6ull
开发板的spi进行配置,保存后直接make生成新的zImage.
# 3.设备树编写
```cpp
&ecspi1 {
fsl,spi-num-chipselects = <1>;
cs-gp
IOS = <&
GPIO4 26 0>;
mr-gpios = <&gpio1 13 0>;
rflag-gpios = <&gpio1 15 0>;
tflag-gpios = <&gpio4 17 0>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_ecspi1_1 &pinctrl_ecspi1_cs_1 &pinctrl_ecspi1_hi3585_1>;
status = "disabled";
spidev1: hi3585_1@0 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "hi3585_1";
reg = <0>;
spi-max-frequency = <20000000>;
};
};
&ecspi2 {
fsl,spi-num-chipselects = <1>;
cs-gpios = <&gpio4 22 0>;
mr-gpios = <&gpio1 11 0>;
rflag-gpios = <&gpio1 14 0>;
tflag-gpios = <&gpio4 12 0>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_ecspi2_1 &pinctrl_ecspi2_cs_1 &pinctrl_ecspi2_hi3585_1>;
status = "disabled";
spidev2: hi3585_2@0 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "hi3585_2";
reg = <0>;
spi-max-frequency = <20000000>;
};
};
...
...
&iomuxc {
...
pinctrl_ecspi1_cs_1: ecspi1_cs_grp-1 {
fsl,pins = <
MX6UL_PAD_CSI_DATA05__GPIO4_IO26 0x10b0
>;
};
pinctrl_ecspi2_cs_1: ecspi2_cs_grp-1 {
fsl,pins = <
MX6UL_PAD_CSI_DATA01__GPIO4_IO22 0x10b0
>;
};
pinctrl_ecspi1_1: ecspi1grp-1 {
fsl,pins = <
MX6UL_PAD_CSI_DATA06__ECSPI1_MOSI 0x10b0
MX6UL_PAD_CSI_DATA07__ECSPI1_M
ISO 0x10b0
MX6UL_PAD_CSI_DATA04__ECSPI1_SCLK 0x10b0
>;
};
pinctrl_ecspi2_1: ecspi2grp-1 {
fsl,pins = <
MX6UL_PAD_CSI_DATA02__ECSPI2_MOSI 0x10b0
MX6UL_PAD_CSI_DATA03__ECSPI2_MISO 0x10b0
MX6UL_PAD_CSI_DATA00__ECSPI2_SCLK 0x10b0
>;
};
pinctrl_ecspi1_hi3585_1: ecspi1_hi3585_grp-1 {
fsl,pins = <
MX6UL_PAD_JTAG_TDI__GPIO1_IO13 0x10b0 /* MR1 Reset */
MX6UL_PAD_JTAG_TRST_B__GPIO1_IO15 0x10b0 /* RFLAG1 */
MX6UL_PAD_CSI_MCLK__GPIO4_IO17 0x10b0 /* TFLAG1 */
>;
};
pinctrl_ecspi2_hi3585_1: ecspi2_hi3585_grp-1 {
fsl,pins = <
MX6UL_PAD_JTAG_TMS__GPIO1_IO11 0x10b0 /* MR2 Reset */
MX6UL_PAD_JTAG_TDO__GPIO1_IO12 0x10b0 /* TFLAG2 */
MX6UL_PAD_JTAG_TCK__GPIO1_IO14 0x10b0 /* RFLAG2 */
>;
};
...
};
```
在编写设备树时,一定要确认该引脚的复用功能,确认没有被多次引用,不然会造成冲突。
# 3.代码编写
此过程都是根据正点原子的步骤,依据hi-3585的用户手册进行编写,不再赘述。
# 4.调试方法
## 4.1spi没有波形的问题
在刚开始时,设备树和hi3585.ko正常加载之后,spi没有波形。
使用
linux内核官方提供的spi例子进行测试,设备树修改如下:
```cpp
&ecspi1 {
fsl,spi-num-chipselects = <1>;
cs-gpios = <&gpio4 26 0>;
mr-gpios = <&gpio1 13 0>;
rflag-gpios = <&gpio1 15 0>;
tflag-gpios = <&gpio4 17 0>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_ecspi1_1 &pinctrl_ecspi1_cs_1 &pinctrl_ecspi1_hi3585_1>;
status = "disabled";
spidev0: spi@0 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "spidev";
reg = <0>;
spi-max-frequency = <20000000>;
};
};
```
这样在设备树更新后,在dev目录下会有spidev0.0的设备节点。由于没有发现这个节点,因此断定之前make menuconfig后没有保存,使用上面的方法进行配置编译后正常(之前使用同事提供的编译方法)。重新编译后,spidev0.0节点出现,接下来进行测试。
将linux内核中提供的spidev_test.c文件编译后测试。
路径:linux-imx-rel_imx_4.1.15_2.1.0_ga/Documentation/spi
编译和测试方法帮助文档中都有介绍,
对spi进行回绕测试,测试正常。
再一次将之前编写好的设备树与hi3585.ko文件加载后,在dev目录下出现hi3585的设备节点。spi波形正常,剩下的就是根据hi-3585的用户手册配置,进行读写操作。具体看代码,不再赘述。