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.

[参考译文] Linux/AM4378:Spidev 不在引脚上输出

Guru**** 2587365 points
Other Parts Discussed in Thread: AM4372

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/631995/linux-am4378-spidev-does-not-output-on-pins

器件型号:AM4378
主题中讨论的其他器件:AM4372

工具/软件:Linux

大家好!

我最近在/dev/dev 中注册了我的 spidev 设备( 有关详细信息、请参阅此处)。  

不幸的是、我的器件似乎无法正常工作。  到目前为止、我只研究了 spidev1.1。  我可以打开器件。  当我配置它时、我确实会收到有关不使用 DMA 的投诉消息(请参阅下面的内容)。  然后、我收到一条 TXS 超时消息。

我使用的程序与 这个程序非常相似 。  我刚刚添加了大量打印内容并减慢了速度、以便我能够知道导致系统日志消息的操作。

这是输出。

root@AM437X-EVM:/ace/bin #./helloSpi -C 301
赫洛斯皮...
  选择的选项
    器件=/dev/spidev1.1
    速度= 24000000
    延迟= 0
    位= 8
    MODE = 0x04
  ...正在创建设备
  设置 SPI 选项
  正在打开文件句柄
  ...Committing 选项   <--此处有3个 ioctl 调用
[62332.673461] spidev 1.1:不对 McSPI 使用 DMA (-19)
[62332.678907] spidev spi1.1:不对 McSPI 使用 DMA (-19)
[62332.689027] spidev spi1.1:不对 McSPI 使用 DMA (-19)
  ...正在设置数据传输
    TX = 0x03 0x01 0x00 0x00 0x00 0x00 0x00 0x00
    RX = 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
  ...在  这里执行 ioctl 数据传输<-- 1 ioctl 调用
[62340.712144] spidev spi1.1:TXS 超时
  接收缓冲器
    RX = 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
再见!

我的电气团队负责 spidex1.1的 clk、miso、mosi 和 cs 引脚、没有任何活动。

我还看到 CS 引脚一直保持低电平。  我认为只有当 SPI 主设备要向该特定器件发送数据或从该特定器件检索数据时、它才会变为低电平。

这是我的引脚多路复用器...

