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.

[参考译文] MSP430F5325:使用 USCI_A0来执行硬件 SPI 时遇到问题

Guru**** 2530630 points
Other Parts Discussed in Thread: MSP-FET, MSP430F5325

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1102974/msp430f5325-trouble-implementing-hardware-spi-using-usci_a0

器件型号:MSP430F5325
主题中讨论的其他器件:MSP-FET

大家好、

我对 MSP430器件比较陌生、最近为  MSP430F5325设计了自己的原型板。 我已经使用 MSP-FET 在 CCS 中的 SPI-Bi-Wire 调试接口上运行了一些简单的代码、现在我正在尝试通过 SPI 输出数据。 我在 YouTube 上关注了这个关于 不同 MSP430器件的教程、虽然它很有用、但它不起作用、并且在进行一些更改后、我仍然无法使它正常工作。 我已经阅读了产品数据表并在系列数据表中搜索了相关信息、但仍然不太幸运。 我想我一定会错过一些东西。  

以下是我的代码:

#include <msp430.h>

char packet[] = {0xF0, 0xF0, 0xF0, 0x40};
unsigned int position;

void main(void)
{
    WDTCTL = WDTPW | WDTHOLD;       // stop watchdog timer

    // -- setup A0 for SPI
    UCA0CTLW0 |=  UCSWRST;          // put A0 into SW Reset

    UCA0CTLW0 |= UCSSEL__SMCLK;     // Choose SMCLK

    UCA0BRW = 10;                  // Set prescaler to 10 to get SCLK = 400kHz

    UCA0CTLW0 |= UCSYNC;            // Put A0 into SPI mode
    UCA0CTLW0 |= UCMST;             // Put into SPI Master

    // -- configure ports
    P2DIR |= BIT7;
    P2SEL |= BIT7;                // P2.7 = SCK (01)

    P3DIR |= BIT3;
    P3SEL |= BIT3;                // P3.3 = SIMO (01)

    P3DIR &= ~BIT4;
    P3SEL |= BIT4;                // P3.4 = SOMI (01)


    UCA0CTLW0 &=  ~UCSWRST;          // Take out of SW Reset

    //-- Enable IRQs
    UCA0IE |= UCTXIE;               // enable A0 Tx IRQ
    UCA0IFG &= ~UCTXIFG;            // clear flag

    __enable_interrupt();           // enable global

    UCA0TXBUF = packet[position];   // send first byte


    while(1){}

    //return 0;
}

 // ------------------------------------------
 // -- ISR
 //void __attribute__((interrupt(USCI_A0_VECTOR)))
#pragma vector = USCI_A0_VECTOR
__interrupt void ISR_USCI_A0(void)
{
     position++;

     if (position < sizeof(packet))
     {
         UCA0TXBUF = packet[position];
     } else
     {
         UCA0IFG &= ~UCTXIFG;
     }

 }

最初、我像 YouTube 视频中的人一样使用 PxSELy、但后来我了解到我的控制器只有一个 PxSEL 寄存器、因此我删除了第二组寄存器。 我添加 了 PxDIR 行 以尝试获取某种输出、但我也尝试不使用它们。 我使用 ADLM2000的示波 器设置测量信号。 我已经看到一些引脚变为高电平或低电平、具体取决于我尝试的操作、但没有什么与 我期望的串行数据类似的东西。  

感谢您的所有帮助和反馈。 谢谢!

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

    UCA0是一个 USCI、而不是 eUSCI、因此寄存器是不同的。 例如、UCSWRST 位于 UCA0CTLW1中。

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

    尊敬的 David:  

    感谢您指出这 一点、我不知道有什么不同。 我将尝试此操作并告知您。 同时、这是否也意味着我的中断矢量不正确? 当我运行调试器时、它 会在第一个数据包被载入到发送缓冲区后运行 ISR、因此我假定这是正确的矢量。  

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

    您可以参考此演示代码

    https://dev.ti.com/tirex/explore/node?node=ACCC1nWLK4b43TBZhuwnmQ__IOGqZri__LATEST 

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

    感谢您的参与、这非常有帮助、我不知道这些演示是否存在。