目前我们采用IMX6DL+MCU的方式方案,用ECSPI3与单片机连接,但遇到无法通信的问题.
我们打印了相关寄存器的值,还请帮忙检查下配置是否正确:
1. ECSPI3相关的主要寄存器值如下:
ECSPI_CTRL=0x08000001
ECSPI_CONFIG=0x00100111
ECSPI_INT=0x00000008
ECSPI_DMA=0x00000000
ECSPI_PERIOD=0x00000000
2. ECSPI3相对应的IOMUX PAD配置如下:
MX6DL_PAD_DISP0_DAT0__ECSPI3_SCLK,
MX6DL_PAD_DISP0_DAT1__ECSPI3_MOSI,
MX6DL_PAD_DISP0_DAT2__ECSPI3_MISO,
MX6DL_PAD_DISP0_DAT3__ECSPI3_SS0, // SPI3_CS0
MX6DL_PAD_DISP0_DAT7__GPIO_4_28, // SPI3_REQ
#define MX6DL_PAD_DISP0_DAT0__ECSPI3_SCLK IOMUX_PAD(0x03C4, 0x00B0, 2, 0x0000, 0, MX6DL_ECSPI_PAD_CTRL)
在调试IMX6DL ECSPI3(slave)同MCU(master)间通讯时,从ECSPI3 RXDATA读到的数据同MCU发送的数据没有一个字节是相同的。我已打fsl网站推荐的imx6 spi slave补丁包。也基本确认ECSPI3 IOMUX配置和相关控制寄存器配置(也许理解不透彻)。敬请指点我该如何跟踪和分析该问题。
通讯握手时序大体如下:
1). IMX6接收数据:
master(MCU)将CS拉低,slave(IMX6 )立即将一GPIO脚拉低通知MCU已经准备接收,随后master开始发送数据,一旦数据发送完成,master会马上将cs拉高。
2). IMX6发送数据:
slave(IMX6 )将一GPIO脚拉低通知MCU有数据要发送,master(MCU)将CS拉低,随后master开始发送数据,一旦数据发送完成,master会马上将cs拉高。
解決済! 解決策の投稿を見る。
我在调试IMX6DL ECSPI3(slave)同MCU(master)间通讯时,将从ECSPI3 RXDATA读出的值直接printk到串口终端,该数据是随机的(示波器跟踪,MOSI脚上有MCU输出的正确波形),似乎SPI控制寄存器没有将shift register值锁定到FIFO中,但奇怪的是ECSPI3_INTREG的RREN中断又能产生。而将要写入TXDATA的值也printk到串口终端,其值和示波器抓取的是波形一致的。
1. 通讯握手时序大体如下:
1). IMX6接收数据:
master(MCU)将CS拉低,slave(IMX6 )立即将一GPIO脚拉低通知MCU已经准备接收,随后master开始发送数据,一旦数据发送完成,master会马上将cs拉高。
2). IMX6发送数据:
slave(IMX6 )将一GPIO脚拉低通知MCU有数据要发送,master(MCU)将CS拉低,随后master开始发送数据,一旦数据发送完成,master会马上将cs拉高。
2. IMX6Q软硬件资源:
1). CPU型号: MCIMX6U6AVM08AC
2). Android SDK版本:android-4.4.2-rl(myandroid_google_20131220.tar.gz) + kernel_imx(kk4.4.2_1.0.0-ga)
3). 补丁包: android_kk4.4.2_1.0.0-ga_core_source.tar.gz + spi_slave_2013_10_12.patch.zip
3. ECSPI3 AS SLAVE补丁包关键步骤:
1). 几个关键文件:
板级系统初始化文件:board-mx6q_sabresd.c
spi控制器驱动文件: spi_imx.c
spi协议驱动文件:spidev.c
2). PADS及IOMUX配置:
/* eCSPI3 */
MX6DL_PAD_DISP0_DAT0__ECSPI3_SCLK,
MX6DL_PAD_DISP0_DAT1__ECSPI3_MOSI,
MX6DL_PAD_DISP0_DAT2__ECSPI3_MISO,
MX6DL_PAD_DISP0_DAT3__ECSPI3_SS0, // SPI3_CS0
MX6DL_PAD_DISP0_DAT7__GPIO_4_28, // SPI3_REQ
#define MX6DL_PAD_DISP0_DAT0__ECSPI3_SCLK IOMUX_PAD(0x03C4, 0x00B0, 2, 0x0000, 0, MX6DL_ECSPI_PAD_CTRL)
#define MX6DL_PAD_DISP0_DAT7__GPIO_4_28 IOMUX_PAD(0x0418, 0x0104, 5, 0x0000, 0, MX6DL_GPIO_PAD_CTRL_ODE)
3). spi驱动初始化:
imx6q_add_ecspi(2, &mx6q_sabreauto_spi3_data);
spi_register_board_info();
4). spi_imx2_3_slave_config():
[ 34.861782] [SPI_IMX:] ---> ECSPI_CONFIG=0x100011
[ 34.861787] [SPI_IMX:] ---> ECSPI_INT=0x08
[ 34.861793] [SPI_IMX:] ---> ECSPI_DMA=0x0
[ 34.861798] [SPI_IMX:] ---> ECSPI_PERIOD=0x0
说明,我也尝试直接对CONREG和CONFIGREG进行赋值操作。但RXDATA读出来的值始终不正确。
期盼你和贵公司大力支持,不甚感激!!!
Hi,
到今天为止,我可以确认IMX6(slave) MISO脚输出的数据是对的。但从RXDATA读取的值和MCU输出到IMX6 MOSI上的数据不一致。
谢谢
Hi Sam
one can also look at
i.MX6 ESPI slave mode support patch based on rel_imx_3.0.35_4.1.0
Best regards
igor
我在调试IMX6DL ECSPI3(slave)同MCU(master)间通讯时,将从ECSPI3 RXDATA读出的值直接printk到串口终端,该数据是随机的(示波器跟踪,MOSI脚上有MCU输出的正确波形),似乎SPI控制寄存器没有将shift register值锁定到FIFO中,但奇怪的是ECSPI3_INTREG的RREN中断又能产生。而将要写入TXDATA的值也printk到串口终端,其值和示波器抓取的是波形一致的。
1. 通讯握手时序大体如下:
1). IMX6接收数据:
master(MCU)将CS拉低,slave(IMX6 )立即将一GPIO脚拉低通知MCU已经准备接收,随后master开始发送数据,一旦数据发送完成,master会马上将cs拉高。
2). IMX6发送数据:
slave(IMX6 )将一GPIO脚拉低通知MCU有数据要发送,master(MCU)将CS拉低,随后master开始发送数据,一旦数据发送完成,master会马上将cs拉高。
2. IMX6Q软硬件资源:
1). CPU型号: MCIMX6U6AVM08AC
2). Android SDK版本:android-4.4.2-rl(myandroid_google_20131220.tar.gz) + kernel_imx(kk4.4.2_1.0.0-ga)
3). 补丁包: android_kk4.4.2_1.0.0-ga_core_source.tar.gz + spi_slave_2013_10_12.patch.zip
3. ECSPI3 AS SLAVE补丁包关键步骤:
1). 几个关键文件:
板级系统初始化文件:board-mx6q_sabresd.c
spi控制器驱动文件: spi_imx.c
spi协议驱动文件:spidev.c
2). PADS及IOMUX配置:
/* eCSPI3 */
MX6DL_PAD_DISP0_DAT0__ECSPI3_SCLK,
MX6DL_PAD_DISP0_DAT1__ECSPI3_MOSI,
MX6DL_PAD_DISP0_DAT2__ECSPI3_MISO,
MX6DL_PAD_DISP0_DAT3__ECSPI3_SS0, // SPI3_CS0
MX6DL_PAD_DISP0_DAT7__GPIO_4_28, // SPI3_REQ
#define MX6DL_PAD_DISP0_DAT0__ECSPI3_SCLK IOMUX_PAD(0x03C4, 0x00B0, 2, 0x0000, 0, MX6DL_ECSPI_PAD_CTRL)
#define MX6DL_PAD_DISP0_DAT7__GPIO_4_28 IOMUX_PAD(0x0418, 0x0104, 5, 0x0000, 0, MX6DL_GPIO_PAD_CTRL_ODE)
3). spi驱动初始化:
imx6q_add_ecspi(2, &mx6q_sabreauto_spi3_data);
spi_register_board_info();
4). spi_imx2_3_slave_config():
[ 34.861782] [SPI_IMX:] ---> ECSPI_CONFIG=0x100011
[ 34.861787] [SPI_IMX:] ---> ECSPI_INT=0x08
[ 34.861793] [SPI_IMX:] ---> ECSPI_DMA=0x0
[ 34.861798] [SPI_IMX:] ---> ECSPI_PERIOD=0x0
说明,我也尝试直接对CONREG和CONFIGREG进行赋值操作。但RXDATA读出来的值始终不正确。
期盼你和贵公司大力支持,不甚感激!!!
该问题已经得到解决,谢谢!
Hi igor
谢谢。
我最先就是用这篇文章资料和补丁包来实现同MCU间通讯的。可我就是没搞懂: 为何imx6 ecspi3只能发送数据不能成功接收数据。敬请指点我该如何分析,或者按照我上面描述的通讯时许,我该如何配置相关寄存器?敬请指点。
Best regards.
sam
Hi Zhao,
感谢的你回复。你给的补丁包和范例我有。我现急需你帮助分析解决数据为何收发不正常。
谢谢