您好,
我使用 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 寄存器的值与我写的值相同。
如何判断是否有原因导致该误差、或者我是否可以手动清除发送移位寄存器以消除移位寄存器的影响?
谢谢、
更好