This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AM3354的SDK的是否不支持3线制的SPI设备?

Other Parts Discussed in Thread: AM3354

各位好!有问题需要请教一下!

我用AM3354 SDK里的linux驱动spidev.c生成驱动模块,然后用/Documentation/spi里的spidev_test.c生成应用程序,运行时,提示如下:

spidev spi2.0: setup: unsupported mode bits 10
can't set spi mode: Invalid argument
Aborted

PS:#define SPI_3WIRE 0x10 /* SI/SO signals shared */

  • 这个三线SPI的设备,需要在同一数据根线上能同时做MOSI和MISO。目前335上数据线可以配成MOSI,或者MISO,但是同时做,实现三线SPI,应该还不能支持。在TRM24.2.3中,对数据线的description描述中:Can be configured as either input or output (MOSI or MISO)

  • 请问您这个驱动是在哪个驱动文件里修改的?

    我们的SPI总线配置是在spi-omap2-mcspi.c进行修改的,spidev.c只是某一个SPI设备的驱动。

  • (1)我只是想用spidev.c这个应用层程序去测试AM3354是否支持3-wire的SPI。

    (2)我现在的开发需求如下:

    a.  我有一个液晶屏,该LCD接口集成了3-wire的SPI,而该SPI接口是连接AM3354的,该SPI的作用是:在LCD显示之前需要对液晶屏上的驱动IC进行初始化;

    b.  因此,我单独写一个初始化LCD驱动IC的SPI设备驱动,同时在board-am335xevm.c中添加如下代码:

    static struct pinmux_config spi1_pin_mux[] = {
    {"mcasp0_aclkx.spi1_sclk", OMAP_MUX_MODE3 | AM33XX_PULL_ENBL
    | AM33XX_INPUT_EN},
    {"mcasp0_fsx.spi1_d0", OMAP_MUX_MODE3 | AM33XX_PULL_ENBL
    | AM33XX_PULL_UP | AM33XX_INPUT_EN},
    {"mcasp0_axr0.spi1_d1", OMAP_MUX_MODE3 | AM33XX_PULL_ENBL
    | AM33XX_INPUT_EN},
    {"mcasp0_ahclkr.spi1_cs0", OMAP_MUX_MODE3 | AM33XX_PULL_ENBL
    | AM33XX_PULL_UP | AM33XX_INPUT_EN},
    {NULL, 0},
    };

    static struct spi_board_info xxx_spi1_slave_info[] = {
      {
            .modalias = "xxx_spi_init",
            // .platform_data = &xxx_spi_info,
            .max_speed_hz = 24000000,
            .bus_num = 2,
            .chip_select = 0,
            .mode = SPI_3WIRE,
       },
    };

    但是系统启动时打印信息:

    spi spi2.0: setup: unsupported mode bits 10

    (3)求指教,谢谢!

  • 我看了下这部分的代码,首先drivers/spi/spidev.c这个是个通用的SPI设备的驱动程序哦,并不是应用程序。

    另外.mode 这个参数应该设为:

    #define SPI_MODE_0  (0|0)
    #define SPI_MODE_1  (0|SPI_CPHA)
    #define SPI_MODE_2  (SPI_CPOL|0)
    #define SPI_MODE_3  (SPI_CPOL|SPI_CPHA)

    当中的一个。

    SPI_3WIRE应该通过应用层的IOCTL函数进行设置。

  • 另外多问一句,你指的SPI 3线是指不需要SPI_CS(SPIEN)这个信号线么,如果是这种模式,我们AM335x的SPI控制器是支持的,可以通过配置MCSPI_MODULCTRL寄存器的bit1来实现。

  • (1)我的3线SPI接口是:SCLK(时钟)、CS(片选)、DA(数据线,MISO和MOSI共用同一根数据线)。

  • Jian Zhou 于 2015-3-3 12:11 发表了以下帖子 :

    我看了下这部分的代码,首先drivers/spi/spidev.c这个是个通用的SPI设备的驱动程序哦,并不是应用程序。

    =====》【回复】 抱歉!笔误,我之前已经了解到drivers/spi/spidev.c是个通用的SPI设备的驱动程序,既然是通用驱动程序,那么也可以用在我的案例上。我是通过documentation/spi/spidev_test.c生成应用程序测试的。

    运行命令如下:spidev_test  -3 (注:3表示--3wire   SI/SO signals shared

    打印信息:spidev spi2.0: setup: unsupported mode bits 10

    PS:#define SPI_3WIRE 0x10 /* SI/SO signals shared */

    【回复】

  • 你可以看下我们TRM的table 24-17,我们的三线指的是SCLK和2个数据线。

    数据线同时做输入输出目前没看到有支持,不过可以动态配置

  • 如何动态配置?请指教

  • 简单来讲,就是通过IOCTL来实现,读的时候将数据线设成receive,写的时候设置成transmit。

    在应用层通过IOCTL控制这条数据线的收发。

  • (1)若要在应用层通过ioctl进行控制,那么驱动层的ioctl在哪里实现?

    (2)驱动源码中,SPI总线配置是spi-omap2-mcspi.c该源文件。能否用drivers/spi/spidev.c通用设备的驱动程序来实现驱动层的ioctl函数?

  • 在spidev.c文件中的spidev_ioctl()中加入对数据线发送还是接收的配置就可以了