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.

[参考译文] MSP432P401R:Launchpad 使用 SPI 问题

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/816306/msp432p401r-launchpad-uses-spi-problem

器件型号:MSP432P401R

您好,

我使用 Launchpad 的 SPI 连接到 MAX7219。

这是我的硬件连接:

我使用的是三个引脚 p9.4、p9.5和 p9.7。

以下是我的源代码。

#include "msp.h"

#include

#include "Clock.h"

#include "string.h"

#include "driverlib.h"

void SPI_init (void)

  EUSCI_A3->CTLW0 = 0x0001;       //将 eUSCI 模块保持在复位模式

  EUSCI_A3->CTLW0 = 0xAD83; //A

  EUSCI_A3->BRW = 120;

   //在 SPI 模式下不使用调制,因此清除 UCA3MCTLW

  EUSCI_A3->MCTLW = 0;

  P9->SEL0 |= 0xB0;

  P9->SEL1 &=~0xB0;//将 P9.7、P9.5和 P9.4配置为主模块功能

 

  EUSCI_A3->CTLW0 &=~0x0001;      //启用 eUSCI 模块

  EUSCI_A3->IE &=~0x0003;        //禁用中断

void Write_Max7219_BYTE (uchar 数据)

  while (EUSCI_A3->STATW & 0x01);  

  while (((EUSCI_A3->IFG & 0x02))

  EUSCI_A3->TXBUF =数据;

void Write_Max7219 (uchar 地址、uchar dat)

  WRITE_Max7219_BYTE (地址);       

  write_Max7219_Byte (dat);         

空 Init_MAX7219 (空)

  WRITE_Max7219 (0x09、0x00);    

  WRITE_Max7219 (0x0a、0x03);    

  WRITE_Max7219 (0x0B、0x07);    

  WRITE_Max7219 (0x0c、0x01);     

void clear (void)(空)

  WRITE_Max7219 (0x01、0x00);

  WRITE_Max7219 (0x02、0x00);

  WRITE_Max7219 (0x03、0x00);

  WRITE_Max7219 (0x04、0x00);

  WRITE_Max7219 (0x05、0x00);

  WRITE_Max7219 (0x06、0x00);

  WRITE_Max7219 (0x07、0x00);

  WRITE_Max7219 (0x08、0x00);

/**

 * main.c

 *

void main (void)

  unsigned char test_buf[]={0x80、0x40、0x20、0x10、0x08、0x04、0x02、0x01};

  WDT_A_HOLDTimer();

  Clock_Init48MHz ();

  spi_init();

  UINT I、j;

  Clock_Delay1ms (50);

  WRITE_Max7219 (0x0F、0x01);

  Clock_Delay1ms (1000);

  WRITE_Max7219 (0x0F、0x00);

  Clock_Delay1ms (50);

  init_MAX7219();

  Clock_Delay1ms (50);

  clear();

  Clock_Delay1ms (1000);

  while (1){

  对于(i = 0;i < 8;i++){

    WRITE_Max7219 (i+1、test_Buf[i]);

  }

  if (i ==8)

    I = 0;

  }

我不使用中断、直接操作寄存器来控制数据传输。

但是、当我发送字符数组"test_buf"时、前五个数据正常、后三个数据发送过去的结果错误。

当我执行 Write_Max7219 (6、0x04)时、数字管的结果是执行 Write_Max7219 (6、0x04)和 Write_Max7219 (8、0x06)。

我怀疑在 TXBUF 数据被传输到发送移位寄存器后、在发送下一个数据时移位寄存器不会被清除。

因为我使用 CCS 调试来查看 TXBUF 寄存器的值与我写的值相同。

如何判断是否有原因导致该误差、或者我是否可以手动清除发送移位寄存器以消除移位寄存器的影响?

谢谢、

更好

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

    您好、

    如果您使用 SimpleLink MSP432P4 SDK 中的 Driverlib API、调试将会很容易。 这些 API 由 TI 和客户进行测试、因此它们中的大多数都可以在无需直接修改寄存器的情况下工作。

    使用 Driverlib API 的示例位于 SDK 的文件夹"./examples/nortos/MSP_EXP432P401R/driverlib "中。 请使用最接近您的应用程序的示例、并根据您的需求进行修改。

    希望这对您有所帮助!

    谢谢、

    SAI

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

    您好!

    您可以通过复位外设来清除内容。  我对字节写入例程中的操作有点担心。

    void Write_Max7219_BYTE (uchar 数据)
    
    {
    
    while (EUSCI_A3->STATW & 0x01);
    
    while (((EUSCI_A3->IFG & 0x02))
    
    EUSCI_A3->TXBUF =数据;
    
    } 

    当你向 TXBUF 写入一个值并且移位寄存器中没有任何值时、它将自动移动到移位寄存器、TXIFG 将再次被置位。  您能否将函数的逻辑更改为在 TXIFG 为"0"时在 while 环路中等待、然后继续加载数据?

    while (!(EUSCI_A3->IFG 和 EUSCI_A_IFG_TXIFG));

    此致、

    Chris