IMX6DL ecspi-slave 与单片通信问题

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 
已解决

IMX6DL ecspi-slave 与单片通信问题

跳至解决方案
5,597 次查看
yiliu
Contributor II

目前我们采用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)

          #define MX6DL_PAD_DISP0_DAT1__ECSPI3_MOSI   IOMUX_PAD(0x03C8, 0x00B4, 2, 0x0000, 0, MX6DL_ECSPI_PAD_CTRL)

          #define MX6DL_PAD_DISP0_DAT2__ECSPI3_MISO   IOMUX_PAD(0x03F4, 0x00E0, 2, 0x0000, 0, MX6DL_ECSPI_PAD_CTRL)

          #define MX6DL_PAD_DISP0_DAT3__ECSPI3_SS0    IOMUX_PAD(0x0408, 0x00F4, 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.下方是一些补充信息:

     在调试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拉高。

标签 (1)
标记 (2)
1 解答
4,765 次查看
samlee
Contributor II

我在调试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_DAT1__ECSPI3_MOSI   IOMUX_PAD(0x03C8, 0x00B4, 2, 0x0000, 0, MX6DL_ECSPI_PAD_CTRL)

#define MX6DL_PAD_DISP0_DAT2__ECSPI3_MISO   IOMUX_PAD(0x03F4, 0x00E0, 2, 0x0000, 0, MX6DL_ECSPI_PAD_CTRL)

#define MX6DL_PAD_DISP0_DAT3__ECSPI3_SS0    IOMUX_PAD(0x0408, 0x00F4, 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.861776] [SPI_IMX:] ---> ECSPI_CTRL=0x7ff00001

[   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读出来的值始终不正确。

期盼你和贵公司大力支持,不甚感激!!!

在原帖中查看解决方案

0 项奖励
回复
7 回复数
4,765 次查看
JasonZhao
Contributor V

We have a patch to implement spi slave function, customer can refer to this patch to do the similar work on their platform.

0 项奖励
回复
4,765 次查看
samlee
Contributor II

Hi,

    到今天为止,我可以确认IMX6(slave) MISO脚输出的数据是对的。但从RXDATA读取的值和MCU输出到IMX6 MOSI上的数据不一致。

 

   谢谢

0 项奖励
回复
4,765 次查看
igorpadykov
NXP Employee
NXP Employee

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

4,766 次查看
samlee
Contributor II

我在调试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_DAT1__ECSPI3_MOSI   IOMUX_PAD(0x03C8, 0x00B4, 2, 0x0000, 0, MX6DL_ECSPI_PAD_CTRL)

#define MX6DL_PAD_DISP0_DAT2__ECSPI3_MISO   IOMUX_PAD(0x03F4, 0x00E0, 2, 0x0000, 0, MX6DL_ECSPI_PAD_CTRL)

#define MX6DL_PAD_DISP0_DAT3__ECSPI3_SS0    IOMUX_PAD(0x0408, 0x00F4, 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.861776] [SPI_IMX:] ---> ECSPI_CTRL=0x7ff00001

[   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读出来的值始终不正确。

期盼你和贵公司大力支持,不甚感激!!!

0 项奖励
回复
4,765 次查看
yiliu
Contributor II

该问题已经得到解决,谢谢!

0 项奖励
回复
4,765 次查看
samlee
Contributor II

Hi igor

    谢谢。

    我最先就是用这篇文章资料和补丁包来实现同MCU间通讯的。可我就是没搞懂: 为何imx6 ecspi3只能发送数据不能成功接收数据。敬请指点我该如何分析,或者按照我上面描述的通讯时许,我该如何配置相关寄存器?敬请指点。

  

    Best regards.

    sam

0 项奖励
回复
4,765 次查看
samlee
Contributor II

Hi Zhao,

     感谢的你回复。你给的补丁包和范例我有。我现急需你帮助分析解决数据为何收发不正常。

谢谢

0 项奖励
回复