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.

[参考译文] MSP430F5438A:主器件在 SOMI 引脚上始终接收高电平

Guru**** 2553450 points
Other Parts Discussed in Thread: MSP430F5438A

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/770148/msp430f5438a-master-always-receiving-high-on-somi-pin

器件型号:MSP430F5438A

你(们)好。

我正在开发一个具有 MSP430F5438A 的项目、该项目在 SPI 模式下作为主器 件工作、而8051微控制器则作为从器件工作。 从器 件的编程方式使其镜像通过 MOSI 引脚接收的数据并将其发送回 SOMI 引脚。 我需要使用该信号来进一步配置项目状态、但我没有从 SOMI 引脚获取所需的信号。 无论 CLK 和 TXBUFF 信号如何、我只会获得连续高电平。

我在3线制 SPI 模式下使用 USCI A0。

下面是我配置系统的方法:

 

//---- 定义引脚---
#define UCA0CLK BIT0//SPI_A0 CLK 引脚 p3.0
#define UCA0STE BIT3 //SPI_A0 STE 引脚3.3
#define UCA0SIMO BIT4 //SPI_A0 SIMO 引脚3.4
#define UCA0SOMI BIT5//SPI_A0 SOMI 引脚3.5

 

int main (空)

WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器

//------ SPI 引脚配置---
//P3.0=UCA0CLK;P3.3=UCA0STE;P3.4=UCA0MOSI;P3.5=UCA0MISO

P3OUT |= UCA0STE;        //到引脚 P3.0、3、4、5的高输出。 所有其他引脚为只读输入引脚。
P3DIR = 0x19          //端口引脚 P3.0、3、4配置为输出
P3SEL = 0x31          //选择 SPI A0 3线外设模块功能

//------ SPI 初始化---
UCA0CTL1 |= UCSWRST;//软件复位被启用
UCA0CTL0 |= UCMST + UCSYNC + UCMSB;//主模式;从器件低电平有效的3引脚 SPI;同步模式;MSB 优先
UCA0CTL1 |= UCSSEL_2;// BRCLK 源时钟为 SMCLK
UCA0BRW |= 0x0002;// f (位时钟)=f (BRCLK)/2
UCA0MCTL |= 0;//始终保持为零
UCA0CTL1 &=~UCSWRST;//机器就绪
UCA0IE |= UCRXIE;//接收中断使能

P3OUT |= UCA0STE;//设置 STE=1

P3OUT &=~UCA0STE; //设置 STE=0

一旦我设置"P3SEL=0x31"SOMI 将给出高信号并且 RXBUF 接收器的返回值为0xFF。

我发现初始化有问题、因此我只尝试在输入 或输出方向设置 P3DIR、但当我将 SOMI 引脚设置为输入时、它就开始向我提供高电平信号。 即使尝试将 STE 短接至接地、以始终保持为零、因为从器件处于低电平有效状态、但结果不变。

