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.

[参考译文] MSP430FR5962:更改 SPI 通信模式后、两个芯片无法正常通信

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1424589/msp430fr5962-after-changing-the-spi-communication-mode-the-two-chips-cannot-communicate-normally

器件型号:MSP430FR5962
主题中讨论的其他器件:MSP432E401Y

工具与软件:

尊敬的团队:

   我使用 TM4C1290和 MSP430芯片进行 SPI 通信。 TM4C 是主机、MSP430是从器件。 原始配置为模式0、时钟极性为0、相位为0。 现在两个芯片的通信模式改变为时钟极性为0、相位为1、但两个芯片无法正常通信。

MSP430相关定义:

#define UCCKPH (0x8000)/*时钟相位选择*/
#define UCCKPH_H (0x0080)
#define UCCKPH_0 (0x0000)/*数据在第一个 UCLK 边沿上改变、并在上捕捉
沿。 */
#define UCCKPH_1 (0x8000)/*在第一个 UCLK 边沿捕获数据、并在上更改数据
沿。 */

TM4C 相关定义:

#define SSI_FRF_MOTO_MODE_0 0x00000000 //模式 FMT、极性0、相位0
#define SSI_FRF_MOTO_MODE_1 0x00000002 //模式 FMT、极性0、相位1
#define SSI_FRF_MOTO_MODE_2 0x00000001 //模式 FMT、极性1、相位0
#define SSI_FRF_MOTO_MODE_3 0x00000003 //模式 FMT、极性1、相位1

//Before:
//Master:
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI1);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
    
GPIOPinConfigure(GPIO_PB5_SSI1CLK);
GPIOPinConfigure(GPIO_PB4_SSI1FSS);
GPIOPinConfigure(GPIO_PE4_SSI1XDAT0);
GPIOPinConfigure(GPIO_PE5_SSI1XDAT1);
  
GPIOPinTypeSSI(GPIO_PORTE_BASE, GPIO_PIN_4 | GPIO_PIN_5 );
GPIOPinTypeSSI(GPIO_PORTB_BASE, GPIO_PIN_4 | GPIO_PIN_5 );
  
SSIConfigSetExpClk(SSI1_BASE, g_ui32SysClock, SSI_FRF_MOTO_MODE_0,
SSI_MODE_MASTER, 1000000, 8);
SSIEnable(SSI1_BASE);

//Slave:
UCB1CTLW0 = UCSWRST;   // **Put state machine in reset**
UCB1CTLW0 |= UCCKPH | UCCKPL_0 | UCMSB | UCSYNC| UCMST_0;                                   
UCB1CTLW0 &= ~UCSWRST; 
UCB1IFG &= ~(UCTXIFG | UCRXIFG); 
UCB1IE |= UCRXIE;   




//Now:
//Master:
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI1);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
    
GPIOPinConfigure(GPIO_PB5_SSI1CLK);
GPIOPinConfigure(GPIO_PB4_SSI1FSS);
GPIOPinConfigure(GPIO_PE4_SSI1XDAT0);
GPIOPinConfigure(GPIO_PE5_SSI1XDAT1);
  
GPIOPinTypeSSI(GPIO_PORTE_BASE, GPIO_PIN_4 | GPIO_PIN_5 );
GPIOPinTypeSSI(GPIO_PORTB_BASE, GPIO_PIN_4 | GPIO_PIN_5 );
  
SSIConfigSetExpClk(SSI1_BASE,g_ui32SysClock,SSI_FRF_MOTO_MODE_1,SSI_MODE_MASTER, 1000000, 8);
SSIEnable(SSI1_BASE);

//Slave:
UCB1CTLW0 = UCSWRST;   // **Put state machine in reset**
UCB1CTLW0 |= UCCKPH_0 | UCCKPL_0 | UCMSB | UCSYNC| UCMST_0;                                   
UCB1CTLW0 &= ~UCSWRST; 
UCB1IFG &= ~(UCTXIFG | UCRXIFG); 
UCB1IE |= UCRXIE;

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

    我想知道更改配置后为什么通信不成功。 我是否需要进行任何其他更改? 专家能帮我看一下吗? 谢谢你。

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

    在 Tiva 方面、当 SPH=1时、FSS (/CS 或 UCSTE)信号有一些注意事项--具体而言、"连续"(FIFO 永远不会变为空)多字节事务的情况。  [至少我认为是这样--数据表(SPMS429B)表17-3不同意第 17.3.7.4节。]

    当 SPH=0时[第17.3.7.3和17.3.7.5] FSS 在字节之间变为高电平、因此每个事务都是单字节。 SPH=1 [第 17.3.7.4节和17.3.7.6节 ] FSS 在两个字节之间保持低电平、只要它们呈现为"连续"(这取决于代码的编写方式)。

    您使用的是单字节还是多字节事务? 您或许能够使用 FSSHLDFRM 执行某些操作[参考表17-3]、这样您可以部分直接控制 FSS。

    [免责声明:我的经验与 MSP432E401Y 有关、该 MSP432E401Y 与 TM4C1294相同(包括数据表差异)。 我根本不使用 FSS、而是使用 GPIO 提供/CS (在您的案例中为 UCSTE)、因此我始终知道它何时生效。]

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

    尊敬的专家:

       今天、我使用普通的 GPIO 来代替 FSS。 当 TM4C 发送数据时、片选信号被拉至低电平、而片选信号在传输完成后被拉至高电平。 当 TM4C 接收数据时、片选信号被拉至低电平、而片选信号在接收完成后被拉至高电平。 当我将 TM4C 和 MSP430模式配置为 MOTO fmt、POLARITY = 0、PHASE = 0时、它们可以正常通信、从而证明使用 GPIO 仿真片选信号 FSS 是可行的。 当将 TM4C 和 MSP430模式配置为 MOTO fmt、MOTO fmt、POLARITY 0、PHASE 1时、系统无法正常通信。 为什么会这样呢?

      关于 SPI 模式配置、我可以参考任何示例吗? 是否有人将 SPI 配置为极性0、相位1?

    期待你的答复,谢谢

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

    我们同时使用 MODE=0和 MODE=3 (不同的目标);这些不包括您的情况、但后者的 SPH=1。  

    我们使用 FSS 引脚、但将其用作 GPIO、因此而不是 GPIOPinConfigure ( )我们将其称为 GPIOPinTypeGPIOOutput ( 、 )。 我们没有看到任何异常。 几乎所有的事务都是多字节的;有些事务使用 DMA。

    交易有哪些异常? (示波器/分析仪轨迹非常有用。)

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

    > UCB1CTLW0 |= UCCKPH_0 | UCCKPL_0 | UCMSB | UCSYNC| UCMST_0;  

    我刚刚注意到 MSP430一侧在使用 UCMODE=0、所以片选(STE)引脚被忽略。 在一般情况下、这可能没问题、但在不完美的同步/时序情况下、使用 STE 重新同步可能很有价值。  

    > UCB1CTLW0 |= UCCKPH_0 | UCCKPL_0 | UCMSB | UCSYNC| UCMST_0 | UCMODE_2;// 4引脚、STE 低电平有效  

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

    您好、专家级:

    目前我的 MSP430 SPI 模块配置如下:

    目前、我的 TM4C SPI 模块配置如下:

    TM4C 是主机、MSP430是从器件。 在此配置下、TM4C 可以正确地将数据发送到 MSP430、而 MSP430可以正确接收和解析数据。 但是、当 MSP430将响应数据发送到 TM4C 时、会通过示波器查看总线数据。 由 MSP430回复的第一个数据帧理论上应具有标头0x55、0x66、但缺少0x55。 帧的尾部应为0x77、0x88、但缺少0x77。 同时、此回复帧中的数据数量不正确、小于理论数量。 MSP430发送端口数据始终显示0x88。 之后、TM4C 继续定期发送查询指令、MSP430总线始终显示0x88。 为什么可以正确解析数据、但在将数据发送到总线上的数据不正确? 是否有任何专家可以解释它是由于时间安排还是某些配置需要修改?

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

    在 MSP430上、当写入 TXBUF 时、你是否确保 TXIFG 被置位? (不这样做)这是一种丢失 Tx 字节的方法。

    我希望 TXIFG 时序可以通过从 SPH=0切换到 SPH=1 (UCCKPH=1至 UCCKPH=0)来改变。