主题中讨论的其他器件:MSP430FR5994、 MSP430WARE
亲爱的社区、您好!
我正在尝试管理 MSP430FR5994和来自 Analog Devices 的 ADE7878电能计量 IC 之间的 SPI 通信。 在 LaunchPad 上测试代码时一切都正常。 我将 SIMO 和 SOMI 线连接在一起、可以在逻辑分析仪上看到我发送的数据、并将接收到的数据存储到我的变量中。 当我连接 IC 时、问题就开始了。 我能够写入寄存器、我可以在逻辑分析仪上看到正确的数据、并在评估板上测量更改。 当我尝试执行读取操作时、我可以看到 IC 在 SOMI 线上返回正确的数据。 我的问题是、我从 UCB1RXBUF 读取错误的数据、它几乎总是0xFF。 有时、当我读取1字节寄存器时、我会收到正确的值。 如果有人能告诉我如何处理此问题、我将非常感激。
提前感谢!
伊利亚
#include
#include
#define 虚拟 0x00
#define CONFIG2 0xEC01
#define STATUS1 0xE503
#define run 0xE228
#define LAST_OP 0xE7FD
#define LAST_ADDR 0xE6FE
#define LAST_RWDATA_8 0xE7FC
#define LAST_RWDATA_16 0xE6FF
#define LAST_RWDATA_32 0xE5FF
#define PGA 0xE60F
#define COMPMODE 0xE60E
#define WTHR1 0x43AB
#define WTHR0 0x43AA
#define VLEVEL 0x43B3
#define iARMS_LRIP 0xE531
#define VARMS_LRIP 0xE531
void send (unsigned int addr、char nr_Bytes、unsigned long TX_data);
unsigned volatile char byte1、byte2、byte3、byte4;
空读取(unsigned int addr、char nr_Bytes);
volatile unsigned char rx1、rx2、rx3、RX4;
unsigned char SPI_8 (unsigned char TXdata);
unsigned volatile char TXdata;
unsigned volatile char RXdata;
void SPI_enable (void);
void SPI_disable (void);
void init (void);
volatile int counter1=0;
volatile int counter2 = 0;
int main (空)
{
WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器
P5SEL1 &=~Ω(BIT0 | BIT1 | BIT2); // USCI_B1 SCLK、MOSI 和 MISO 引脚
P5SEL0 |=(BIT0 | BIT1 | BIT2); // USCI_B1 SCLK、MOSI 和 MISO 引脚
P6DIR |= BIT3; // P6.3输出 CSn
P3DIR &= ~BIT7; // CF3_HSCLK_EXT
P3DIR &= ~BIT6; // cf2_HREADY_EXT
P3DIR &= ~BIT4; // cf1_EXT
P4DIR |= BIT1; // P4.1 PM0
P4DIR |= BIT2; // P4.2 PM1
P4OUT |= BIT1; // P4.1 PM0高电平
P4OUT &= ~BIT2; // P4.2 PM1低电平
P4DIR &= ~BIT3; // P4.3 IRQ0B
P2DIR &= ~BIT4; // P2.5 IRQ1B
P8DIR |= BIT3; // P8.3 RESB_CTRL 未售出
PM5CTL0 &=~LOCKLPM5; //禁用 GPIO 上电默认高阻抗模式以激活先前配置的端口设置
UCB1CTLW0 = UCSWRST; //**将状态机置于重置中**
UCB1CTLW0 |= UCMST | UCSYNC | UCCKPL | UCMSB; //主器件|同步模式|非活动状态-高电平| MSB 在前
UCB1CTLW0 &=~UCCKPH; //数据在第一个 UCLK 上发生变化,在以下???
UCB1CTLW0 |= UCSSEL_ACLK; // ACLK
UCB1BRW = 0x04; ///2
//UCB1MCTLW = 0; //无调制
UCB1CTLW0 &=~UCSWRST; //**初始化 USCI 状态机**
UCB1IE |= UCRXIE; //启用接收中断
UCB1IE |= UCTXIE; //启用发送中断
// //
init();
读(status1、 4);
读取(COMPMODE,2);
读取(运行、 2);
读取(WHR1、 4);
读取(WTHR0、 4);
读取(PGA、 2);
读取(VLEVEL、 4);
}
unsigned char SPI_8 (unsigned char TXdata)
{
while (UCB1STATW 和 UCBUSY);
UCB1TXBUF = TXDATA;
while (UCB1STATW 和 UCBUSY);
RXDATA = UCB1RXBUF;
返回(RXDATA);
}
void send (unsigned int addr、char nr_Bytes、unsigned long TX_data)
{
unsigned char reg1、reg2;
reg1 =(addr >> 8)&0xFF;
reg2 = addr & 0xFF;
switch (nr_Bytes)
{
案例1:
字节1 = TX_DATA & 0xFF;
SPI_ENABLE();
SPI_8 (0x00);
SPI_8 (reg1);
SPI_8 (reg2);
SPI_8 (字节1);
spi_disable();
中断;
案例2:
字节1 =(TX_DATA >> 8)&0xFF;
字节2 = TX_DATA & 0xFF;
SPI_ENABLE();
SPI_8 (0x00);
SPI_8 (reg1);
SPI_8 (reg2);
SPI_8 (字节1);
SPI_8 (字节2);
spi_disable();
中断;
案例3:
字节1 =(TX_DATA >> 16)&0xFF;
字节2 =(TX_DATA >> 8)&0xFF;
字节3 = TX_DATA & 0xFF;
SPI_ENABLE();
SPI_8 (0x00);
SPI_8 (reg1);
SPI_8 (reg2);
SPI_8 (字节1);
SPI_8 (字节2);
SPI_8 (字节3);
spi_disable();
中断;
案例4:
字节1 =(TX_DATA >> 24)&0xFF;
字节2 =(TX_DATA >> 16)&0xFF;
字节3 =(TX_DATA >> 8)&0xFF;
字节4 = TX_DATA & 0xFF;
SPI_ENABLE();
SPI_8 (0x00);
SPI_8 (reg1);
SPI_8 (reg2);
SPI_8 (字节1);
SPI_8 (字节2);
SPI_8 (字节3);
SPI_8 (字节4);
spi_disable();
中断;
默认值:
中断;
}
}
空读取(unsigned int addr、char nr_Bytes)
{
unsigned char reg1、reg2;
reg1 =(addr >> 8)&0xFF;
reg2 = addr & 0xFF;
switch (nr_Bytes)
{
案例1:
SPI_ENABLE();
SPI_8 (0x01);
SPI_8 (reg1);
SPI_8 (reg2);
Rx1 = SPI_8 (虚拟);
spi_disable();
中断;
案例2:
SPI_ENABLE();
SPI_8 (0x01);
SPI_8 (reg1);
SPI_8 (reg2);
Rx1 = SPI_8 (虚拟);
rx2 = SPI_8 (虚拟);
spi_disable();
中断;
案例3:
SPI_ENABLE();
SPI_8 (0x01);
SPI_8 (reg1);
SPI_8 (reg2);
Rx1 = SPI_8 (虚拟);
rx2 = SPI_8 (虚拟);
rx3 = SPI_8 (虚拟);
spi_disable();
中断;
案例4:
SPI_ENABLE();
SPI_8 (0x01);
SPI_8 (reg1);
SPI_8 (reg2);
Rx1 = SPI_8 (虚拟);
rx2 = SPI_8 (虚拟);
rx3 = SPI_8 (虚拟);
RX4 = SPI_8 (虚拟);
spi_disable();
中断;
默认值:
中断;
}
}
void SPI_enable (void)
{
P6OUT &=~BIT3;
}
void SPI_disable (void)
{
P6OUT |= BIT3;
}
空 init (空)
{
SPI_ENABLE();
spi_disable();
SPI_ENABLE();
spi_disable();
SPI_ENABLE();
spi_disable();
for (counter1 = 0;counter1 < 10;counter1 ++)
{
SEND (CONFIG2、1、0x00000000);
}
SEND (STATUS1、 4、0x00208000);
SEND (COMPMODE、2、0x000000FF);
发送(运行、 2、0x00000001);
发送(WHR1、 4、0x00000001);
发送(WTHR0、 4、0x00FF6A6B);
发送(PGA、 2、0x00000000);
发送(VLEVEL、 4、0x000A9B4A);
}