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.

[参考译文] TM4C129XNCZAD:在改变模式后、需要在激活芯片选择之前启用 SSI

Guru**** 2394305 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/686354/tm4c129xnczad-after-changing-mode-need-to-enable-ssi-before-activating-chip-select

器件型号:TM4C129XNCZAD

在相关帖子中发现启用 CS 并更改 SSI 模式的问题后、我确信我知道如何解决该问题。 想象一下,即使在调用 SSIConfigSetExpClk()之后才激活片选,损坏传输的问题仍然存在,我还是感到惊讶! 我发现了一些有趣的东西、并想分享我的发现、以防以后他人可能会有所帮助。

以下代码将导致与器件 A 的第二次通信会话的0xB0被破坏为0x58、0x00事务:

uint32_t dummy = 0;

//***** 器件 A 写入
SSIDisable (SSI3_base);
SSIConfigSetExpClk (SSI3_base、getSystemClockFreqHz ()、
SSI_FRF_MOTO_MODE_3、
SSI_MODE_MASTER、
2000000L、
8);

GPIOPinWrite (LCD_CSn_PORT、LCD_CSn_PIN、0);//芯片选择低电平
SSIEnable (SSI3_base);

SSIDataPutNonBlocking (SSI3_base、0xB0);
SSIDataGet (SSI3_base、&dummy);

//确保 Rx FIFO 为空
while (0!= SSIDataGetNonBlocking (SSI3_base、&dummy))
{
}

GPIOPinWrite (LCD_CSn_PORT、LCD_CSn_PIN、LCD_CSn_PIN);//芯片选择高电平


//***** 器件 B 写入
SSIDisable (SSI3_base);
SSIConfigSetExpClk (SSI3_base、getSystemClockFreqHz ()、
SSI_FRF_MOTO_MODE_0、
SSI_MODE_MASTER、
500000L、
16);
GPIOPinWrite (AM_CSn_PORT、AM_CSn_PIN、0);//芯片选择低电平
SSIEnable (SSI3_base);

SSIDataPutNonBlocking (SSI3_base、0x1234);
SSIDataGet (SSI3_base、&dummy);

//确保 Rx FIFO 为空
while (0!= SSIDataGetNonBlocking (SSI3_base、&dummy))
{
}

GPIOPinWrite (AM_CSn_PORT、AM_CSn_PIN、AM_CSn_PIN);//芯片选择高电平

//***** 器件 A 写入
SSIDisable (SSI3_base);
SSIConfigSetExpClk (SSI3_base、getSystemClockFreqHz ()、
SSI_FRF_MOTO_MODE_3、
SSI_MODE_MASTER、
2000000L、
8);

GPIOPinWrite (LCD_CSn_PORT、LCD_CSn_PIN、0);//芯片选择低电平
SSIEnable (SSI3_base);

SSIDataPutNonBlocking (SSI3_base、0xB0);
SSIDataGet (SSI3_base、&dummy);

//确保 Rx FIFO 为空
while (0!= SSIDataGetNonBlocking (SSI3_base、&dummy))
{
}

GPIOPinWrite (LCD_CSn_PORT、LCD_CSn_PIN、LCD_CSn_PIN);//芯片选择高电平}

原因是,正如您从下面的逻辑分析器屏幕截图中看到的,当调用 SSIConfigSetExpClk()将模式从0更改为3时,时钟信号极性实际上不会改变,直到调用 SSIEnable(),也就是我的示例是在 CS 被置为有效之后。

但是、如果我在  CS 置为有效之前启用 SSI 来略微更改代码、则在芯片选择变为低电平之前、时钟极性会切换、并且事务看起来正常:

回想一下、对 SSI 配置的更改在外设重新启用之前不会变为有效、这是非常有意义的。 但是,当深入尝试使代码正常工作的过程时,这并不是立即显而易见的--至少对我来说!

此致、

Dave

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

    很好的总结! 感谢您与社区分享。 我们中的一些 TI 人甚至收起这样的帖子、以便在需要时与其他人分享、因此非常感谢:)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢第二位的到来。

    我会(继续)认为"SPI 外设复位"-然后进行适当的初始化(专用于新候选器件)会降低(可能消除)"持续存在"(不正确)时钟极性。

    我对外设复位的信任(和信心)是、"始终从"已知条件"开始-这是"kiss"的主要指令-并且最好地保证"正常/习惯"(可预测)运行...   

    (需要观察"外设复位"-随后进行正确初始化-是否可以消除(意外)"唯一的函数调用序列"-在此处报告...)   

    这是预期的、"外设复位-随后进行适当的初始化(针对新选择的从器件)将确保时钟空闲电平 始终为"正确"-在这个从器件启用、"芯片选择"到达之前。

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

    您好、CB1、

    虽然复位外设通常是一个好的做法、但我认为它不会解决这个特定的问题。 实际上、如果您回忆一下原始线程、当我添加外设复位时、它实际上使我的问题立即发生。 这是因为复位会将 SPI 置于模式  当我切换到模式3时、时钟极性发生了变化。 无论复位是否完成、在将片选信号置为有效前启用外设至关重要、这样器件就不会看到时钟转换。

    此致、

    Dave

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    接受过牙科手术-早期-我可能(尤其是)讨厌-但仍然(恭敬)不同意。

    由于"即将被寻址从器件"-尚未(尚未)接收到其片选-那么它如何能够对"时钟极性的变化"敏感?

    这种情况必须证明是真的-您不同意-才能检测到"极性变化"并进行破坏性记录? 在多个(其他) ARM 器件上(较新且运行时钟速度提高50%以上)、这证明"绝不是这样!" (即仅当 CS 有效时-是感应到输入!)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 CB1、

    希望手术进展顺利、如果可以的话、我认为可以稍微缩小差距。

    Dave 所说的是、当他通过 CS 置位来更改极性以选择它时、它会检测极性的变化并将其注册为错误的转换。

    外设复位将器件置于模式0、当切换到模式3时、时钟极性会发生变化。 如果在 CS 线路被置位以选择从器件后完成切换到模式3、则会发生问题、解决方案就是在选择器件之前通过改变极性来实现、这样就不会"影响"时钟极性的改变"。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢 Ralph (从不是 imp值 海报 Ralf)-非常感谢。

    我是否可以注意到-我直接说-要求-"避免 CS 的应用-直到(两个)外设复位 -和重新初始化-完成!"

    然而-我的方向是、命令外设复位-然后完全/正确地初始化(针对从器件的确切要求)并且'then and only then '声明芯片选择。   这种做法一直而且只对我的团队有效-而且这种方法"将我们公开!"

    任何方法-上述之外-使奴隶受到"非法输入感应"的限制-(我认为)这是不允许的!

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

    我想我们可能会在这一点上稍微分开毛发。 我同意外设复位是一个好主意、我认为 Dave 也是这样。 我的理解是、他的评论描述了即使他复位外设、他仍然观察到这个问题、因为问题是他的芯片选择发生在外设配置完成之前! 因此、事件的顺序不符合您的建议、外设复位无法使他免受该问题的影响。

    因此、是的、这是一个很好的做法、但是在 CS 断言之前正确的外设初始化可能是一个更重要的关键。

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

    [引用 USER="Ralph Jacobi"]是的,这是一个很好的做法,但 CS 断言之前正确的外设初始化可能是一个更重要的关键。

    不知怎么说——我的观点——是“几乎”伪装的!

    从您的报价中-您说:

    • 这是一个很好的做法  

    但是、请遵循这一要求

    • 正确的外设初始化-在 CS 声明之前... 可能更加重要。

    然而、Ralph -正确的外设初始化 一直并且只包括在内-就像我的观点!   在外设复位后、它(最安全的)可以安全地提供-但这样的初始化一直是-甚至是回到先前的线程-是我的建议的要点!   同样、正如我一直说过的那样、CS 应该被置为"然后才会"!

    我没有改变!    我不知道怎么会有任何困惑...

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

    您好 CB1、

    也许我误解了您之前的评论。

    首先、我们进行了以下操作:

    [引用 USER="Dave Hohl]复位外设通常是一个好做法、但我认为它不会解决这个特定的问题。 实际上、如果您回忆一下原始线程、当我添加外设复位时、它实际上使我的问题立即发生。 这是因为复位会将 SPI 置于模式  当我切换到模式3时、时钟极性发生了变化。 无论复位是否完成、在将芯片选择置为有效前启用外设至关重要、这样器件就不会看到时钟转换。[/QUERP]

    然后,你的下一次答复说:

    [引用 user="CB1_MOBIST"]接受过牙科手术-早期-我可能(尤其是)喜欢-但仍然(恭敬)不同意。

    我认为我应该介入这个问题、以帮助澄清 Dave 所说的内容、因为这是因为他关注的是外设复位部分、而这是 Dave 没有坚决说明的重要意义所在。 很抱歉、如果我将您的意图误解为该帖子!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    CB1、作为一名接受过比我所承担的牙科手术更多的人、我会感到你的疼痛! :-)

    是的、Ralph、我认为您很好地总结了我想说的内容。 感谢您努力澄清问题。

    我认为我们大家都同意,尽管我们可能不完全理解我们每个人试图跨越的细微差别。

    此致、

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

    没有要求道歉,也没有要求道歉。   你在这里为这么多人提供了帮助——而且非常体贴——这一定要受到赞扬!

    然而,"外人"的努力也要求(有些)达成一致。   (除了“分开毛发”)   在创建此帖子期间,没有毛发受到伤害(更不用说分裂)。

    遵循我的评论的"收集"(真实副本)-特别关注 从器件芯片选择的关键到来

    2018年5月3日星期四下午7:41:
    这是预期的、"外设复位-随后进行适当的初始化(针对新选择的从器件)将确保时钟空闲电平始终为"正确"-在这个从器件启用、"芯片选择"到达之前。

    2018年5月4日、星期五下午12:47:
    这种情况必须证明是真的-您不同意-才能检测到"极性变化"并进行破坏性记录?   在多个(其他) ARM 器件上(较新且运行时钟速度提高50%以上)、这证明"绝不是这样!"   (即仅当 CS 有效时-是感应到输入!)

    2018年5月4日、星期五下午1:18:
    我是否可以注意到-我直接说-要求-"避免 CS 的应用-直到(两个)外设复位-和重新初始化-完成!"

    然而-我的方向是、命令外设复位-然后完全/正确地初始化(针对从器件的确切要求)并且'then and only then '声明芯片选择。

    任何方法-上述之外-使奴隶受到"非法输入感应"的限制-(我认为)这是不允许的!

    我看不到--鉴于这一压倒性的证据--如何(任何) "分开毛发" --是什么或是什么--认为 (无论如何) 是可以的……

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

    将这匹死马/死马有效地"摆脱其痛苦",最后的一个推动力可能会被证明是有用的。

    对于"外设复位"的值(或有效性)、似乎存在(一些)争议。   而且-总的来说-我会 (有时但很仔细)同意。

    然而-在恶劣条件下-甚至"不那么苛刻"-然而"长时间-运行/供电"一些、"干扰已被定期 注意到!"   (在从器件或主 MCU 上、或(甚至)在两者上。)   "外设复位"就在这里、这一点尤其重要!

    在我们的"国防和医疗设备工作"-其中"必须防止故障或中断"-我们发现它"非常有价值"、"定期使用外设复位"-之后是外设初始化-然后是"芯片选择置位"。   这种"更频繁的"调用外设复位" -最好的保证-"一切都好"-并且"保持在那个状态!"   此外、我们还可以 "重置从器件"-通过 GPIO 命令的断电/上电-或通过从器件复位-如果可用的话。

    相信"一个完成"-外设设置/配置-将确保"稳定运行"-没有证明情况-尤其是在"恶劣条件"和/或 "失败证明令人不愉快"的情况下。

    定期"强制 MCU 和从器件"-进入安全和已知的工作条件 (通过外设复位)-即使不需要(严格)也是如此-尤其是在不需要(严格)的情况下-证明是一种高效的方法-"增强系统稳健性!"