一、问题描述
最近在使用飞思卡尔的imx6ull的时候,要用spi协议实现和icm20608六轴传感器的通讯时,发现读取出来的数据都是0(即使读取的是ID寄存器)。
二、解决方法
1、上论坛查找问题,发现首先是忘记屏蔽掉设备树中冲突的引脚配置
pinctrl_ecspi3:icm20608{
fsl,pins=<
/* MX6UL_PAD_UART2_TX_DATA__ECSPI3_SS0*/
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 = <
/* MX6UL_PAD_UART2_RTS_B__FLEXCAN2_RX 0x1b020*/
/* MX6UL_PAD_UART2_CTS_B__FLEXCAN2_TX 0x1b020*/
>;
};
pinctrl_uart2: uart2grp {
fsl,pins = <
/* MX6UL_PAD_UART2_TX_DATA__UART2_DCE_TX 0x1b0b1
MX6UL_PAD_UART2_RX_DATA__UART2_DCE_RX 0x1b0b1*/
MX6UL_PAD_UART3_RX_DATA__UART2_DCE_RTS 0x1b0b1
MX6UL_PAD_UART3_TX_DATA__UART2_DCE_CTS 0x1b0b1
>;
};
pinctrl_uart2dte: uart2dtegrp {
fsl,pins = <
/* MX6UL_PAD_UART2_TX_DATA__UART2_DTE_RX 0x1b0b1
// MX6UL_PAD_UART2_RX_DATA__UART2_DTE_TX 0x1b0b1
// MX6UL_PAD_UART3_RX_DATA__UART2_DTE_CTS 0x1b0b1
// MX6UL_PAD_UART3_TX_DATA__UART2_DTE_RTS 0x1b0b1*/
>;
};
2、发现问题还没有解决,输出依然是0
移植正点原子出厂的设备树文件,发现是可以正常读取的,于是将官方的设备树文件和自己的进行对比,发现描述引脚的fsl被我误写成fls
pinctrl_ecspi3:icm20608{
fsl,pins=<
/* MX6UL_PAD_UART2_TX_DATA__ECSPI3_SS0*/
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系统无法找到引脚信息,无法完成配置。