最近在使用飞思卡尔的imx6ull的时候,要用spi协议实现和icm20608六轴传感器的通讯时,发现读取出来的数据都是0(即使读取的是ID寄存器)。
二、解决方法 1、上论坛查找问题,发现首先是忘记屏蔽掉设备树中冲突的引脚配置pinctrl_ecspi3:icm20608{
fsl,pins=<
MX6UL_PAD_UART2_TX_DATA__GPIO1_IO20 0x10b0
MX6UL_PAD_UART2_RX_DATA__ECSPI3_SCLK 0x10b1
MX6UL_PAD_UART2_CTS_B__ECSPI3_MOSI 0x10b1
MX6UL_PAD_UART2_RTS_B__ECSPI3_MISO 0x10b1
>;
可以看到,icm20608配置了uart2相关的四个引脚,在设备树文件中搜索使用uart2引脚的配置,然后屏蔽掉。
pinctrl_flexcan2: flexcan2grp{
fsl,pins = <
>;
};
pinctrl_uart2: uart2grp {
fsl,pins = <
MX6UL_PAD_UART3_RX_DATA__UART2_DCE_RTS 0x1b0b1
MX6UL_PAD_UART3_TX_DATA__UART2_DCE_CTS 0x1b0b1
>;
};
pinctrl_uart2dte: uart2dtegrp {
fsl,pins = <
>;
};
2、发现问题还没有解决,输出依然是0
移植正点原子出厂的设备树文件,发现是可以正常读取的,于是将官方的设备树文件和自己的进行对比,发现描述引脚的fsl被我误写成fls
pinctrl_ecspi3:icm20608{
fsl,pins=<
MX6UL_PAD_UART2_TX_DATA__GPIO1_IO20 0x10b0
MX6UL_PAD_UART2_RX_DATA__ECSPI3_SCLK 0x10b1
MX6UL_PAD_UART2_CTS_B__ECSPI3_MOSI 0x10b1
MX6UL_PAD_UART2_RTS_B__ECSPI3_MISO 0x10b1
>;
};
改正之后就可以正常读取了。
三、复习关于这里 fsl,pin的作用:
对于 I.MX 系列 SOC 而言,pinctrl 驱动程序是通过读取“fsl,pins”属性值来获取 PIN 的配置信息,所以这个属性名称必须完全遵循规则,否则pinctrl系统无法找到引脚信息,无法完成配置。



