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.

[参考译文] MSP430FR2355:SPI

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1534088/msp430fr2355-spi

器件型号:MSP430FR2355

工具/软件:

您好、

      我将 MSP430FR2355 控制器用于工程、希望对此使用 SPI 通信。 我尝试了很多,但我无法获得成功。 我的控制器需要充当仅主器件数据传输(无需接收数据)。

我想使用端口引脚 12、13、14 进行 SPI 通信 (UCB1)

这是我的代码,

void spi_init ()

P4SEL0 |= BIT5| BIT6 | BIT7;  

//时钟极性:非活动状态为高电平
//MSB 在前、8 位、主器件、3 引脚模式、同步
UCB1CTLW0 = UCSWRST;//**将状态机置于复位状态**
UCB1CTLW0 |= UCCKPL | UCMSB | UCSYNC
| UCMST | UCSSEL_SMCLK;// 3 引脚 8 位 SPI 从模式
UCB1BRW = 0x20;
//UCB1MCTLW = 0;
UCB1CTLW0 &&~UCSWRST;//**初始化 USCI 状态机**
UCB1IE |= UCRXIE;//启用 USCI0 RX 中断


}

#if Defined (__TI_COMPILER_VERSION__)|| Defined (__IAR_SYSTEM_ICC__)
pragma vector=USCI_B1_vector
__interrupt void USCI_B1_ISR (void)
#elif defined (__GNUC__)
void _attribute__((interrupt (USCI_B1_vector)) USCI_B1_ISR (void)
#else
错误:不支持编译器!
#endif

  开关 (__even_in_RANGE (UCB1IV、USCI_SPI_UCTXIFG))
  {
    case USCI_NONE:break;//矢量 0 — 无中断
    case USCI_SPI_UCRXIFG:
    UCB1IFG &=~UCRXIFG;

    休息;
   用例 USCI_SPI_UCTXIFG:
     if (spi_byte_ptr < spi_no_of_bytes)
      {

          UCB1TXBUF = SPI_BUFFER[SPI_BYTE_ptr+];//传输字符
         UCB1IE |= UCTXIE;
      }
      暴露

     {
       UCB1IE &=~UCTXIE;
       UCB1IFG &=~UCTXIFG;

      }

     休息;
    默认值:中断;
  }
}

 首次执行代码时、中断将在该代码之后工作、中断将不起作用。

在观察示波器时、没有发生数据传输、但 CLK 引脚持续处于高电平状态。

这方面的帮助。

BR、

Yuvaraj 五

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

    启动传输的代码缺失、但有几个想法:

    1) 如果您不关心接收中断或读取 RXBUF、则无需使用该数据。 忽略它。

    2) 在 ISR 内设置 TXIE。 “那怎么办? 要执行该代码、必须已设置 TXIE。

    3) 你结束转移的方式是一个问题。 完成该操作的方法是将最后一个字节写入 TXBUF 后清除 TXIE。 不要等待下一个发送中断。 这样、下次开始传输时会设置 TXIFG、以便在设置 TXIE 时有一个立即中断。 如果 TXIFG 被清除、则没有中断。

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

    您好、  

    我曾尝试提出这些建议、但我仍然面临同样的问题。

     初始化后、中断仅生成第一个字节传输、当我在示波器上看到端口引脚状态时、该中断也不起作用、数据正在传输到外部。

    我更新后的代码如下:

    void spi_init ()

    P4SEL0 |=(BIT5| BIT6 | BIT7);//将 3-SPI 引脚设置为第二功能

    //时钟极性:非活动状态为高电平
    //MSB 在前、8 位、主器件、3 引脚模式、同步
    UCB1CTLW0 = UCSWRST;//**将状态机置于复位状态**
    UCB1CTLW0 |= UCCKPL | UCMSB | UCSYNC | UCMST | UCSSEL_SMCLK;// 3 引脚 8 位 SPI 从模式
    UCB1BRW = 0x20;
    UCB1CTLW0 &&~UCSWRST;//**初始化 USCI 状态机**
    }

    #if Defined (__TI_COMPILER_VERSION__)|| Defined (__IAR_SYSTEM_ICC__)
    pragma vector=USCI_B1_vector
    __interrupt void USCI_B1_ISR (void)
    #elif defined (__GNUC__)
    void _attribute__((interrupt (USCI_B1_vector)) USCI_B1_ISR (void)
    #else
    错误:不支持编译器!
    #endif

    开关 (__even_in_RANGE (UCB1IV、USCI_SPI_UCTXIFG))

    case USCI_NONE:break;//矢量 0 — 无中断
    case USCI_SPI_UCRXIFG:
    UCB1IFG &=~UCRXIFG;
    休息;

    用例 USCI_SPI_UCTXIFG:
    if (spi_byte_ptr < spi_no_of_bytes)

    UCB1TXBUF = SPI_BUFFER[SPI_BYTE_ptr+];//传输字符

    }
    暴露

    UCB1IE &=~UCTXIE;
    }
    UCB1IFG &=~UCRXIFG;
    UCB1IFG &=~UCTXIFG;
    休息;
    默认值:中断;
    }
    }

    内部 main (void)

    init();
    ADC_CONFIG ();

    延迟 (500);

    TB0CCTL0 |= CCIE;//比较模式
    TB0CTL |= TBSSEL_2 | MC_1 | ID_3;//通用计时器
    TB0CCR0 = 2000;
    延迟 (500);

    while (1)

       if (SPI_UPDATE_FLAG)  //SPI Flag 将每秒设置一次。
      {
         SPI_Buffer[0]= 0x11;
         SPI_BUFFER[1]= 0x0A;
         SPI_Buffer[2]= 0x04;
         SPI_UPDATE_FLAG = 0;
         SPI_BYTE_ptr = 0;
         SPI_NO_OF_BYTES = 3;


         UCB1IE |= UCTXIE;
       }

    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我尝试了这些建议、但我仍然遇到同样的问题。

    不、没有。 你让它变得更糟。 考虑设置 TXIE 后会发生什么情况。 (我必须假设 GIE 已设置,但您不会显示。) 发送数据中断触发、ISR 启动。 它向 TXBUF 写入一个字节、清除 TXIFG。 但发送移位寄存器为空、因此会立即将其传输到移位寄存器中。 设置 TXIFG。 然后在退出 ISR 之前清除 TXIFG。 不再发送中断。

    请在发布代码时使用编辑器的“插入:代码“功能。