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.

[参考译文] RM48L950:强制 SPI 移位寄存器进入默认状态、

Guru**** 2487425 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/725886/rm48l950-forcing-spi-shift-registers-to-default-state

器件型号:RM48L950
主题中讨论的其他器件:HALCOGEN

您好!

将 MibSPI 的移位寄存器初始化为默认状态的正确方法是什么?
在我们的应用中、RM48xx 用作 SPI 从器件、有时我们会在时钟信号上产生噪声
进而被误识别为时钟脉冲、从而导致通信问题。

作为一种权变措施、我们尝试重置移位寄存器值、
根据手册中的说明、当 SPIGCR1寄存器的 SPIEN 位为0时
移位寄存器应强制为默认状态。

我们试图强制 SPIEN 位为0、但它不起作用、
我们是否需要任何其他设置来重置移位寄存器?

此致
巴杜语

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

    是的、清零 SPIEN 将复位 TX 和 RX 移位寄存器、SPIDATx 寄存器、SPIFLG 寄存器和 SPIBUF 寄存器。 当"它不工作"时、您会看到什么?

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

    您好、Sunil、

    非常感谢您提供的信息。

    很抱歉、信息不完整。
    详细调试后、我们发现如果 SPIEN 位被清零、移位寄存器被清零。
    但是,在我们的情况下,MibSPI 缓冲器 RAM 指针会偏离...是否有任何方法可以清除缓冲器指针?
    与 SPI 主器件发送的数据相比、发送/接收缓冲器数据都是偏离或未对齐的。

    我稍后将发送详细的示波器截图、请您注意
    请告诉我是否有任何方法来清除 MibSPI 缓冲器 RAM 指针。

    此致
    巴杜语

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

    您可以使用多缓冲模式使能寄存器(MIBSPIE)的 MSPIENA 域(位0)在地址偏移量0x70处禁用并重新启用多缓冲模式。 您还可以始终复位整个 MibSPI 模块并再次初始化、方法是向偏移量0x00处的 SPI 全局控制寄存器0 (SPIGCR0)的 nRESET 位写入0、然后再写入1。

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

    您好、Sunil、

    很抱歉我的答复很晚。

    实际上、我们还无法解决这个问题。
    我们无法复位 MibSPI 模块、因为 SPI 引脚也用作 I/O
    复位将影响其他特性、因此唯一的方法是复位 RAM 指针。

    下面是主器件和 RM48xx-slave 器件的环路操作的详细信息、
    MSPIENA 复位后似乎略有改善、但仍然是 RM48xx 中的数据未对齐。

    正常运行:
    SPI 主器件 Tx: 0x02、0x01、0x04、0x03、0x06、0x05、0x08
    RM48xx 从器件 Tx:0x02、0x01、0x04、0x03、0x06、0x05、0x08
    
    时钟信号中的噪声:
    SPI 主器件 Tx: 0x02、0x01、0x04、0x03、0x06、0x05、0x08
    RM48xx 从 Tx:0x08、0x04、0x10、0x0C、0x18、0x14、0x20
    
    根据您的建议进行修改:
    
    SPIEN 复位后:
    SPI 主 Tx: 0x02、0x01、0x04、0x03、0x06、0x05、0x08
    RM48xx 从器件 Tx:0x00、0x00、0x06、0x05、0x08、0x07、0x02
    
    在 MSPIENA 复位后:
    SPI 主器件 Tx: 0x02、0x01、0x04、0x03、0x06、0x05、0x08
    RM48xx 从 Tx:0x04、0x03、0x06、0x05、0x08、0x07、0x02 

    请告诉我是否有任何方法可以重置 RAM 指针。

    此致
    巴杜语

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

    每次您复位 MibSPI 模块、甚至是多缓冲模式时、该模块都会执行 RAM 的自动初始化。 在继续配置 TX 缓冲区之前、应用程序必须等待此初始化完成。 您的应用程序是否考虑了这一点?

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

    您好、Sunil、

    感谢您提供快速信息。
    很抱歉耽误你的时间。

    是的、为自动初始化提供了足够的等待时间。
    我们将使用从 Halcogen 生成的代码、如下所示、
    但我们认为在这种情况下、Halcogen 代码可能不够。

    数据接收函数:
    
    uint32 mibspiGetData (mibspi_t * mibspi、uint32 group、uint16 * data)
    {
    *用户代码开始(8)*/
    */*用户代码结束*/
    
    mibspiRAM_t * ram=(mibspi == mibspiREG1) mibspiRAM1:(mibspi =mibspiREG3) mibspiRAM3:mibspiRAM5);
    uint32 start =(mibspi->TGCTRL[组]>> 8U)& 0xFFU;
    uint32 end =(group == 7U)(((mibspi->LTGPEND & 0x00007F00U)>> 8U)+ 1U):((mibspi->TGCTRL[group+1U]>> 8U)& 0xFFU);
    uint16 mibspiFlags = 0U;
    uint32 ret;
    if (end =0U){end = 128U;}
    
    while (开始<结束)
    {
    mibspiFlags |= ram->rx[start].flags;
    /*SAFETYMCUSW 45 D MR:21.1 "仅此驱动程序允许有效的非 NULL 输入参数"*/
    *data = ram->rx[start].data;
    /*SAFETYMCUSW 567 S MR:17.1,17.4 "需要指针增量"*/
    Data++;
    Start++;
    }
    
    RET =((UINT32) mibspiFlags >> 8U)& 0x5FU;
    //用户代码开始(9)*/
    //*用户代码结束*/
    
    返回 ret;
    } 

    除了清除寄存器之外、还有其他与 MibSPI RAM 相关的设置吗?  

    根据 halcogen 代码、所使用的缓冲区似乎介于 TGxCTRL 组的开头之间
    到下一个组的开始、在这种代码中、如果通信在之间停止、
    指针将变得不确定、这可能导致缓冲区数据不对齐。

    我们是否可以仅为 mibspiInit()内的唯一 Group0设置 TGxCTRL 的 PSTARTx 的值?
    以避免此问题?

    此致
    巴杜语

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

    很抱歉打扰你、
    请告知我,对於最后一项答覆有否建议。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Paddu、

    很抱歉耽误你的回答。 在多缓冲从机模式操作中、只有一个传输组、即传输组0。 该 TG0由 SPInCS 引脚触发。 每次触发 TG0时(nCS 由主器件置为有效)、或在传输过程中达到 TG0的末尾、或者在(指针复位模式) PRST = 1时发生触发事件(nCS 置为有效)、组的 PSTRT 都会复制到 PCURRENT。

    对于时钟线路上的干扰情况、可以尝试在 TG0CTRL 寄存器中设置 PRST=1。 尽管不建议在从模式下使用、但它可能会导致您所需的行为。 为了使这正常工作、主器件必须将芯片选择置为无效、然后将芯片选择置为从器件。

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

    感谢您的建议、
    很抱歉、反馈延迟。

    我们尝试在 TG0CTRL 寄存器中设置 PRST=1、但遗憾的是、我们无法解决该问题、
    实际上、此应用不使用芯片选择(nCS)引脚(启用芯片选择保持)。
    因此、如果我们不使用片选、"PRST=1 "可能无法正常工作?
    为了防止您确认没有其他方法可以重置缓冲区指针。

    此致
    巴杜语