是否有任何建议或需要更改计划?

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

    您是否有办法监控 SOMI 引脚以查看该引脚上的实际数据? (示波器、逻辑探头等?)
    如果您不使用8051从器件并将 SOMI 和 SIMO 引脚短接在一起、会发生什么情况?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    查看端口引脚电路原理图、方向由 P3DIR.x 控制、但该表告诉 P3DIR 是一个无关 P3SEL.x 是否被置位的参数。 就我记忆中的项目而言、这是正确的。

    P3IN.x 应始终反映引脚的物理状态。 P3IN 信号不由 P3DIR 或 P3SEL 切换。 至少这就是引脚化学特性所说的内容。

    您可以使用 UCA0STE 引脚作为从器件的芯片选择。 然而、当它将 amster 切换到受控模式时、"UCA0STE"只能作为输入有意义。 对于从设备 vHIP 选择,您可以使用任意所需的引脚来构成任意端口。 它是一个简单的、用户控制的逻辑信号。 使用名称 UCA0STE 会产生误导。 您可以为同一 SPI 接口使用任意数量的 CS 信号、通过相同的 MOSI 和 SIMO 线路来寻址任意数量的从器件。

    因此、最好定义信号 CS (或 SLAVE1_CS)并使用它。

    只要 CS 处于高电平、从器件就会保持中性。 当 CS 变为低电平时、受控器件可能会也可能不会将 SOMI 驱动为低电平(或高电平)、具体取决于其 SPI 模式和它要传输的第一个位。

    IIRC、TI 极性与摩托罗拉极性相反。 因此、您需要为"高电平无效"时钟设置 CKPL。

    当 CKPL=0时、会出现一个可能的模式错误、配置似乎是正确的。


    但是、如果在这个配置之后您只检查 UCA0RXBUF、难怪它显示0xff。 要接收任何内容、必须创建时钟脉冲。 和时钟脉冲是通过发送东西来产生的。

    如果 OYU 向 UCATXBUF 写入一个字节、则向从器件发送8位。 对于您发送的每个位、一个位被接收到 RXBUF 中。 在从器件尚未接收到字节的情况下、从器件发送接收到的 bis。 因此、它不会回波(除非在硬件级别配置它 、将 MOSI 信号镜像到 MISO 引脚、就像网桥那样)。 通过设置 UCA0STAT.UCLISTEN 位、可以在 USCI 内部实现此目的。

    通常、(使用编程的 I/O)、当你发送第一个字节时、从器件在你收到被插入的东西时(无论从器件在知道你发送给他之前打算发送给你的是什么)接收到它。 当您发送下一个字节时(如果您希望第一个字节传输在您开始下一个字节传输之前结束、请检查 TXIFG 位以获取无缝缓冲发送或 UCA0STAT.UCBUSY) 然后、在发送第二个字节时、您将收到从器件的第一个字节的返回值。

    SPI 需要记住的两个事项是:

    无发送、无接收和

    您将在下一次发射时得到应答

    好的、不要过早将 CS 设置为高电平。 等待 UCBUSY、这样从器件在您取消选择它之前已经接收到最后一个位。 否则传输将被取消、从机将不会接收到完整的字节、即使 TXIFG 早已置位、也表示 TXBUF 为空。 是的、TXBUF 为空并且为下一个字节做好准备、但是移位寄存器仍忙于发送最后一个字节。 双缓冲行为很容易导致混淆。 但它可以最大限度地提高吞吐量、因为您可以始终在 TXBUF 中等待下一个字节、在这里输出寄存器可以毫不延迟地获取该字节以进行无缝传输。

    在这个论坛上、有很多关于 SPI 和 USCI 的主题。 搜索它们以获取其他信息。

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

    我在示波器上查看 SOMI 和 SIMO 发出的信号。
    我尝试绕过8051从器件来短接 SOMI 和 SIMO 引脚、在两个引脚上都具有相同的信号模式。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、先生、

    感谢您的回复。

    以下是我的观察结果(PS:在示波器上查看所有观察结果以及在调试模式寄存器中查看。)

    [引用 USER="Jens-Michael Gross ]P3IN.x 应始终反映引脚的物理状态。 P3IN 信号不由 P3DIR 或 P3SEL 切换。 至少这是引脚化学特性所说的内容。[/quot]

    已在调试模式下检查 P3IN、并且正确。 但我仍会在 P3SEL 之前放置一行、以设置 P3IN 寄存器。

    [引用 USER="Jens-Michael Gross"]您使用 UCA0STE 引脚作为从器件的片选。 然而、当它将 amster 切换到受控模式时、"UCA0STE"只能作为输入有意义。 对于从设备 vHIP 选择,您可以使用任意所需的引脚来构成任意端口。 它是一个简单的、用户控制的逻辑信号。 使用名称 UCA0STE 会产生误导。 您可以为同一 SPI 接口使用任意数量的 CS 标志、通过相同的 MOSI 和 SIMO 线路来寻址任意数量的从器件。[/引用]

    已尝试将 UCA0STE 引脚短接至接地。 仍然具有相同的结果、即高 SOMI 信号。

    [引用 USER="Jens-Michael Gross ]IIRC、TI 极性与摩托罗拉极性相反。 因此、您需要为"高电平无效"时钟设置 CKPL。[/QUERP]

    我将为一个"高电平无效"时钟设置 CKPL。

    [引用 USER="Jens-Michael Gross 的说法]但是如果在这个配置之后您只检查 UCA0RXBUF、它显示0xff 就不足为奇了。 要接收任何内容、必须创建时钟脉冲。 和时钟脉冲是通过发送内容创建的。[/quot]

    在 SMCLK 上创建了一个4MHz 的时钟脉冲并将其用于代码中、但结果仍然相同。

    [引用 user="Jens-Michael Gross"]不发送、不接收和

    您在下一次传输时得到了答案[/QUERT]

    是的。 实际上、之前相同的代码在工作、我得到的信号就像您说的那样。 但我只是将时钟频率从4MHz 更改为25MHz 以查看变化、但反过来、我从 SOMI 引脚上的从器件获得了正弦信号。 因此、我再次将时钟频率更改为4MHz、但随后我开始从从器件获取高0xff 信号。

    已尝试不同 的方法、例如更改我要发送的字节之间的延迟、再次将时钟频率从1MHz 更改为25MHz、设置 P3REN 以下拉 SOMI 引脚电压。 但结果仍然相同。

    除此之外、如果您认为我应该做更多的事情、请帮我。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    "已尝试将 UCA0STE 引脚短接至接地。 仍然得到相同的结果、即高 SOMI 信号。"

    UCA0STE (更确切地说、CS)对主器件没有影响。 它只是一个发送给从器件的信号、用于响应或忽略 SPI 总线。
    UCA0STE 信号、如果配置为发送 P3SEL 供模块使用、则为 USCI 的普通输入信号、仅用于4线制 SPI 模式。 针对多主器件配置、它将 USCI 从主器件切换到从模式(独立于 UCMST 位)。 在3线制模式下、不使用它。 因此、在将引脚用作从器件芯片选择时、不应使用此符号。

    BTW:在您的代码中、您已经定义了 UCA0SOMI。 那么、为什么不使用它来设置 P3DIR 和 P3SEL 呢? :)它使代码更易读,并减少了错误配置的可能性。

    是的。 实际上、之前相同的代码在工作、我得到的信号就像您说的那样。 但我只是将时钟频率从4MHz 更改为25MHz 以查看变化、但反过来、我从 SOMI 引脚上的从器件获得了正弦信号。 因此、我再次将时钟频率更改为4MHz、但随后我开始从从器件获取高0xff 信号。

    这很奇怪、但听起来好像高频已经损坏了从器件。 我不知道为什么会发生这种情况以及这种情况是如何发生的。
    AFAIK、只有89S 系列有一个内置 SPI 接口、原始的8051和89C 衍生产品没有。 现在89S 的最小电源电压为4V、因此 I/O 输出电压也至少为4V、MSP 电源电压最多为3、6V。 MSP 钳位二极管可能会损坏从器件的输出驱动器。 由于电容问题、高频率可能会增加问题。
    此外、AT98S53数据表还给出了"1.5MHz 位频率(最大值)" SPI 模式。 (非常慢)。 它不知道这是主控模式的限制还是也适用于受控模式。 Atmel 的数据表结构非常非结构化且不完整。 但编程模式下 SPI 的时序也指示2MHz 限制(fOSC/12)。
    现在我不知道您拥有的确切器件是什么;这适用于 AT89S53。 来自不同制造商的8051衍生产品有如此之多...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Rahul_Chavan、

    让我确保我理解、现在我看到了您的其他信息-您让 SPI 工作@4MHz? 这是 MSP430 MCLK 频率还是 SPI_CLK 引脚上的实际时钟频率?

    如果这是 SPI_CLK 频率、并且您提高到了更高的频率、则很可能您已超过8051 SPI 外设的输入时钟频率。

    相反、如果这是您所指的 MSP430 MCLK 频率、则当 SPI_CLK 工作时和不工作时实际的 SPI_CLK 频率是多少。 请使用示波器或逻辑探头进行测量以确认。 谢谢:)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Rahul_Chavan、

    自您上次响应以来已经有一段时间了、因此我假设您已经解决了您的问题、我将关闭此主题。
    如果情况并非如此、并且您需要其他帮助、则可以重新打开同一个线程。