SPI2_INTERNAL_PINS_DEFAULT:SPI2_INTERNAL_PINS_DEFAULT{
  pinctrl-single、pins =<
    0x260 (PIN_OUTPUT | INPUT_EN | MUX_MODE0)/*(N20) SPI2_SCLK/SPI2_SCLK */
    0x264 (PIN_OUTPUT | MUX_MODE0)       /*(P22) SPI2_d0.SPI2_d0 */
     0x268 (PIN_INPUT_PULLUP | MUX_MODE0)   /*(P20) SPI2_D1.SPI2_D1 *
     0x1b0 (PIN_OUTPUT | MUX_Mode4)       /*(AE17) cam0_hd.SPI2_CS1 */
     0x1c4 (PIN_OUTPUT | MUX_Mode4)       /*(AB19) cam0_data8.SPI2_CS2 */
  >;

SPI2{
  兼容="ti、OMAP2-mcspi";
  pinctrl-names ="default";
  pinctrl-0 =<&SPI2_INTERNAL_PINS_DEFAULT>;
  状态="正常";

    TI、SPI-num-cs =<4>;
    ti、pidd-d0-out-d1-in =<1>;

ksz8895@1{
  兼容="Rohm、dh2228fv";
  SPI-max-frequency =<100000 >;
   reg =<0x1>;
   状态="正常";
   #address-cells =<1>;
   #size-cells =<0>;
};
ksz8895@2{
  兼容="Rohm、dh2228fv";
  SPI-max-frequency =<100000 >;
  reg =<0x2>;
  状态="正常";
  #address-cells =<1>;
  #size-cells =<0>;
};

};

以下是(我认为相关的) defconfig 设置。 实际上、这里是与 SPI 相关的所有内容。  我强调了我认为实际重要的问题

root@AM437X-EVM:/ace/bin cat /proc/config.gz gunzip|grep SPI|grep \#-v|grep spin -v
CONFIG_REGMAP_SPI=y
CONFIG_MTD_SPI_NOR = y
CONFIG_SPI_cadence_QUADSPI=y
CONFIG_WLCORE_SPI=m
CONFIG_INPUT_ADXL34X_SPI=m
CONFIG_SPI=y
CONFIG_SPI_MASTER=y
CONFIG_SPI_BI_BANG=m
CONFIG_SPI_GPIO=m
CONFIG_SPI_OMAP24xx=y
CONFIG_SPI_TI_QSPI=y
CONFIG_SPI_SPIDEV=y
CONFIG_SND_SOC_I2C_AND_SPI=y
CONFIG_RTC_I2C_AND_SPI=y

我看到过有关不同引脚复用设置的各种文章。  我看到 Biser 说 clk 需要是输入(我尝试过、没有变化)、我看到另一篇文章说他们成功地将 clk 作为 INPUT_EN 标志的输出。  因此、我不确定"正确"的答案是什么。  

欢迎使用所有想法/建议/故障排除提示。

提前感谢!

Nathan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    您使用的是哪款 SDK?

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在 am43xx.h 上、输出和 INPUT_EN 与 INPUT 相同...

    #define PIN_OUTPUT (PULL_DISABLE)

    #define PIN_INPUT (INPUT_EN | PULL_DISABLE)

    所以、两者都是正确的答案。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Linux SDK 4.
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    尝试以下设置以启用 SPI:
    e2e.ti.com/.../2321156

    该帖子针对 AM335x、但对于所有 Sitara 器件、通用引脚多路复用设置(仅寄存器地址和多路复用模式可能不同)和 SPI 设置是相同的。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Yordan、您好!

    感谢你的帮助。  我已在您引用的帖子中尝试设置、并已取得增量进度。  芯片选择线现在在非活动状态时为高电平。  当尝试读取从器件时、我仍然看不到 SPI 总线上的任何活动。

    DTS 现在状态...

    SPI2_INTERNAL_PINS_DEFAULT:SPI2_INTERNAL_PINS_DEFAULT{

    pinctrl-single、pins =<

    0x260 (PIN_INPUT | MUX_MODE0)/*(N20) SPI2_SCLK/SPI2_SCLK */

    0x264 (PIN_OUTPUT | MUX_MODE0)/*(P22) SPI2_d0.SPI2_d0 *

    0x268 (PIN_INPUT | MUX_MODE0)/*(P20) SPI2_D1.SPI2_D1 *

    0x1b0 (PIN_OUTPUT | MUX_Mode4)/*(AE17) cam0_HD.SPI2_CS1 */

    0x1c4 (PIN_OUTPUT | MUX_Mode4)//(AB19) cam0_data8.SPI2_CS2 */

    >;

    };

    SPI2{

    兼容="ti、OMAP2-mcspi";

    pinctrl-names ="default";

    pinctrl-0 =<&SPI2_INTERNAL_PINS_DEFAULT>;

    状态="正常";

    TI、SPI-num-cs =<4>;

    ti、pidd-d0-out-d1-in =<1>;

    ksz8895@1{

    兼容="Rohm、dh2228fv";

    SPI-max-frequency =<100000 >;

    reg =<0x1>;

    状态="正常";

    #address-cells =<1>;

    #size-cells =<0>;

    SPI-Cs-HIGH;

    };

    ksz8895@2{

    兼容="Rohm、dh2228fv";

    SPI-max-frequency =<100000 >;

    reg =<0x2>;

    状态="正常";

    #address-cells =<1>;

    #size-cells =<0>;

    SPI-Cs-HIGH;

    };

    };

    有趣的是、我在启动时确实看到了大量的交通。  我认为 u-boot 可能会探测到它、然后内核也会探测到它吗?  是否有其他驱动程序妨碍了 spidev?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Nathan、
    三年前、我在 AM335X SPI 工作。 我必须将 SPI CLK 配置为输入、以使 SPI 进入工作状态。 检查这是否适合您。 同时检查 MOSI 和 MISO 线路是否配置正确。 了解 MOSI 和 MISO 是否有任何限制以特定方式进行配置。

    此致、
    Gangadhar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我只是注意到以下几点:
    ksz8895@1{
    兼容="Rohm、dh2228fv";
    ksz8895@2{
    兼容="Rohm、dh2228fv";
    KSZ8895是 spidev 驱动程序(Rohm、dh2228fv)不支持的网络设备。 您应该将它们连接到 MII/RMII 接口。

    此外、出于调试目的、您是否可以尝试使用 devmem2读取 pinmux 寄存器、以查看它们是否具有从 DTS 传递的值? 作为建议、还应尝试在 u-boot 中添加引脚多路复用器配置。 在最新的 SDK 中、引脚多路复用在 u-boot 中完成。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Yordan、

    我们不会将这些交换机的 SPI 接口用于网络流量。  我们只打算配置它们并收集端口统计数据等。  我认为 spidev 驱动程序将能满足这一要求。  我只是实施 此数据表的表4-1

    在 devmem2上、我应该读取什么存储器地址?  我尝试从 am4372.dtsi (0x481a2000)读取 SPI2地址、但 devmem2内核转储。  这是输出...

    root@AM437X-EVM:~# devmem2 0x481a2000
    /dev/mem 已打开。[61703.934441]未处理故障:在 bb6f2f000处非线性蚀刻(0x1018)上的外部中止
    [61703.943222] PgD = ed628000
    [61703.945950][B6f2f000]* PgD=fc99f831
    [61703.949715]------ [在此处剪切]-----
    [61703.954406]警告:CPU:0 PID:810 at drivers/bus/omap_l3_oc.c:147 l3_interrupt_handler + 0x25c/0x36c
    [61703.963773] 44000000.OCP:L3自定义错误:主 M2 (64位)目标 L4_PER_0 (读取):在功能访问期间以用户模式访问数据
    [61703.975917]中链接的模块:bc_example (O) xhci_plat_hcd xhci_hcd usbcore dwc3 UDC_CORE USB_common ti_am335x_adc SHA512_generic SHA512_arm s)
    [61704.02348] CPU:0 PID:810 Comm:devmem2被污染:G W O 4.9.28-geed43d1050 #24
    [61704.031659]硬件名称:通用 AM43 (平展器件树)
    [61704.037611]回溯:
    [61704.040129][ ](dump_backtrace)从[ ](show_stack+0x18/0x1c)
    [61704.047754] r7:00000009 R6:00000000 R5:c09b3204 R4:edd43c58
    [61704.053469][ ](show_stack)从[ ](dump_stack+0x24/0x28)
    [61704.060747][ ](dump_stack)从[ ](_WARN+0xe8/0x100)
    [61704.067758][ ](__warn)从[ ](WARN_RASPH_FMt+0x40/0x48)
    [61704.075297] R9:00000000 R8:ee914cd0 r7:c09b32dc R6:00000002 R5:c09b3130 R4:c09b31d4
    [61704.083099][ ](warn_slowpath_fmt)、来自[ ](L3_INTERRUPT_Handler+0x25c/0x36c)
    [61704.092023] R3:ee914b00 R2:c09b31d4
    [61704.095622] R4:80080003
    [61704.098197][ ](L3_interrupt_handler)、来自[ ](__Handle_IRQ_EVENT_percup+b0x4/0x144)
    [61704.107742] R10:c0c179c8 R9:ee81db00 R8:00000015 r7:edd43d7c R6:00000000 R5:ee81db00
    [61704.115614] R4:ee919080
    [61704.118181][ ](_handle_irq_event_perpu)、来自[ ](handle_irq_event_perpu + 0x24/0x60)
    [61704.129901] R10:be904ad8 R9:edd42000 R8:ee808000 r7:edd43f40 R6:00000000 R5:ee81db00
    [61704.135773] R4:ee81db00
    [61704.138339][ ](handle_irq_event_perpu)、来自[ ](handle_IRQ_EVENT_+0x64/0x90)
    [61704.147260] R5:c0c082a0 R4:ee81db00
    [61704.15078][ ](handle_irq_event)从[ ](handle_fasteoi_IRQ+0xc0/0x200)
    [61704.159452] R5:c0c082a0 R4:ee81db00
    [61704.163066][ ](handle_fasteoi_IRQ)、来自[ ](generic_handle_IRQ+0x2C/0x3c)
    [61704.171735] r7:edd43f40 R6:00000000 R5:00000015 R4:c0c1f56c
    [61704.177439][ ](generic_handle_IRQ)、来自[ ](_handle_domain_IRQ+0x5c/b0)
    [61704.186197][ ](_handle_domain_IRQ)、来自[ ](GIC_Handle_IRQ+0x40/0x6c)
    [61704.194608] R9:edd42000 R8:fa241100 r7:fa240100 R6:edd43e30 R5:fa24010c R4:c0c02c14
    [61704.202405][ ](GIC_Handle_IRQ)、来自[ ](_IRQ_Svc+0x6c/0xa8)
    [61704.209929]异常堆栈(0xedd43e30至0xedd43e78)
    [61704.215019] 3e20:00404100 00000100 c0c49940 00000000
    [61704.2232256] 3e40:00000202 00000012 00000000 00000000 ee808000 edd42000 be904ad8 edd43edc
    [61704.231487] 3e60:c0c49980 edd43e80 c0131048 c0130b10 600e0113 ffff
    [61704.238154] R9:edd42000 R8:ee808000 r7:edd43e64 R6:ffff R5:600e0113 R4:c0130b10
    [61704.245957][ ](__do_softirq)、从[ ](IRQ_EXIT+0x140/0x144)
    [61704.253408] R10:be904ad8 R9:edd42000 R8:ee808000 r7:00000000 R6:00000000 R5:00000012
    [61704.261280] R4:c0c1f56c
    [61704.263845][ ](IRQ_EXIT)从[ ](_handle_domain_IRQ+0x60/b0)
    [61704.271730][ ](_handle_domain_IRQ)、来自[ ](GIC_Handle_IRQ+0x40/0x6c)
    [61704.280142] R9:edd42000 R8:fa241100 r7:fa240100 R6:edd43f40 R5:fa24010c R4:c0c02c14
    [61704.287937][ ](GIC_Handle_IRQ)、来自[ ](_IRQ_Svc+0x6c/0xa8)
    [61704.295461]异常堆栈(0xedd43f40至0xedd43f88)
    [61704.300556] 3f40:edd43fb0 00000001 00000000 600e0010 edd42000 00000000 edd43fb0 10c53c7d
    [61704.308791] 3f60:00000000 edd42000 be904ad8 edd43fansceedd43fb0 edd43f90 c0107d14 c010b3b8
    [61704.317014] 3f80:600e0113 FFFF
    [61704.320540] R9:edd42000 R8:00000000 r7:edd43f74 R6:ffff R5:600e0113 R4:c010b3b8
    [61704.328349][ ](Do_Work_Pending)、来自[ ](SLOW_work 挂起+ 0xc/0x20)
    [61704.336582] r7:10c53c7d r6:ffff r5:600e0010 r4:00010744
    [61704.342273]--[结束线迹9394231af9932575 ]--

    映射到地址 bb6f2f000的内存。
    总线错误(转储内核)

    谢谢、

    Nathan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、对于某些内核/器件、这种内核严重错误是应该的。 在大多数情况下、pinmux 寄存器地址受到保护、无法从用户空间访问。 很抱歉在这个问题上误导您。

    让我进一步深入探讨这一点。 我一旦有任何东西、就会立即更新。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Nathan、

    TI Linux 论坛将于本周结束。 将来、请使用器件论坛、了解有关特定器件的 Linux 相关问题。 我已将您的主题移至 Sitara 论坛。 谢谢!

    此致、
    周德伟
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Yordan、您好!

    我向 u-boot DTS 添加了相关项、但没有任何变化。 我在启动时遇到 MOSI 和 CLK、然后再也不会出现。

    Nathan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我是否可以使用 XDS2xx 调试器检查任何寄存器? 我想确认、我连接的迹线实际上连接到了引脚垫、我认为它们连接到了引脚垫。 如果我可以确认它们是、那么我们可以确定这是一个引脚多路复用/linux/问题。

    如果有任何帮助,将不胜感激。
    Nathan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    您可以转储相应的 SPI pinmux 设置:
    CTRL_CONF_CAM0_HD 9B0 => muxmode4 => SPI2_CS1
    CTRL_CONF_CAM0_VD 9B4 =>我认为这应该是 CTRL_CONF_CAM0_PCLK 9C0 (DTS 1C0中的偏移量) MUX_Mode4 => SPI2_cs0仅将 CTRL_CONF_CAM0_HD (DTS 1B0中的偏移量)设置为 MUX_Mode4 => SPI2_d0、因此您丢失了 Cs0。
    CTRL_CONF_SPI2_SCLK A60 ===>clk
    CTRL_CONF_SPI2_D0 解答64 ===>d0
    CTRL_CONF_SPI2_D1 A68 ===>D1

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Yordan、您好!

    我没有意识到您不能跳过芯片选择线。  我有一个不会出现任何情况的引脚。  我像这样配置了它...

    SPI2_INTERNAL_PINS_DEFAULT:SPI2_INTERNAL_PINS_DEFAULT{
      pinctrl-single、pins =<
        0x260 (PIN_INPUT | MUX_MODE0)/*(N20) SPI2_SCLK/SPI2_SCLK */
         0x264 (PIN_OUTPUT | MUX_MODE0)/*(P22) SPI2_d0.SPI2_d0 *
         0x268 (PIN_INPUT | MUX_MODE0)/*(P20) SPI2_D1.SPI2_D1 *
         0x1c0 (PIN_OUTPUT | MUX_Mode4)/*(AC20) cam0_pclk.SPI2_cs0 */  <-新 CS0引脚到任何地方
         0x1b0 (PIN_OUTPUT | MUX_Mode4)/*(AE17) cam0_HD.SPI2_CS1 */
         0x1c4 (PIN_OUTPUT | MUX_Mode4)//(AB19) cam0_data8.SPI2_CS2 */
      >;
    };

    SPI2{
      兼容="ti、OMAP2-mcspi";
       pinctrl-names ="default";
       pinctrl-0 =<&SPI2_INTERNAL_PINS_DEFAULT>;
       状态="正常";

       TI、SPI-num-cs =<3>;
       ti、pidd-d0-out-d1-in =<1>;

       ksz8895@1{
          兼容="Rohm、dh2228fv";
          SPI-max-frequency =<100000 >;
          reg =<0x1>;
          状态="正常";
          #address-cells =<1>;
          #size-cells =<0>;
          SPI-Cs-HIGH;
       };
       ksz8895@2{
          兼容="Rohm、dh2228fv";
          SPI-max-frequency =<100000 >;
          reg =<0x2>;
          状态="正常";
          #address-cells =<1>;
          #size-cells =<0>;
          SPI-Cs-HIGH;
       };
    };

    重建了 DTB、并且行为没有变化。  无 MOSI 和无 CLK 输出。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的。 使用您的设置、您是否在文件系统中看到/dev/spidevX.Y 节点?

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、

    root@AM437X-EVM:~# ls /dev/spi
    /dev/spidev1.1 /dev/spidev1.2

    Nathan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    以确认我没有电路板问题。 我将 SPI2引脚复用为 GPIO。 然后我确认可以使用 sysfs 切换每个引脚。 我认为电路板的布局没有问题。

    我是否应该尝试在没有芯片选择的情况下运行 SPI2?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Yordan、您好!

    您对 SPI 不起作用的原因有什么其他想法吗?

    谢谢、
    Nathan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Nathan、

    如前所述、我没有其他解释、只是以太网 PHY ksz8895在某种程度上不兼容、不想与 spidev 驱动程序通信。

    如果您只将 DTS 更改为 spidev@1和 spidev@2 isntad of ksz8895@1和 ksz8895@2、 则您的电路板应该可以正常工作、这应该会验证您的 SPI 配置是否正确。

    此致、
    Yordan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Yordan、

    我认为该文本是一个任意的标签。 我已将 DTS 更改为 spidev、而不是 ksz8895。 这是条目...

    SPI2_INTERNAL_PINS_DEFAULT:SPI2_INTERNAL_PINS_DEFAULT{
    pinctrl-single、pins =<
    0x260 (PIN_INPUT| MUX_MODE0)/*(N20) SPI2_SCLK/SPI2_SCLK */
    0x264 (PIN_OUTPUT| MUX_MODE0)/*(P22) SPI2_d0.SPI2_d0 *
    0x268 (PIN_INPUT| MUX_MODE0)/*(P20) SPI2_D1.SPI2_D1 *
    0x1c0 (PIN_OUTPUT| MUX_Mode4)/*(AC20) cam0_pclk.SPI2_cs0 */
    0x1b0 (PIN_OUTPUT| MUX_Mode4)/*(AE17) cam0_HD.SPI2_CS1 */
    0x1c4 (PIN_OUTPUT| MUX_Mode4)//(AB19) cam0_data8.SPI2_CS2 */
    >;
    };

    SPI2{
    兼容="ti、OMAP2-mcspi";
    pinctrl-names ="default";
    pinctrl-0 =<&SPI2_INTERNAL_PINS_DEFAULT>;
    状态="正常";

    TI、SPI-num-cs =<3>;
    ti、pidd-d0-out-d1-in =<1>;

    spidev@1{
    兼容="Rohm、dh2228fv";
    SPI-max-frequency =<100000 >;
    reg =<0x1>;
    状态="正常";
    #address-cells =<1>;
    #size-cells =<0>;
    SPI-Cs-HIGH;
    };
    spidev@2{
    兼容="Rohm、dh2228fv";
    SPI-max-frequency =<100000 >;
    reg =<0x2>;
    状态="正常";
    #address-cells =<1>;
    #size-cells =<0>;
    SPI-Cs-HIGH;
    };
    };

    (笑声) 如您所见、我有三个连续的片选信号在使用中、这是您推荐的。 我仍然得到相同的结果。

    当我尝试配置 SPI 时、我会得到这些...

    [9935.29369] spidev spi1.2:不对 McSPI 使用 DMA (-19)
    [9935.299140] spidev spi1.2:不对 McSPI 使用 DMA (-19)
    [9935.309422] spidev spi1.2:不对 McSPI 使用 DMA (-19)

    (笑声) 这些误差是否是良性的?

    当我尝试传输数据时、我会得到这个结果...

    [9943.333015] spidev spi1.2:TXS 超时2.

    我向驱动程序添加了"2"、因为驱动程序中有许多"TXS 超时"消息。 这个位于 OMAP2_mcspi_txrx_Pio 内的729行。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    找到了一些东西...

    [9935.309422] spidev spi1.2:不对 McSPI 使用 DMA (-19)

    。 看起来是良性的。 这是一个警告、即传输太小、它将使用 PIO 而不是 DMA。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Yordan、您好!

    您说过"在最新的 SDK 中、引脚多路复用是在 u-boot 中完成的。 ” 你能说吗?  我的 u-boot DTS 与 AM437X-gp-EVM 相比相对没有变化。  我在 board-support/linux.../dts 中进行了自定义。  仅在 board-support/linux... 对我来说似乎是可行的。  

    它们是否相关?  一个 DTS 文件是否优先于另一个文件?

    谢谢、

    Nathan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Nathan、

    内核 DTS 应覆盖设置。 下面是我在 BBB 上所做的操作(目前我没有动手使用 AM437x 板)、但是 AM437x 上的内核设置应该相同、但 pinmux 当然除外:

        SPI1_Pins:SPI1_Pins{

            pinctrl-single、pins =<

                AM33XX_IOPAD (0x990、PIN_INPUT_PULLUP | MUX_MODE3)/* McASP0_aclkx.SPI1_SCLK*/

                AM33XX_IOPAD (0x99c、PIN_INPUT | MUX_MODE3)/* McASP0_ahclkr.SPI1_cs0*/

                AM33XX_IOPAD (0x994、PIN_INPUT | MUX_MODE3)/* McASP0_FSX.SPI1_d0*/

                AM33XX_IOPAD (0x998、PIN_INPUT | MUX_MODE3)/* McASP0_axr2.SPI1_D1*/

            >;

       };

     SPI1{(&S)

     status="oke";

     pinctrl-names ="default";

     pinctrl-0 =<&SPI1_PINs>;

     spidev@0{

        兼容="Rohm、dh2228fv";

        SPI-max-frequency =<5000000>;

        reg =<0>;

        状态="正常";

     };

    };

    也许我不够清楚、没有要求始终配置 cs0。 如果不需要 cs0、则只能使用 CS1和 CS2。

    ~上述设置、我在用户空间中执行 root@AM335x-EVM:# echo "BABACECA">/dev/spidev1.0、并获得以下示波器波形:

    如您所见、SPI 接口工作正常。  

    此致、  
    Yordan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Yordan 和 Nathan、

    我也在这方面做一些实验。 因此、我能够复制 BBB 上使用的引脚多路复用器设置 Yordan、我认为我们都可以同意、如果引脚多路复用器设置正确、器件的行为将与配置一致。

    我还成功地在同一 SPI 外设上使用了多个芯片选择。 实际上、我向 SPI1_Pins 添加了一个额外的芯片选择(D17):

    SPI1_Pins:SPI1_Pins{

    pinctrl-single、pins =<

    AM33XX_IOPAD (0x990、PIN_INPUT_PULLUP | MUX_MODE3)/* McASP0_aclkx.SPI1_SCLK*/

    AM33XX_IOPAD (0x99c、PIN_INPUT | MUX_MODE3)/* McASP0_ahclkr.SPI1_cs0*/

    AM33XX_IOPAD (0x97C、PIN_INPUT|MUX_MODE4)/* uart1_rts.SPI1_cs0*/

    AM33XX_IOPAD (0x994、PIN_INPUT | MUX_MODE3)/* McASP0_FSX.SPI1_d0*/

    AM33XX_IOPAD (0x998、PIN_INPUT | MUX_MODE3)/* McASP0_axr2.SPI1_D1*/

    >;

    };

    请注意、该引脚(D17)也用作 I2C 引脚、用于读取 BBB 电容上的 EEPROM。 我对这一点进行了注释、以避免对引脚的用途造成任何混淆、并禁用了 i2c2条目、以防万一。

    然后、我将 SPI1重新定义为:

    SPI1{(&S)

    status="oke";

    pinctrl-names ="default";

    pinctrl-0 =<&SPI1_PINs>;

    TI、SPI-num-cs=<2>/*我不确定这是否是绝对必要的,但我没有尝试删除*/

    spidev@0{

    兼容="Rohm、dh2228fv";

    SPI-max-frequency =<5000000>;

    reg =<0>;

    状态="正常";

    };

    spidev@1{

    兼容="Rohm、dh2228fv";

    SPI-max-frequency =<5000000>;

    reg =<1>;

    状态="正常";

    };

    };

    我能够使用此配置在/dev/spidev1.0和/dev/spidev1.1上写入数据。

    我的主要区别在于没有使用"compatible ="ti,omap2-mcspi;"行。 当我这么做时、我遇到了与 Nathan 在 TX 超时时时时时相同的错误。  

    希望这对您有所帮助!

    Munan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Munan、

    将兼容性从"ti,omap2-mcspi;"更改为"ti,am4372-mcspi"、"ti,omap4-mcspi";似乎已经解决了这个问题。 此时、切换器甚至会回复。

    感谢大家的帮助、
    Nathan