一、问题描述
最近使用飞思卡尔imx6ull用的时候spi协议实现和icm通信20608六轴传感器时,发现读取的数据是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在设备树文件中搜索和使用四个相关引脚uart配置2引脚,然后屏蔽。
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系统找不到引脚信息,配置也无法完成。