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-EP:MSP430F5438A 作为 SPI 从器件

Guru**** 2543630 points
Other Parts Discussed in Thread: MSP430F5438A, MSP430F5438A-EP

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/840299/msp430f5438a-ep-msp430f5438a-as-spi-slave

器件型号:MSP430F5438A-EP
主题中讨论的其他器件:MSP430WAREMSP430F5438A

您好!

我想在我上次离开的地方进一步讨论。 请查看我之前的帖子、该帖子几乎是9个月前的帖子。

https://e2e.ti.com/support/microcontrollers/msp430/f/166/t/766491

现在、我在通信收发器和 MSP430之间使用 FPGA。

FPGA 将不断从通信收发器接收数据和 CLK、并查找在通信收发器提供的 CLK 上采样的数据模式。 我们称之为帧起始(SOF)的这种数据模式。 一旦它接收到 SOF、它将其引脚之一设置为片选(CS 高电平有效)为高电平、并将 CLK、数据和 CS 转发至 MSP430 SPI 从器件。 我们还有一个用于帧结束(EOF)的数据模式。 一旦 FPGA 看到 EOF、它将通过将 CS 设置为低电平来取消选择 MSP430 SPI 从器件。

当我尝试运行我的系统并接收数据时、我的 MSP430有时会正确接收数据、有时会将数据移位几位(大约1-4位)。

我意识到 CS 在 CLK 的同一边缘被激活、在该边缘将对数据进行采样。

现在、似乎我正在使用 FPGA 创建自己的 SPI 主设备。 这意味着我需要处理如下所述的时序限制:

因此我的 CS 应该至少提前11ns。 我计划在下一个 CLK 和数据之前将 CS 置于 CLK/4时间附近的高电平。 没关系吗?

还有其他什么也会导致位移位问题吗? 另外、如果我还需要处理其他东西、请告诉我。

我想知道 SPI 从器件如何触发接收中断。 启用 SPI 后、它是否根据8输入 SPI CLK 触发?  

我的 ISR 如下所示(参考了来自 MSP430ware 的 SPI 从站 MSP430F5438A 示例):

#define SLAVE_CS_IN P3IN
#define SLAVE_CS_DIR P3DIR
#define SLAVE_CS_PIN BIT0

空 USCI_B0_ISR (空)


