⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ade7758.asm

📁 关于ADE7758的读写操作(处理器采用MSP430F449)
💻 ASM
字号:
关于ADE7758的读写操作(处理器采用MSP430F449) 
来源:21ic 作者:leetb 栏目:测控之家 
关于ADE7758的读写操作(处理器采用MSP430F449)


程序清单如下:

//operating SPI PORTS --CAN
#include "msp430x44x.h"

unsigned char SPIData[3]; // 收到的ADE7758的数据信息
unsigned char SPI_Num; // 接收字符计数器 
unsigned char SPICMD[3]; // 待发送命令字符串


// ***************************************************************************** 
// 同步串行通讯 -- 延时子程序
void SPIDelay(int DelayTimes)
{ while (DelayTimes > 0) DelayTimes--;
}

// ***************************************************************************** 
// 同步串行通讯 -- 初始化7758通讯接口模块
void Init_SPI1(void)
{ // 初始化USART1为SPI工作模式
UCTL1 &= ~SWRST; // 开始 USART1 的初始化设置
UCTL1 |= CHAR; // USART1 8 BITS 数据模式
UCTL1 |= SYNC; // USART1 SPI 通讯模式
UCTL1 |= MM; // USART1 SPI 主模式

UTCTL1 |= STC; // 从机发送模式,1是SPI的3线模式,STE引脚不作用
UTCTL1 |= SSEL1; // 选择子系统时钟 SMCLK
UTCTL1 |= SSEL0; // 
//UTCTL1 |= CKPL; // UCLK1信号 与 UCLK信号 极性相反
UTCTL1 &= ~CKPL;
UBR01 = 0x08; // 同步信号分频因子 1MHz @ 8MHz
UBR11 = 0x00;
UMCTL1 = 0x00; // 波特率因子调整因子

ME2 |= USPIE1; // 开启USART1 的 SPI 模块

P4SEL |= 0X3C; // 进行特定的端子设置 
P4DIR |= 0X0C;
IE2 |= URXIE1; // SPI 接收中断允许
UCTL1 &= ~SWRST; // USART1 SPI 模式设置完毕 
P4OUT &= ~BIT2; // ADE7758 常选通状态
}

// ***************************************************************************** 
// 同步串行通讯 -- 写ADE7758模块
// Addr 为ADE7758模块内部寄存器地址
// Length 为ADE7758相应的寄存器数据长度
// SPICMD[0..2] 待发送信息
void Write_7758(unsigned char Address,unsigned char Length)
{ unsigned char num;
// 选通 ADE7758
while ((UTCTL1 & TXEPT)==0); // 判断发送缓冲区是否为空 
TXBUF1 = Address | 0x80; // 发送 待写地址
SPIDelay(10); // 延时
for (num = 0; num < Length; num++) // 循环发送多字节信息
{ while ((UTCTL1 & TXEPT)==0); // 判断发送缓冲区是否为空
TXBUF1 = SPICMD[num]; // 发送 待写地址
SPIDelay(1); // 延时
} 
}

// ***************************************************************************** 
// 同步串行通讯 -- 读ADE7758模块
// Addr 为ADE7758模块内部寄存器地址
// Length 为ADE7758相应的寄存器数据长度
// SPIData[0..2] 为接收到的数据信息
void Read_7758(unsigned char Address)
{ // 选通 ADE7758
while ((UTCTL1 & TXEPT)==0); // 判断发送缓冲区是否为空
TXBUF1 = Address; // 发送 读地址
SPIDelay(1); // 延时
SPI_Num = 0; // 初始化接收数据个数 
}

// ***************************************************************************** 
// 同步串行通讯 -- 初始化ADE7758模块
void Init_7758(void)
{ 
// SPCR=0x2A;
SPICMD[0] = 0x40; // 操作模式寄存器
Write_7758(0x13,1); // measurement mode
SPIDelay(10);
Read_7758(0x13);

SPICMD[0] = 0x00; // 软件复位 
Write_7758(0x13,1); // measurement mode
SPIDelay(10);

SPICMD[0] = 0x38; // Line Cycle Accumulation Mode
Write_7758(0x17,1);

SPICMD[0] = 0x00; // Interrupt Mask 
SPICMD[1] = 0x00; 
SPICMD[2] = 0x00; 
Write_7758(0x18,3);

SPICMD[0] = 0x00; // Gain 
Write_7758(0x23,1);
//SPCR=0x22;

}


#pragma vector = USART1RX_VECTOR // USART 1 接收信息中断
__interrupt void U7758_ISP(void) // SPI1 发送中断服务程序
{
SPIData[SPI_Num] = RXBUF1;
IFG2 &= ~URXIFG1;
SPI_Num++;
}

void main(void)
{ int i;
WDTCTL = WDTPW + WDTHOLD; 
// FLL_CTL0 |= XCAP14PF;
SCFI0 = 0X20; 
// FN_4; // 设置系统工作频率 
SCFI1 = 0X20;
//SCFQCTL = 64; // (121+1) * 32768 * 2 = 7.99MHz 
FLL_CTL0 = 0XEC; 
FLL_CTL1 = 0X00;
P1DIR = 32;
P1SEL = 32;

Init_SPI1();
// Init_7758();
_EINT();
for (i=0;i<100;i++) Read_7758(i);
while (1) Read_7758(0x46); 
}


MSP430F449采用三线SPI主模式,采用1MHZ的通讯频率与ADE7758通讯。


449采用中断方式进行接收。

通过示波器可以看到收发的时序。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -