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.

[参考译文] MSPM0L1306:适用于 HOPERF 模块接口的 SPI 单路双向 PICO/POCI

Guru**** 2392905 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1475464/mspm0l1306-spi-single-bidirectional-pico-poci-for-hoperf-module-interface

器件型号:MSPM0L1306

工具与软件:

感谢您对此提供任何建议:

我正在连接到 CMOSTEK CMT2300A RFM300HW HopeRF 模块。 我必须争用(参考 P27/46 CMT2300A_EN_V1.0手动)"要注意、在读取寄存器时、MCU 和 CMT2300A 必须在地址位0和数据位7之间切换其 IO (SDIO)的方向。 需要 MCU 在发送 SCLK 的下降沿之前将 IO 切换到输入模式;CMT2300A 应在它看到 SCLK 的下降沿之后将 IO 切换到输出模式。 这可以避免 SDIO 发生数据争用(MCU 和 CMT2300A 同时将 SDIO 设置为输出模式)、这将导致意外的电气问题。"

我在 CPU 控制器输出线路上有一个电阻器 R14、如果射频模块和 CPU 决定同时输出、可以尝试用它来节省消耗的电量。

排除 Bitbanging 一切,什么是最好的方式来使这项工作? 我在软件中手动驱动 SPI 芯片选择、以便只要我需要、它就保持启用状态。

1.创建一个略低于最后一位完成传输时间的计时器中断、并将 SPI_PICO 引脚重新配置为输入、以便它在 SPI_CLK 转换之前停止驱动、从而使射频模块能够启动 TX

2.当从 CPU 向射频模块发送 SPI_PICO 寄存器地址时、将帧格式设置为7位以发送位7至1、然后通过将 SPI 引脚重新配置为 GPIO 和位拆裂最后一位来在软件中单独处理最后一位、然后再更改以读取寄存器数据?

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

    我注意到时钟相位已指定(在下降时设置、在上升时获取)、但极性未指定。 尽管图表建议 CPOL=0、但我想知道您是否可以使用 CPHA=1、CPOL=1、这会在字节之间无限期地阻止目标(CMT)端。 [比较 CMT2300A-Rev0.7图6和 TRM (SLAU847D)图20-7]。

    这几乎与 MICROWIRE 匹配、不同的是、该线路协议在请求(写入)和响应(读取)之间指定了一个额外的 SCLK、这会阻碍后者的发展。

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

    谢谢您 Bruce、您给了我一些建议。很抱歉、我之前没发过这个问题(请参阅 CMT2300A-Rev0.7手册)"芯片通过4线 SPI 接口与外部进行通信。 CSB 是的有源低电平芯片选择信号
    访问寄存器。 FCSB 是用于访问 FIFO 的低电平有效选择信号。 在上、它们不能设置为低电平
    充电。 SCLK 为串行时钟、其最高速度为5MHz、芯片本身与外部 MCU 在上发送数据
    SCLK 的下降沿、并在 SCLK 的上升沿捕捉数据。 SDA 是用于输入和输出数据的双向引脚。
    地址和数据从 MSB 开始传输。"

    我想知道他们的设计人员在想什么、因为他们引用的 SDA 和 SCL 与 I2C 命名法类似、并且在开始时具有 r/w 位? 通过尝试让它像 SPI 一样,他们创造了一个不快乐的婚姻。 另一个陷阱是称之为四线 SPI 接口、但它有2个片选、而不是2条单向数据线路。

    无论我做什么、我都必须在输入和输出之间切换 CPU PICO 线路、只有软件可以做到这一点? 您的回复帮助我意识到、一旦射频模块在时钟上升沿之后读取最后一位、我就可以将 Pico 线路切换到输入。 我可以从5MHz 可以处理的最大 SPI CLK 速率猜测、射频模块是否必须在该时钟周期的1/2内(大约100ns)完成数据线路采样? 如果 HopeRF 的技术支持人员知道确切的时间、我可以向他们咨询。

    我想我应该必须使用计时器中断、但如果 FIFO 满中断在读取的最后一个位的上升沿触发(因为 CPU SPI 始终接收 POCI)、我或许可以使用 FIFO 级别设置为1字节的 CPU SPI RX 中断? SPI FIFO RX 已满中断最好使用计时器中断、因为我不必根据 SPI 时钟速率(重新)计算计时器中断的计时器周期。 只要 SPI RX FIFO 中断软件例程在100nSec 之前不将 PICO 切换到输入、它就应该适合任何 SPI Clk 速率。

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

    这是一个有点不寻常的总线设计。

    是的、我希望您需要在软件中完成转换。 其中将包括在 PICO 引脚的 PINCM (IOMUX)寄存器中从 PF =切换 PF 设为 GPIO=1 (PF)。  在下一个事务之前的某个时间、您应设置 PF = 一降再降。 启动时、您将清除相关的 DOE31_0位。 因此、引脚是(a)启用输出的 SPI 或(b)禁用输出的 GPIO。

    我同意100ns (最小 SCK 周期的半个)必须有足够的时间来进行采样。 这实际上是一个很短的时间-在32MHz、只有4个 CPU 时钟、你需要花费比这更长的时间来进行切换。 对于5MHz SPI、我希望 在中断之前轮询 SPI。

    它看起来(?) 就像 FIFO 操作都是单向的、所以我想"花式招法"只适用于寄存器读取。

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

    感谢您确认我走在正确的轨道上-是的、只有读取射频模块寄存器才需要特殊的 SPI_PICO IO 引脚切换。
    与我之前使用的旧 MSP430相比、这些新的 MSPM0 MCU 具有广泛的外设配置选项。
    我认为我需要将 SPI 输出与引脚(PC 位)断开、并将其置于高阻态。
    "应用软件是否负责确保 IOMUX 设置不会发生冲突..."(ref p733 SLAU847D)是指如果配置不当、无论外部电路如何、MSPM0都会损坏自己?
    请参阅图9-1和9.2.1外设功能(PF)分配、其中列出了单独的步骤1至6、我只需要执行1至3、执行速度可能更快?
    "当未选择外设函数时(PF == 0)、输出锁存器被置于复位状态、从而产生输出
    NMOS 和 PMOS:禁用(除了任何使能的上拉电阻之外、使 IO 引脚保持在 Hi-Z 状态
    下拉电阻)。" REF p735 SLAU847D
    我可以同时将0写入 PINCM.INENA 位和 PC (永久连接)、并将 PF (输入连接)位保持关闭吗?
    我不确定这些步骤是否可以组合成一次快速写入 PINCM 寄存器? 如果存在内部 IOMUX 电路烧毁或 PICO 输出出现干扰输出的风险、我希望避免出现任何内部 MCU 竞争情况?

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

    我认为"负责"的评论是指"它可能不能正常工作",而不是"会损坏的东西"。 我不知道、例如如果你同时启用上拉和下拉、会发生什么情况、但我无法想象会有什么伤害。

    您可以执行步骤1-3来断开连接、然后执行步骤4-6来重新连接(尽管您不需要执行步骤(1)或(6)。

    TRM 提到(2)/(3)[已连接= 0、然后是 PF = 0]作为单独的步骤、但我不确定这是有必要的。 即使是 driverlib IOMUX 函数也在一个分配中设置所有配置。  

    您可能需要在断开连接时设置内部上拉电阻(但其他所有值均为=0)、仅为了在您的范围上提供有关导线为 Hi-Z 的指示。

    你有没有设备? 我想尽快确定 CPOL=1的技巧,而不是稍后。

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

    是的、不能正常工作会比损坏东西好得多。 我发现 MSP430通常可以经受住意外过流滥用、希望这会很糟糕。
    我可以遵循 TRM:
    IOMUX->SECCFG.PINCM[GPIO_SPI_0_IOMUX_PICO]= GPIO_SPI_0_IOMUX_PICO_FUNC;//首先清除 PC 位、最后一个输出状态被保留
    IOMUX->SECCFG.PINCM[GPIO_SPI_0_IOMUX_PICO]= 0;//现在可以将外设功能归零、而不会有纹波通过输出的风险、因为当 PC = 0时、输出保持锁存状态
    IOMUX->SECCFG.PINCM[GPIO_SPI_0_IOMUX_PICO]= IOMUX_PINCM_PC_CONNECTED;//外设零现在已"连接"(输出逻辑触发器现在将 HiZ 请求传递给驱动器逻辑)

    是的、Driverlib 似乎并不遵循 TRM。 如果他们认为没有人能够配置活动外设、或许他们可以摆脱这种束缚?

    为了避免 SPI 时钟极性问题在射频模块切换 SDIO 进行输出之前冻结数据、请参阅 p1243 TRM
    "时钟极性(CTL0.SPO)用于在不传输数据时控制时钟极性、仅在 Motorola SPI 帧模式下使用。"
    图20-7. SPO = 1和 SPH = 1时的 Motorola SPI 帧格式在保持恰好在转换之前的最后一位时、看起来像所需的那样。 但是、我不确定如何处理起始 MSB?
    您是否认为我应该在 SPO = 0和 SPH = 0时启动 SPI、然后在我加载 SPI 传输 FIFO 后、立即在传输过程中将其切换为 SPO = 1和 SPH = 1?

    我现在有一个手动焊接的原型、我可以使用它进行测试、另外4个也可以安装射频模块(如果放大)。

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

    如果 CMT 接受 CPOL=1、没有理由不始终使用 SPO=1/SPH=1。 我怀疑它可以接受 CPOL=1、但在我打赌我的项目具有某些功能之前、我喜欢在运行中看到这种情况。

    -------

    我想你的 register_read()看起来基本上像一个普通的:

    1) pico_connect ()

    2) 2)写入 TXDATA=请求

    3)旋转,直到 STAT:RFE=0 [非常短的时间]

    4) 4)阅读(并扔掉) RXDATA [您知道它的含义]

    5) pico_disconnect()

    6) 6)写入 TXDATA=虚拟

    7) 7)旋转、直至 STAT:RFE=0 [非常短的时间]

    8) 8)读取结果=RXDATA

    其中、您添加的全部是(1)和(5)。 我 个人会离开 Pico 的大部分时间(如上)因为我经常去,但这是你的电话。

    [编辑:我怀疑您不需要第三行:

    > IOMUX->SECCFG.PINCM[GPIO_SPI_0_IOMUX_PICO] = IOMUX_PINCM_PC_CONNECTED;//外设零现在已"连接"(输出逻辑触发器  

    由于"已连接至 PF = 0"最终与"未连接"的状态相同(Hi-Z)。 另请参阅:

    https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1467415/lp-mspm0l1306-glitch-generation-when-changing-pf-field-in-pincmx-register-to-0x0/5667370

    值得注意的是第(2)项[第一项]和第(3)项。]

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

    谢谢你给了我更多的想法。
    我正在实施一种"延迟先听后说"无线电协议。 我能够将射频从接收转换到发送的速度越快、就越精细、我就可以利用"通道监控分辨率时间"来避免冲突、从而将更多等待在通道空闲时同时通话的节点分隔开来。
    因此、编程步骤更少=更快=相同 LBT 周期内更多的独立时隙=更好地避免冲突。
    要从 RX 切换到 TX、我必须向 HopeRF 模块发送寄存器写入。
    现在我看,如果我把皮科都设置为去写一个阻力,它会加快事情的速度。
    RF 模块 FIFO 读取是非紧急的、我读取接收到的数据包的 RSSI 强度的寄存器读取也是如此。

    谢谢您向论坛提供该论坛的主题参考、很抱歉我很难理解它。 当 PC 仅通过更改 PF 断开连接时、它们是否以某种方式产生了输出干扰? 我无法看到他们重新连接 PC 的位置。
    摘自 TRM 图9-1. 超集 IO 切片、我是否正确认为 PC 连接已清除="冻结和保持输出状态"?
    因此、如果我未将 PF 设置为零、然后重新连接 PC = 1、FET 输出驱动器将保持导通并处理射频模块输出的问题?

    大多数情况下、我只会在完成 SPI PICO IO 切换后以及加载 SPI TX FIFO 后降低片选、这样、即使现在或更高版本的射频模块不希望 PICO 在 CS 下降时为高电平、它也绝不会在传输开始时看到。

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

    是的、回答正确。

    PMCU 通过 IORET 信号向 IOMUX 指示外设何时进入禁用状态、该信号通过逻辑"或"与 PC 信号结合以控制输出状态锁存器。 当进入 STOP 或 STANDBY 模式时、此机制可以保存电源域1 (PD1)外设的最后一个有效输出状态、因为 PD1外设在进入 STOP/STANDBY 模式时始终被暂时禁用、在退出 STOP/STANDBY 模式时被重新启用。

    在 PC 因更改 PF 而断开连接时、他们是否以某种方式产生了输出干扰?

    为避免干扰、请按照我们在 TRM 中提供的步骤更改 PF

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

    大家好、Gary、回到 SPI 接口、在16位传输的前8位被发送到 HopeRF 模块后、我现在尝试在硬件而不是软件中将 Pico 更改为高阻抗。 我打算使用计时器来触发到 PICO IO 配置的 DMA 传输、以在精心计算的时间将其置于高阻抗状态。 您能说明一下、在 TRM 表20.3.2 PICO (偏移= 8h)第1258页中、它同时具有 HIGHZ1 (位25)和 HIGHZ0 (位24)。 在引脚9.3.1 PINCM (偏移= 4h)页739的 IOMUX 寄存器上、该表几乎相同、但缺少列为保留的 HIGHZ0 (位24)。  

    问题:这两个配置寄存器可以控制相同的东西吗? 或者其中一个优先吗?

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

    我不确定我是否理解计时器的用途。 假设 CPOL=1技巧可行、您在 交接时总是可以将 Pico 置于 Hi-Z 中。

    另一个线程中的"毛刺"不是任何驱动低电平的问题、而是引脚进入 Hi-Z 时电压短暂下降、内部上拉电阻启动缓慢。 上拉状态是预期状态。 在本例中、Hi-Z 状态就是您想要的状态。

    我从未见过有关低 SPI 空间中所有这些有趣寄存器(SCLK、CS2_POCI2等)正在/正在执行的解释。 我没有看到它们不是0、并且我对它们的写入被忽略。 我认为应该选择 IOMUX 来实现所有这些目标。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="553652" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1475464/mspm0l1306-spi-single-bidirectional-pico-poci-for-hoperf-module-interface/5692303 #5692303"]问题:这两个配置寄存器控制的是相同的事情吗? 或者其中一个是否具有优先权?

    否、有不同之处。

    指示  PICO 中的 HIGHZ1和 HIGHZ0、以控制 Hi-Z 输出多路复用器的输出状态

    但 PINCM 中的 HIZ1用于控制 Z1、如下所示

    由于它们正在使用或组合、因此它们具有相同的优先级  

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

    谢谢您、Gary、所以我可以同时设置 HighZ1和 HighZ0、使 SPI PICO 具有高阻态、而无需断开 SPI 外设的连接。 如果 Z1不在输出多路复用器 DOUT 为零时将输出置于高阻态、那么它是否优于 IOMUX Z1?

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

    大家好、Bruce、对于软件 Juggling 的 CPOL=1方法我有点紧张、并认为如果我可以让硬件处理到 HiZ、那么我的代码将会更标准、让其他人遵循。 如果在硬件中进行高阻态转换、或许我也可以让接口以更高的比特率运行? HopeRF 手册建议我的 SPI 数据速率是无线电传输速度的2倍、我希望尽可能快地运行、以便我们能够拥有大量传感器阵列、并且与所有传感器通信的延迟最少。 使用 MSP430的我们之前产品的最大安装地点是具有327个光控制器的仓库。 它仍然运行良好。 我希望使用具有更多内存的 mspm0可以实现更多功能。 最复杂的部分是该射频模块通信。

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

    我认为 是这样

    [报价 userid="553652" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1475464/mspm0l1306-spi-single-bidirectional-pico-poci-for-hoperf-module-interface/5697545 #5697545"]如果在输出多路复用器 DOUT 为零时 Z1未将输出置于高阻态?[/QUOT]

    请参阅此表

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

    您好、Gary、

    我在尝试读取偏移8处的 SPI0->PICO 寄存器时遇到问题。

    I 定义:

    unsigned int SPIPICORead;

    电感

    当我尝试反汇编 LDR r0、[R0]、R0 = 0x40468008上的时候、就会出现"意外中断"、并在这里跳转:

    /*这是在处理器收到意外 */时调用的代码
    /*中断。  这只是进入一个无限循环、从而保留了系统状态*/
    /*供调试程序检查。                        */
    Default_Handler ()
      /*进入无限循环。 */
      while (1){
      }
    }

    我做了什么错了吗?

    谢谢 Antony

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

    CCS 似乎有一些问题、我们已向工具团队报告将在将来修复该问题。