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.

[参考译文] MSP430F5638:让 MSP430 SPI 4引脚运行、3引脚100%解码

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1404420/msp430f5638-getting-msp430-spi-4-pin-running-at-all-and-3-pin-decoding-100

器件型号:MSP430F5638

工具与软件:

我有一个运行 MSP430F5638IPZ 的定制 SBC、我在4引脚模式下无法使 SPI 正常工作、甚至无法向示波器或逻辑分析仪获取任何脉冲。 在3引脚模式-主器件 Tx 中、我看到 CLK 和 MOSI 脉冲、MISO 固定为高电平、就应该如此。 但只能让范围或 LA 在10-20次尝试中触发和解码大约1次。 我的 SBC 上还有 MSP432P401R、SPI 4引脚运行良好、我可以在432上几乎100%的时间触发和解码。 持续测试 SPI 代码 Tx ="ABCDEFGH"。

这具体是 MSP430 P8 UCA1和 UCB1 -请参阅 UCA1的 SPI-1原理图、UCB1转至另一个接头-结果相同

430是否不支持4引脚 SPI、或者我是否遗漏了一个步骤?

2.为什么触发和解码430 - 3引脚信号时遇到这么大的困难? 我在 CLK 下降沿触发。 Scope 或 LA 的结果相同。 有关成功的3引脚主器件 TX 解码、请参阅示波器图像。

430 P8也支持 UART、SPI 和 I2C、其中 I2C 在 SDA 和 SCL 上有两个上拉电阻、它们与 UCB1SIMO 和 UCB1SOMI 共用。 UCB1 MOSI 工作正常、我认为 I2C 上拉电阻不会导致 SPI 出现问题。 只将引脚默认拉至高电平、信号逻辑将根据需要变为高电平或低电平。 请确认?

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

    1) 1)在从模式下、4引脚可按预期工作、通常优于3引脚。 在主模式下、4引脚不能按您(可能)预期的方式工作[参考 UG (SLAU208Q)图37-2]、但可能需要使用3引脚加 GPIO 用于/CS (如果需要、可以使用 STE 引脚)。 您使用哪种模式?

    2) 2)我的第一个猜测是与时钟相位有关、 我希望您 也必须告诉分析仪有关情况。 请记住、UCCKPH 设置在 CPHA 对面。

    3)我希望这会起作用,上拉不会妨碍。 我已经看到这些(通常是较弱的)用于 SPI 和 UART、以便在重新启动期间防止引脚切换。 您应确保 J4/J5中只有一条连接到任何地方、因为无论您是否需要、另一端的任何器件都可能驱动其中一条线路。

    分析仪顶部和底部解码有什么区别?  最下面的一个 似乎足够快乐。

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

    感谢您的答复。

    1 -尝试了4引脚主模式和从模式、甚至无法获得示波器的脉冲、我将尝试使用 GPIO CS 的3引脚。 我也首选4引脚。

    2 -为相同的 SPI 参数设置了 SPI 端口和范围或 LA。 不知道 CPOL 和 CPHA 应该相反?

    3 -我的图纸说明说要单独使用它们-我很欣赏这篇评论,不连接到任何你需要在当时工作的东西。

    示波器屏幕截图显示停止时10次以上尝试的唯一正确解码。 当连续运行时,你会看到"ABC"偶尔飞,但大多数是 ASCII gibberish。 如果您通过压缩时基来显示更多脉冲、则无法在屏幕底部看到数据值。 您可以滚动浏览屏幕顶部的表格以查看数据。

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

    1) 1)我建议主器件使用3引脚(+GPIO 用于/CS)、而从器件使用4引脚。 从器件本身不会产生任何脉冲、因为主器件控制 SCK。  

    2) UCCKPL 应与 CPOL 相同设置。 UCCKPH 应设置为与 CPHA 相反。

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

    我的问题可能是我根本没有设置 UCCKPL 或 UCCKPH、而只是 CPOL 和 CPHA。 前者在哪里?

    尝试了大量排列、4引脚根本没有解码、3引脚会在10次尝试中的2次正确解码。 当它正常工作时、它会正确解码约3500个字符。

    以下示例 C 代码适用于端口设置函数和数据字符串 Tx 函数。

    3500个字符。

    // setup MSP430F5638 P8 UCB1 SPI
    // 4 pin master tx mode
    //      nothing works, no decode at all
    // 3 pin master tx mode
    //      tried with & without STE used as GPIO CS
    //      properly decodes about 2 out of 10 attempts
    //      the 2 that work each capture up to 3500 characters correctly for 10 ms @ 500 MHz LA
    //      8 fails get ASCII gibberish for all characters
    // uses polling, according to TI tech support, for high speed SPI, ISR's are slower, don't use them
    // P8 Tx string = "ABCDEFGH" to scope or LA, same results for both instruments
    void SPI_2_M_init(void)
    {
        UCB1CTL1 = 0x01;         // disable UCB1 during configuration
    
        // 4 pin SPI synch - no pulses at all
        // MSP430 does not work in 4 pin mode to LA's anyway
        // set all SPI-2 serial parameters
        // high nibble 1110 = clock phase = 1, polarity = 1, MSB first = 1, 8-bit = 0
        // low nibble 1101 = Master = 1, 4 pin STE low = 10, Synch Mode = 1
        // 7654 3210
        // 1110 1101 = 0xED
    //    UCB1CTL0 = 0xED;
    
        // 4 pin SPI asynch - no pulses at all
        // try asynchronous - still not triggering LA1010
        // 7654 3210
        // 1110 1100 = 0xEC
    //    UCB1CTL0 = 0xEC;
    
        // 3 pin SPI mode - trigger on Ch1 CLK - decodes 2 of 10 attempts
        // trigger on CS low does nothing, no decode at all
        // works 3 pin mode - CLK, MOSI pulses, MISO high, but no STE pulses
        // MSP430 only seems to like 3 pin mode
        // try 3 pin, sync - this triggers the LA1010 & U3Pro16
        // 1110
        // clock phase = 1, polarity = 1, MSB first = 1, 8-bit = 0
        // 1001
        // Master = 1, 3-pin SPI = 00, synchronous mode = 1
        // 7654 3210
        // 1110 1001 = 0xE9
        UCB1CTL0 = 0xE9;        // tried asynch 0xE8, no difference
        // try CPHA = 0
        // 7654 3210
        // 0110 1001 = 0x69
    //    UCB1CTL0 = 0x69;        // never gets ABCD...
    
        // 7654 3210
        // 1000 0001 = 0x81
        // SMCLK = 10, Don't care xxxxx, software reset = 1
        UCB1CTL1 = 0x81;
    
        // BRW = divisor
        // tested BRW = 2 to 64, must be >= 6 when using X2 @ 24 MHz MSP430 clock
        UCB1BRW = 7;                      // X2 = 20 MHz / 7 = ~3 MHz (must be >= 6 to work)
    
        UCB1CTL1 &= ~0x01;       // enable UCB1 for use after configuration
    }
    
    // 8/27/24 - M Tx 3 pin, use GPIO to set / clear CS
    // Master Tx
    // uses polling
    // SPI-2 uses P8 UCB1
    // str = transmitted string
    void setup_430_P8_SPI_2_M_TX(unsigned char *str)
    {
        int i=0, length;
        length = strlen(str);
    
        // set alternate function for P8.4, P8.5, P8.6 - UCB1 SPI-2
        // leave P8.1 UCB1STE as GPIO to set / clear CS
        // 7654 3210
        // 0111 0000 = 0x70
        P8SEL |= 0x70;          // set for 3 pin mode
        // 7654 3210
        // 0111 0010 = 0x72
    //    P8SEL |= 0x72;        // set for 4 pin mode
    
        // set UCB1STE P8.1 for GPIO CS
        P8DIR |= BIT1;      // set UCB1STE to out, don't need, default
        P8OUT |= BIT1;      // set UCB1STE high
    
        // loop continuously
        // STE CS set high by default
        while(1)
        {
            P8OUT |= BIT1;      // set UCB1STE CS high
            // Tx the string
            for (i = 0; i < length; i++)
            {
                P8OUT &= ~BIT1;     // clear UCB1STE CS low to trigger on
                while(!(UCB1IFG & UCTXIFG))     // wait for transmit buffer empty
                    ;
                UCB1TXBUF = str[i];       // transmit a character
                //delayMs(10);
            }
            P8OUT |= BIT1;      // set UCB1STE CS high
        }
    }
    
    

    我已经为我的 SPI 设置函数和 Tx 函数添加了一个代码文件。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我的问题可能是我根本没有设置 UCCKPL 或 UCCKPH、只有 CPOL 和 CPHA。 [报价]

    使用提供的已定义符号可以使事情更加清晰:

        UCB1CTL0 = 0xE9;        
        // vs.
        UCB1CTL0 = UCCKPH | UCCKPL | UCMSB | UCMST | UCSYNC


    CPOL CPHA 等的命名对我来说总是令人困惑、因此我查阅数据表以了解预期结果。 它在大部分时间都起作用、但并非总是如此。 小尺寸 OLED 显示屏给我带来了麻烦、因为数据表似乎表明它并不关心时钟的空闲状态。 确实如此。