开关(_偶数_在范围内(UCB0IV、4)){
//Vector 2 - RXIFG
案例2:
IF (SLAVE_CS_IN 和 SLAVE_CS_PIN)
receiveData[cnt++]= UCB0RXBUF;
中断;

默认值:break;

谢谢、此致、

Ankit

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

    Ankit、您好!

    让我在这里回答您的问题:

    因此我的 CS 应该至少提前11ns。 我计划在下一个 CLK 和数据之前将 CS 置于 CLK/4时间附近的高电平。 没关系吗?
    [我不知道您的时钟速率是多少、因此我将保留足够的时间并遵循数据表中的图表和时序规格。]

    我想知道 SPI 从器件如何触发接收中断。 启用 SPI 后、它是否根据8输入 SPI CLK 触发?
    [是。 MSP430x5xx_x6xx 用户指南中对此进行了说明、从37.2节开始。  您可能还需要在 TI Resource Explorer 中查看此器件的 SPI 示例。  在 Software 文件夹中查找 MSP430Ware-3.80.07.00、Devices、然后查找 MSP430F5XX_6XX 文件夹。  有几个 SPI 示例将向您展示配置 SPI 和响应中断的正确方法。]

    还有其他什么也会导致位移位问题吗? 另外、如果我还需要处理其他东西、请告诉我。
    [通常、这是在主器件和从器件之间未正确配置串行时钟极性和相位时导致的。  请参阅第37.2节]

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

    尊敬的 Dennis:

    感谢您的回复。 我的 CLK 是128KHz。 我已将 SPI 设置为 CLK 相位0和 CLK PLOARITY 1。

    我将连接从 SPI 信号示波器中获取的波形。

    注:黄色为 CS (I 更改为低电平有效)。 蓝色表示 CLK。 粉红色是数据。

    这是一个完整的事务:

    下面是 CS (更改为低电平有效)置位的图像。 在这里、我认为我可以安全地假设 TSTE_LEAD 安全地高于数据表中提到的11ns。 大约为400ns。

    我的 CS 在下图中无效。 TSTE_LAG 应至少为3ns。 我们提供的值约为1.6us。

    因此、我将通过如下初始化在3线从模式下使用 SPI:

    void InitializeUcb0 (void)
    {
    //P3.2 UCB0SOMI 作为输出
    GPIO_setPeripheralModuleFunctionOutputPin ((uint8_t) GPIO_PORT_P3、
    (uint16_t) GPIO_PIN2);
    //P3.3 UCB0CLK、P3.0 UCB0STE 和 P3.1 UCB0SIMO 作为输入
    GPIO_setPeripheralModuleFunctionInputPin (
    (uint8_t) GPIO_PORT_P3、
    ((uint16_t) GPIO_PIN3));
    
    P3SEL |= 0x01;
    
    /* GPIO_setPeripheralModuleFunctionInputPin (
    (uint8_t) GPIO_PORT_P3、
    ((uint16_t) GPIO_PIN0));*/
    
    GPIO_setPeripheralModuleFunctionInputPin (
    (uint8_t) GPIO_PORT_P3、
    ((uint16_t) GPIO_PIN1));
    
    if (status_succeed=USCI_B_SPI_initSlave ((uint16_t) USCI_B0_BASE、USCI_B_SPI_MSB_FIRST、0、1))
    {
    // Slave_CS_DIR &=~(SLAVE_CS_PIN);
    enable_SPIA();
    //启用 SPI 模块
    // USCI_B_SPI_ENABLE ((uint16_t) USCI_B0_BASE);//在 S 频带上检测到数据时启用 SPI
    //启用接收中断
    }
    } 


    我的 SPI 启用和禁用功能:
    void enable_SPIA (void)
    {
    USCI_B_SPI_ENABLE ((uint16_t) USCI_B0_BASE);
    USCI_B_SPI_clearInterrupt (USCI_B0_BASE、
    USCI_B_SPI_Receive_interrupt
    );
    USCI_B_SPI_enableInterrupt (USCI_B0_BASE、
    USCI_B_SPI_Receive_interrupt
    );
    }
    
    void disable_SPIA (void)
    {
    USCI_B_SPI_DISABLE ((uint16_t) USCI_B0_BASE);
    } 




    CS、我已选择作为中断引脚 P 1.6
    P1DIR &=(CLR_Sevent_BIT & CLR_八分之一 位);
    // P1IES |= SET_Sevent_BIT /*| SET_八分之一 位*;
    P1IES &= CLR_Sevente_bit;
    P1IE |= SET_7e_BIT /*| SET_Eight_bit*/;
    P1SEL &=(CLR_Sevente_bit 和 CLR_八分之一 位);
    
    void Port1_ISR (void)__attribute__((interrupt (Port1_vector)));
    void Port1_ISR (void)
    {
    开关(__evo_in_range (P1IV、(uint16_t) 0x0E))
    {
    案例 P1IV_P1IFG1:
    (*regCallback2)();
    中断;
    案例 P1IV_P1IFG6:
    (*regCallback1)();
    中断;
    默认值:
    中断;
    }
    } 



    regCallback1实际上是一个打印任务、它将通过 UART 将所有接收到的 SPI 数据发送到串行终端。

    void print_app (void)
    {
    // sprintf (printArr、"CIM Print App %lu!\n\r\n、计数器);
    // UART0_PUT_chars ((uint8_t*) printArr、strlen (printArr));
    // counter++;
    // P1OUT ^= 0x01;
    // if (505 = cnt)
    disable_spIA();
    P1OUT ^= 0x01;
    UART0_PUT_CHARS(uint8_t*) receiveData、cnt;
    CNT = 0;//TODO 需要检查竞态条件
    enable_SPIA();
    } 


    我的 SPI ISR 如下:

    #define SLAVE_CS_IN P1IN
    #define SLAVE_CS_DIR P1DIR
    #define SLAVE_CS_PIN BIT6
    
    //*********
    //
    ////这是 USCI_B0中断矢量处理例程。
    ////
    *********
    #if defined (__TI_Compiler_version__)|| defined (__IAR_systems_icc_)
    #pragma vector=USCI_B0_vector
    __interrupt
    #elif defined (__GNU__)
    __attribute__(interrupt (USCI_B0_vector)))#endif USCI_B0_void ISR
    
    (void
    )
    开关(_偶数_在范围内(UCB0IV、4)){
    //Vector 2 - RXIFG
    案例2:
    if (!(SLAVE_CS_IN 和 SLAVE_CS_PIN))
    receiveData[cnt++]= UCB0RXBUF;
    中断;
    
    默认值:break;
    }
    } 

    现在我面临的问题是、当我在 InitializeUcb0中注释"P3SEL |= 0x01"时、我的 SPI ISR 不起作用;它实际上是 UCB0 SPI 的 STE 引脚。 我无法理解当我使用3线 SPI 从模式时、STE 引脚与 SPI 从器件设置有何关系。 一旦我的 UCB0模块接收到来自主器件的连续8个 SPI CLK、不管 STE 是否被激活、它应该命中 SPI ISR。

    如果您在代码中发现任何其他缺点、请告诉我。

     

    谢谢、此致、

    Ankit

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

    只需根据我的观察结果添加几个结果:

    我的通信收发器定期向 MSP430从器件发送以下内容:

    字符数624。

    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA
    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA
    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA
    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA
    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA
    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA
    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA
    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA
    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA
    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA
    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA
    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA
    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA
    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA
    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA
    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA
    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA
    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA
    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA
    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA
    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA
    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA
    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA
    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA
    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA
    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 1F 32 54 76 F8

    但在 MSP430从器件端、 有时我会持续接收以下内容(MSP430从器 件通过串行终端的 UART 抛出):

    623个字符的数量(比正确版本少1个字符)。 看起来像正确版本的7位右移版本。

    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 54 3E 64 A8 ED

    有时遵循一致 性(由 MSP430从器件 通过串行终端上的 UART 抛出):

    字符数624。  看起来像正确版本的1位右移版本。

    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
    55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 0F 99 2A 3B 7C

    如果我复位 MSP430、那么后续结果将始终如一地正常。

    现在显然涉及位移、但在第一个错误的情况下、我收到的字符少1个、而在第二个错误的情况下、我收到的字符数量正确。  

    当我尝试检查 SPI 波形的结果是否错误时、它们与我之前从示波器获取的消息中附加的 SPI 波形完全相同。

     

    谢谢、此致、

    Ankit

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

    您好!

    我设法解决了位移问题。

    最初、我的 FPGA 数据空闲时为低电平、CLK 也空闲时为低电平。 从下面的示波器图像中可以看出:


    我将我的 CLK 空闲更改为高电平、并且数据仍然保持低电平。 在这种情况下、第一个数据位更改应该发生在上升沿、而我应该已经在下降沿捕获它。 但是、由于数据空闲低电平、第一个数据位更改发生在下降沿、而我的 SPI 无法捕获。 您可以看到下图:


     

    我设法通过从通信收发器自由地悬空数据引脚来修复它、而不是在我匹配 SOF 时启用它。 SOF 现在仅激活 FPGA 的 CLK 输出、而数据输出始终处于启用状态。 如下图所示:


    此外、可以从下图中了解数据自由浮动:


     

    但我仍然无法理解、 当我在3引脚从模式下使用 SPI 时、当我注释 P3SEL |= 0x01时、为什么 SPI ISR 未命中。

    在3引脚从模式下使用 SPI 时、STE 不应与 SPI ISR 发挥任何作用。 下面是我在前一条消息中附加的 SPI 初始化中使用的 TI 代码。

     

    bool USCI_B_SPI_initSlave (uint16_t baseAddress、
    uint8_t msbFirst、
    uint8_t 时钟相位、
    uint8_t 时钟极性)
    {
    //禁用 USCI 模块
    HWREG8 (baseAddress + OFS_UCBxCTL1)|= UCSWRST;
    
    //复位 OFS_UCBxCTL0寄存器
    HWREG8 (baseAddress + OFS_UCBxCTL0)&=~(UCMSB +
    UC7BIT +
    UCMST +
    UCCKPL +
    UCCKPH +
    UCMODE_3
    );
    
    //时钟极性、相位选择、msbFirst、SYNC、Mode0
    HWREG8 (baseAddress + OFS_UCBxCTL0)|=(时钟相位+
    时钟极性+
    msbFirst +
    UCSYNC +
    UCMODE_0
    );
    
    返回(status_SUCCES);
    }
    

     

    谢谢、此致、

    Ankit

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

    您好!

    导致上述问题的任何代码问题:

    一 但我仍然无法理解、 当我在3引脚从模式下使用 SPI 时、当我注释 P3SEL |= 0x01时、为什么 SPI ISR 未命中。

    在3引脚从模式下使用 SPI 时、STE 不应与 SPI ISR 发挥任何作用。 下面是我在前面消息中附加的 SPI 初始化中使用的 TI 代码..........

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

    Ankit、

    您未使用 STE。

    为什么要使用 P3SEL |= 0x01?

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

    尊敬的 Dennis:

    因为如果我不执行 P3SEL |= 0x01、我的 SPI 从器件 ISR 永远不会命中、这对我也没有意义。

    谢谢、此致、

    Ankit

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

    您好、Ankit、

    我想知道这是否是一个错误。

    初始化 SPI 后、UCBxCTL0的值是多少?

    让我与产品团队核实一下他们是否知道这一点。

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

    尊敬的 Dennis:

    当然。 我将在明天对其进行测试并发布结果。

    谢谢、此致、

    Ankit

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

    尊敬的 Dennis:

    我的 UCB0CTL0值为0x23。 我意识到了我的错误。 在我的初始化 Ucb0代码中、我使用 的是 USCI_B_SPI_initSlave ((uint16_t) USCI_B0_BASE、USCI_B_SPI_MSB_FIRST、0、1)

    //时钟极性、相位选择、msbFirst、SYNC、Mode0
    HWREG8 (baseAddress + OFS_UCBxCTL0)|=(时钟相位+
    时钟极性+
    msbFirst +
    UCSYNC +
    UCMODE_0
    );

    对于时钟极性、我使用的是值 为0x40的 UCCKPL 宏1 (0x01)、这带来了麻烦。 这导致模式从3引脚模式更改为4引脚模式。

    使用0x40后、问题得到解决

    但是、我想了解一些内容。 仅当我将时钟相位也更改为 UCCKPH 时、即0x80、根据 MSP430F5xx 用户指南中的 SPI 时序图和从示波器捕获的信号、我认为该时钟相位应为0x00时、问题才会得到解决:

    根据我的说法、它应该是时钟相位为0x00、时钟极性应该为 UCCKPL。 但在这种情况下、我丢失了第一个位、结果变为0x55 0x55... 有些位完全错误。

    但是、如果我使用时钟相位作为 UCCKPH、使用时钟极性作为 UCCKPL、那么我的位都是正确的。 但我不明白为什么会这样。

    谢谢、此致、

    Ankit

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

    您好、Ankit、

    是的、根据您的示波器捕获、我认为 UCCKPL 应为1、UCCKPH 应为0。

    这可能是一个更好的图表

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

    尊敬的 Dennis:

    我再次阅读 MSP430F5438A-EP 数据表。

    我意识到了什么。 根据我的观察结果和下图(示波器图像以及 SPI 主模式和从模式时序图)、对于 MSP430从模式、时钟相位和时钟极性似乎都应为高电平。

    在图15 (CKPL 和 CKPH 均为1的 SPI 受控模式)中、对于 SIMO 线、该图与我的示波器图像完全匹配(在到 MSP430的 SPI 输入端探测)。

    我的观察结果是否正确?

    谢谢、此致、

    Ankit

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

    Ankit、您好!

    嗯、这里是我读取它的方式。

    CKPH 控制数据何时发生变化或由主器件输出。  我们可以同意已正确设置 CKPL = 1。

    当 CKPL = 1且 CKPH = 1时、数据被输出或在 CLK 的第一个"下降边沿"上改变值。 这意味着在"下降沿"上、主器件和从器件都将在各自的 SIMO/SOMI 总线引脚上显示它们的数据。  然后、主器件和从器件在 CLK 的"上升沿"锁存数据。  根据您的示波器捕获、情况显然不是这样。

    当 CKPL = 1且 CKPH = 0时、数据被输出或改变 CLK 第一个"上升沿"上的值。  这意味着在"上升沿"上、主器件和从器件都将在各自的 SIMO/SOMI 总线引脚上呈现其数据。  然后、主器件和从器件在 CLK 的"下降沿"锁存数据。  这似乎与您的范围捕获一致。

    让我们尝试一下-当您使 SPI 通信正常工作时、捕获所有 SPI 寄存器并显示我。

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

    尊敬的 Dennis:

    非常感谢您的解释。

    在下一次答复中、我将附上寄存器值。

    谢谢、此致、

    Ankit

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

    尊敬的 Dennis:

    当我初始化 SPI 时、请找到 SPI 寄存器屏幕截图。

    当我作为从主器件的从器件接收第一个 SPI 字节时、我捕获了 SPI 寄存器。 请找到下面的屏幕截图:

    谢谢、此致、

    Ankit

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

    Ankit、您好!

    只要确保主器件使用的 CKPL 和 CKPH 设置与从器件使用的设置相同。

    如果这不起作用、请检查 FPGA 中的主设计时序。