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.

[参考译文] TCAN4550:tcan4x5x:探测器失败,错误-22

Guru**** 2540720 points
Other Parts Discussed in Thread: TCAN4550

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1018348/tcan4550-tcan4x5x-probe-failed-with-error--22

器件型号:TCAN4550

尊敬的团队:

当我在 Linux 内核版本4.14.98中使用 tcan4x5x 驱动程序时、我将面临以下问题

[27.788175] tcan4x5x spi0.0:不支持的版本号:0
[28.034275][ ] tcan4x5x_CAN_probe +0x318/0x550
[28.085188][ ] tcan4x5x_CAN_DRIVER_INIT+0x18/0x20
[28.35743][ ] tcan4x5x_CAN_probe +0x320/0x550
[28.408271][ ] tcan4x5x_CAN_DRIVER_INIT+0x18/0x20
[28.681485][ ] tcan4x5x_CAN_probe + 0x32c/0x550
[28.73231][ ] tcan4x5x_CAN_DRIVER_INIT+0x18/0x20
[29.004399 ][ ] tcan4x5x_CAN_probe +0x334/0x550
[29.055230][ ] tcan4x5x_CAN_DRIVER_INIT+0x18/0x20
[29.088498] tcan4x5x spi0.0:探测器失败,错误=-22
[29.097673] tcan4x5x:spi0.0的探测失败,错误-22

请帮助我解决此问题。 我遍历了前面的查询并进行了相应的更改、但驱动程序返回值-22。

此致、

