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.
工具与软件:
我有一个运行 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。 [报价]使用提供的已定义符号可以使事情更加清晰:
Fullscreen123UCB1CTL0 = 0xE9;// vs.UCB1CTL0 = UCCKPH | UCCKPL | UCMSB | UCMST | UCSYNCXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXUCB1CTL0 = 0xE9; // vs. UCB1CTL0 = UCCKPH | UCCKPL | UCMSB | UCMST | UCSYNC
CPOL CPHA 等的命名对我来说总是令人困惑、因此我查阅数据表以了解预期结果。 它在大部分时间都起作用、但并非总是如此。 小尺寸 OLED 显示屏给我带来了麻烦、因为数据表似乎表明它并不关心时钟的空闲状态。 确实如此。