AyshaTT

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

    尊敬的 Aysha:

    查看此 E2E 帖子、发现错误-22 可能与不受支持的 MCAN IP 版本相关联。 请确保您的所有版本定义都准确无误。 我将通读此主题和相关主题、看看这是否是类似的问题。  

    作为免责声明、我对该器件的 Linux 驱动程序没有太多经验、因为它们是开源的、主要由 Linux 社区维护。 我们最适合回答有关器件及其工作原理的问题。  

    此致、
    Eric Schott

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

    尊敬的 Eric:

    我们的观察结果是、tcan 在复位后不处于活动状态。

    我们将按如下方式进行重置

    1. 系统启动时、复位 GPIO 处于低电平状态(在 DTS 文件中、复位 GPIO 配置为高电平有效)
    2. 将 GPIO 复位为高电平60微秒  
    3. 之后将 GPIO 复位为低电平

    我们如何确保 TCAN 器件已启动?

    此致、

    AyshaTT

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

    尊敬的 Aysha:

    当 TCAN4550最初上电、通过 RST 引脚复位或从睡眠状态唤醒时、它将转换为待机模式。 INH 引脚的状态是器件处于此工作模式或任何其他工作模式的最简单指示。 这是一个电池电平开源输出、用于启用本地稳压器。 只要器件不处于低功耗睡眠模式、就会启用该功能。 要在上电、复位或唤醒事件之后开始正常运行、需要通过 SPI 写入(模式控制寄存器 h0800、位7:6)命令器件从待机模式切换到正常模式。  

    如果 INH 在发送 RESET 命令后未置为有效(进入 Vsup 电位)、请确保器件在 Vsup 时正常供电。 请记住、由于 INH 是一个开源输出、如果没有到接地的外部泄漏路径、则在 INH 取消置位后可能需要一段时间才能下降到 GND 电位。  

    此致、
    Eric Schott

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

    尊敬的 Eric:

    "要在上电、复位或唤醒事件之后开始正常运行、需要命令器件通过 SPI 写入(模式控制寄存器 h0800、位7:6)从待机模式切换到正常模式。"

    在 tcan4x5x 驱动器中、函数  tcan4x5x_init (mcan_class)执行上述操作。 在该函数下、它设置寄存器 h0800。

    RET = regmap_update_bits (tcan4x5x->regmap、TCAN4X5X_CONFIG、
    TCAN4X5X_MODE_SEL_MASK、TCAN4X5X_MODE_NORMAL);

    请告诉我、在驾驶员中、还需要做哪些其他更改?

    此致、

    AyshaT

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

    尊敬的 Aysha:

    这看起来是正确的、只要 SPI 接口响应、就会将器件更改为正常模式。 您是否能够观察到 INH 输出在复位后变为有效? 您能否回读配置寄存器中的模式控制位值以确认器件是否处于正常模式? 尝试运行软件时是否仍然遇到原始错误?

    此致、
    Eric Schott

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

    尊敬的 Eric:

    "这看起来是正确的、只要 SPI 接口响应、就会将器件更改为正常模式"

    >>我们将 SPI 模式值接收为0。 我们已经检查了 SPI 引脚 CS、CLK 和 MOSI 的预期观察结果。 但是 MISO 引脚没有变化、它处于低电平状态。 该观察结果是在示波器中完成的。 这些引脚的配置是正确的。

    "您是否能够观察到 INH 输出在复位后变为有效?"

    >>是的

    "您能否读回配置寄存器中的模式控制位的值以确认器件处于正常模式?"

    >>由于 MISO 引脚不响应、控制位的值无法读取。

    "在尝试运行软件时、是否仍然遇到原始错误?"

    >>是的、我得到的值与相同

    [29.088498] tcan4x5x spi0.0:探测器失败,错误=-22
    [29.097673] tcan4x5x:spi0.0的探测失败,错误-22

    在示波器中检查加电时序序列时、我们观察到以下情况

    1. FLTR 和 Vccout 出现后、VIO 升高。 但在数据表图15中。 加电时序、FLTR 和 Vccout 在 VIO 出现后升高。 这是否会导致上述问题? 由于 Vccout 和 FLTR 是模块的输出、为什么这两个电压都要高于 VIO 电压?
    2. 一旦 CLK 稳定、INT 不会像加电时序中提供的那样变为高电平、中断引脚在最初的4分钟内保持低电平。 4分钟后、INT 变为高电平、VCCOUT 和 CLK 变为低电平。 这是预期吗? (我们为此 INT 引脚提供了10K 上拉电阻器)

         

        

      

      下图显示了 CLK 和 VIO 的行为、

     

    是否期望所有这些观察结果?

    此致、

    艾沙 T

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

    尊敬的 Aysha:

    1.在器件处于待机状态时启用 Vccout (和 VFLT)。 通常情况下、这是 INH 输出将启用3.3V 稳压器以便开始提供 Vio 的地方。 预计 Vccout 会在器件最初上电后很快出现。 注意图15未显示 Vsup 和 Vio 之间的直接关系、因为 Vio 由外部源供电。 指定了 Vsup 变为活动状态和 Vccout 变为可用状态之间的延迟。  

    2.初始上电后、PWRON 中断标志将被置位、从而使 nINT 输出有效(拉低)。 只有当时钟信号出现时、器件才能在内部访问此状态。 从示波器屏幕截图中可以看到、nINT 信号在短时间内保持高电平、但上拉电阻太弱、无法在识别 PWRON 复位中断并由 TCAN4550将信号驱动为低电平之前将信号提升到很高的电平。  
    在待机模式下(未切换至正常模式)无活动4分钟后、TCAN4550将自动进入睡眠模式。 在睡眠时、INH 输出、Vccout 和时钟放大器关闭。 nINT 线路也将变为 high-z 这样做是为了在本地节点未正确启动的情况下将器件保持在最低功耗状态。 为了避免这种睡眠状态、必须在初始启动或唤醒的 tINACTIVE 内通过 SPI 写入将器件置于正常模式。  

    听起来、SPI 寄存器在启动后没有响应。 这让我相信时钟信号可能存在问题、因为访问内部 SPI 寄存器需要时钟信号。  

    • 是否可通过 SPI 访问器件诊断寄存器(h0000 - h000C)? 这些寄存器不需要时钟输入即可访问。  
    • TCAN4550的时钟输入源是什么。 这是晶体还是单端时钟输入? 所需的时钟频率是多少?
    • 如果可能、请分享原理图。 如果适用、我对晶体电路特别感兴趣。 您可以通过电子邮件与我私下分享(单击我的姓名查看我的 E2E 个人资料)。  
    • 您能否捕获时钟输入的长期示波器截图? 我想看看这个信号是在任何时候切断还是变得不稳定。  

    此致、
    Eric Schott

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

    尊敬的 Eric:

    感谢您的详细答复。

    请直接查找您问题的答复。

    "注意图15未显示 Vsup 和 Vio 之间的直接关系、因为 Vio 由外部源供电。

    指定了 Vsup 变为活动状态和 Vccout 变为可用之间的延迟"

    >>您能否确认此 VIO 电压观察结果不会造成任何问题?

    "1.是否可通过 SPI 访问器件诊断寄存器(h0000 - h000C)? 这些寄存器不需要时钟输入即可访问。 "

    >>我们无法读取这些值。 寄存器值返回零。

    "二. TCAN4550的时钟输入源是什么。 这是晶体还是单端时钟输入? 所需的时钟频率是多少?"

    >>这是一个晶体。 时钟频率为40MHz。

    " 3. 如果可能、请分享原理图"

    >>我们通过邮件共享了原理图。

    "四. 您能否捕获时钟输入的长期示波器截图?"

    >>已连接时钟捕获。

    注意:时钟稳定、在器件进入睡眠模式(持续4分钟)之前没有截止时间。

    供参考、

    当前、中断在时钟启动时变为高电平、并在1mil 秒后变为低电平。 随附的捕获 FYR。

    期待您的回复。

    此致、
    艾沙 T

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

    尊敬的 Aysha:

    感谢您的快速回复和超大屏幕截图。 这里的时钟信号看起来不错。 看到这一点并听说诊断寄存器没有响应、我不怀疑这主要是时钟问题。 也就是说、如果可能的话、我建议修改晶振电路以在 OSC1 (和 OSC2)走线上包含一个串联电阻器。 这将允许稍后对电路进行调优。  

    您能否捕获 SPI 通信线路的示波器截图、以便我们确认此处是否满足格式和电气要求? 请包括 MOSI、MISO、NCS 和 SCLK。 我希望看到一个 while SPI 帧、同时仍然能够区分各个位的值。 如果您的示波器具有逻辑分析仪功能、最好包含解码的 SPI 信息。

    此致、
    Eric Schott

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

    尊敬的 Eric:

    很抱歉耽误你的回答。

    在注释以下代码行后、我们观察到 SPI 线路中的信号、

    文件:drivers/SPI/SPI-IMX.c
    函数:静态空 SPI_IMX_buf_Rx_swap_u32 (struct SPI_IMX_DATA * SPI_IMX)
    注释行: Val &= SPI_IMX->WORD_MASK;

    函数静态空 SPI_IMX_buf_TX_SWAP_u32 (struct SPI_IMX_DATA * SPI_IMX)
    注释行Val &= SPI_IMX->WORD_MASK;

    我们已尝试以下发送 CAN 的测试用例、

    测试案例1板对板 CAN 测试
       我们将执行以下命令、
       在板1中:
             IP 链路设置 CAN0 UP 类型 CAN 比特率125000
             CANDump CAN0

       在板2中:
           IP 链路设置 CAN0 UP 类型 CAN 比特率125000
           发送 CAN0 123#AABBCCDD

    1号电路板未打印2号电路板发送的值。 CANH 和 CANL 显示连续数据传输。 已附加 CANH (蓝色)和 CANL (黄色) FYR 的图像。



    测试案例2:M_CAN 内部回路测试模式

    对于内部回送、我们设置寄存器16'h0800[21]= 1和16'h0800[0]= 1。 并在单个板中执行以下命令。
       
       IP 链路设置 CAN0 UP 类型 CAN 比特率125000
       CANDump CAN0&
       发送 CAN0 123#AABBCCDD

    CAN0中未接收到值123#AABBCCDD。
       

    此致、
    艾沙 T


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

    尊敬的 Aysha:

    您是否能够与器件建立良好的 SPI 通信? 如果是、您如何验证这一点? 您是否能够始终如一地向器件读取和写入(已验证)信息? 如果没有、请共享 SPI 捕获、以便我可以查看电气数据和格式数据。  

    我不太熟悉与 TCAN4550不直接相关的 Linux 驱动程序。 如果可能、让我们将此讨论保持在较高的水平:寄存器值、所需的配置、电气观察结果等  
    在测试1期间、您能否在器件传输这些脉冲时读取中断寄存器的值? 虽然对于该数据速率、脉冲看起来太短且不频繁、但器件似乎正在发送错误帧。 我想了解器件报告的内容。 此外、在此测试期间、CAN 总线的特征是什么? 终止值是多少? 电缆有多长?  CAN 板上是否有任何其他无源组件?

    对于测试用例2、"测试模式"通过禁用收发器或 CAN 控制器来显著改变器件的行为。 在您描述的情况下(CAN 控制器测试模式)、收发器被禁用、TXD 和 RXD 功能分别被映射至外部引脚 GPO2和 GPIO1。 这允许将外部收发器与 TCAN4550 CAN 控制器配合使用。 在此模式下、TCAN4550的 CANH 和 CANL 引脚未使用。  

    此致、
    Eric Schott

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

    尊敬的 Eric:

    感谢您的回复。

    是的、我们能够建立 SPI 通信。 我们使用 CRO 和逻辑分析仪进行了验证。 是的、我们能够在器件中读取/写入数据。

    在测试1期间、中断值为高电平。 终端值 I s 120 Ω。  电缆小于1米。

    在测试2期间、我们测试了图29。 SPI 和 M_CAN 内核测试模式图30。 M_CAN 内部回路测试模式。 在图29测试中,GPIO 中没有信号变化,并且端口转储中没有收到打印。 在图30测试中,candump 接收了从 cansend 发送的打印。

    此致、
    艾沙 T

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

    尊敬的 Aysha:

    感谢您提供的额外信息。 这为我清除了一些问题。  

    在测试1期间、中断寄存器('h0820)的值是多少? 如果指示了 MCAN 中断、请同时分享 MCAN 中断寄存器('h0824)的值。 如果指示 SPIERR、请分享器件状态寄存器('h000C)的值。  

    CAN 控制器期望在 TXD (GPO2)线路上看到它驱动的值、RXD (GPIO1)线路上显示了这些值。 如果在这里看到一个不同的值、它将识别它已丢失仲裁(TXD =高电平、RXD =低电平)或者它无法驱动 CAN 总线(TXD =低电平、RXD =高电平)。 无论采用哪种方式、器件都不会尝试继续执行 CAN 帧。 在内核测试模式(图29)期间、GPIO1和 GPO2引脚是否连接在一起以从外部回路该信号?

    如果上述情况已正确配置、请在两次测试期间读取中断寄存器、以查看行为发生变化的位置。 了解中断寄存器的值和相应的其他中断将有助于我们确定器件为何看起来未按预期进行传输。  

    此致、
    Eric Schott

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

    尊敬的 Eric:

    在测试1期间、将在不同的位置捕获0x0820、0x0824、0x000C 寄存器的值、

    在向 FIFO 写入数据"AABBCCDD"之前、

    • 中断寄存器('h0820)为0
    • MCAN 中断寄存器(h'0824)为0。   
    • 器件状态寄存器(h'000c)为28000008 (十六进制)。   

    2.将数据"AABBCCDD"写入 FIFO 后、将值写入"Tx 缓冲区添加请求(h'10d0)"。
    发生中断、驱动程序跳转到 ISR 服务。在中断服务例程中、这些值与下面的值相同

    • 中断寄存器('h0820)为0
    • MCAN 中断寄存器(h'0824)为0。
    • 器件状态寄存器(h'000c)为28000008 (十六进制)。

             添加了有关中断和控制寄存器的更多信息、

    • 中断寄存器(h'1050)为1800 (十六进制)。
    • 控制寄存器(h'1018)为8300 (十六进制)。

    '在内核测试模式(图29)期间、GPIO1和 GPO2引脚是否连接在一起以从外部回路该信号?'
    >>是的、GPIO 连接在一起以支持回送。


    此致、
    艾沙 T

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

    尊敬的 Aysha:

    根据此处的状态寄存器值、器件似乎报告了内部访问错误。 这可能会导致从另一个中断寄存器读取的值不准确。 例如、当外部中断引脚被置为有效时、我希望中断寄存器设置一些标志。  

    我将研究此误差的可能来源、并将在明天返回给您。  

    此致、
    Eric Schott

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

    尊敬的 Aysha:

    这种内部访问错误可能是尝试访问无效地址的结果。 请确保相应头文件中的所有地址值都正确。  

    是否可以捕获 MCU 和 TCAN4550之间 SPI 通信的示波器截图? 我希望能够看到帧中的每个位、以确保满足电气和格式要求。 这也可能会向我们显示初始化过程中可能出现的无效地址。  

    关于您之前运行的测试模式测试、请注意、在连接 GPIO 的情况下、"回送模式"的运行方式与"控制器测试模式"的运行方式不同。 在控制器测试模式期间、RXD 引脚不会被视为传入消息、因为这与驱动外部收发器时监控总线状态相同。 因此、该器件不会是任何"在 canndump 接收到的打印"、因为该器件仅在发送而不是接收。 这可能是我们看到两种测试模式情况不同结果的原因。  

    此致、
    Eric Schott