#include <msp430xw42x.h>
#include "ScanIf.h"
const unsigned char PSMCalib[] =
{
0x00,
0x00,
0x00,
0x00,
};
unsigned int WaitCounter;
unsigned int V1;
unsigned int V2;
unsigned int V3;
unsigned int V4;
const unsigned char PSM[] =
{
0x00, // 状态 0
0x13, // 状态 1
0x0C, // 状态 2
0x4D, // 状态 3
0x04, // 状态 4
0x01, // 状态 5
0x4C, // 状态 6
0x5B, // 状态 7
0x52, // 状态 8
0x45, // 状态 9
0x08, // 状态 10
0x0D, // 状态 11
0x44, // 状态 12
0x05, // 状态 13
0x5A, // 状态 14
0x09, // 状态 15
0x10, // 状态 16
0x13, // 状态 17
0x4C, // 状态 18
0x5B, // 状态 19
0x44, // 状态 20
0x11, // 状态 21
0x5A, // 状态 22
0x1B, // 状态 23
0x12, // 状态 24
0x53, // 状态 25
0x18, // 状态 26
0x4D, // 状态 27
0x52, // 状态 28
0x45, // 状态 29
0x1A, // 状态 30
0x19 // 状态 31
};
void main(void)
{
//停止看门狗
WDTCTL = WDTPW + WDTHOLD;
//设置电容
FLL_CTL0 |= XCAP10PF;
//端口初始化
P1OUT = 0x00;
P1DIR = 0xFF;
P2DIR = 0x7F;
P3DIR = 0xFF;
P4DIR = 0xFF;
P5DIR = 0xFF;
P6DIR = 0xFF;
//P2.7设置为SIFCLKG
P2SEL |= BIT7;
//校正DAC的门限
SIFCalib();
//初始化SCAN IF
InitScanIF();
//中断使能
_EINT();
while (1)
{
//测试SIF0OUT
if (SIFCTL3 & 0x01)
{
//SIF0OUT=1的场合
P1OUT |= BIT7;
}
else
{
P1OUT &= ~BIT7;
}
//测试SIF1OUT
if (SIFCTL3 & 0x02)
{
//SIF1OUT=1的场合
P1OUT |= BIT6;
}
else
{
P1OUT &= ~BIT6;
}
}
}
void InitScanIF(void)
{
int i;
//设置SCAN IF 通道
P6SEL |= BIT0;
P6SEL |= BIT1;
//定时状态机初始化
//DAC关闭, CA关闭, 31个SMCLK周期(为两个LC传感器延迟一点个时间)
SIFTSM0 = 0x8800;
//DAC关闭, CA关闭, 1个SIFCLK,激励SIFCH.0
SIFTSM1 = 0x002C;
//DAC关闭, CA关闭, 1个ACLK,SIFCH.0
SIFTSM2 = 0x0424;
//DAC打开, CA打开, 4个SIFCLK,SIFCH.0
SIFTSM3 = 0x1934;
//DAC打开, CA打开, 14个SIFCLK,SIFCH.0
SIFTSM4 = 0x4134;
//DAC打开, CA打开, 14个SIFCLK,SIFCH.0
SIFTSM5 = 0x2174;
//DAC关闭, CA关闭, 1个SIFCLK,激励SIFCH.1
SIFTSM6 = 0x002D;
//DAC关闭, CA关闭, 1个ACLK,SIFCH.1
SIFTSM7 = 0x0425;
//DAC关闭, CA关闭, 1个ACLK,SIFCH.1
SIFTSM8 = 0x1935;
//DAC打开, CA打开, 4个SIFCLK,SIFCH.1
SIFTSM9 = 0x4135;
//DAC打开, CA打开, 4个SIFCLK,SIFCH.1
SIFTSM10 = 0x2175;
//停止
SIFTSM11 = 0x0220;
//初始化SCAN IF接口寄存器
//DAC和比较器由SIFTSMx控制
SIFCTL2 = 0x0140;
//延迟一点时间
for (i = 0;i <= 857;i++) ;
//S1为SIF0OUT,S2为SIF1OUT
SIFCTL3 = 0x4000;
//初始化PSM计数器
SIFCTL4 = 0x33F0;
//SIFCLK由SIFTSMx控制,SIFCLK = 1MHz
SIFCTL5 = 0x0045;
//顶事状态矢量
SIFPSMV = (unsigned int) &PSM;
//打开SCAN IF,中断使能
SIFCTL1 |= 0x1001;
}
void SIFCalib (void)
{
int i;
WDTCTL = WDT_ADLY_1000;
_EINT();
IE1 |= WDTIE;
WaitCounter=5;
//等待5秒后开始校正
while (WaitCounter>0);
//看门狗禁止
WDTCTL = WDTPW + WDTHOLD;
//设置SCAN IF 通道
P6SEL |= BIT0;
P6SEL |= BIT1;
//定时状态机初始化
//DAC关闭, CA关闭, 31个SMCLK周期(为两个LC传感器延迟一点个时间)
SIFTSM0 = 0x8800;
//DAC关闭, CA关闭, 1个SMCLK,激励SIFCH.0
SIFTSM1 = 0x000C;
//DAC关闭, CA关闭, 1个ACLK,SIFCH.0
SIFTSM2 = 0x0404;
//DAC打开, CA打开, 4个SMCLK,SIFCH.0
SIFTSM3 = 0x1914;
//DAC打开, CA打开, 9个SMCLK,SIFCH.0
SIFTSM4 = 0x4114;
//DAC打开, CA打开, 5个SMCLK,测试,SIFCH.0
SIFTSM5 = 0x2154;
//DAC关闭, CA关闭, 1个SMCLK,激励SIFCH.1
SIFTSM6 = 0x000D;
//DAC关闭, CA关闭, 1个ACLK,SIFCH.1
SIFTSM7 = 0x0405;
//DAC打开, CA打开, 4个SMCLK,SIFCH.1
SIFTSM8 = 0x1915;
//DAC打开, CA打开, 9个SMCLK,SIFCH.1
SIFTSM9 = 0x4115;
//DAC打开, CA打开, 5个SMCLK,测试,SIFCH.1
SIFTSM10= 0x2155;
//停止
SIFTSM11 = 0x0200;
//初始化DAC的值
//设置SIFCH.0最大的值
SIFDACR0 = 0x03FF;
SIFDACR1 = 0x03FF;
//设置SIFCH.1最大的值
SIFDACR2 = 0x03FF;
SIFDACR3 = 0x03FF;
//初始化控制寄存器
//DAC和比较器由SIFTSMx控制
SIFCTL2 = 0x0140;
//延迟一点时间
for (i = 0;i <= 857;i++) ;
//S1为SIF0OUT,S2为SIF1OUT
SIFCTL3 = 0x4000;
//设置SIFCNT
SIFCTL4 = 0x0120;
//打开SIFCLK
SIFCTL5 = 0x0047;
//信号处理状态地址
SIFPSMV = (unsigned int) &PSMCalib;
//SIF_EN设置为1
SIFCTL1 |= 0x0001;
// 传感器1、
// 测试1
while (!(SIFCTL3 & 0x01))
{
for(i = 0;i <= 100;i++) ;
SIFDACR0=SIFDACR0-1;
SIFDACR1=SIFDACR1-1;
}
V1 = SIFDACR1;
SIFDACR0 = 0x200;
SIFDACR1 = 0x200;
//测试2
while (SIFCTL3&0x01)
{
for(i = 0;i <= 100;i++) ;
SIFDACR0=SIFDACR0+1;
SIFDACR1=SIFDACR1+1;
}
V2 = SIFDACR1;
//平均值
SIFDACR0 = (V2 + V1) / 2;
SIFDACR1 = SIFDACR0;
SIFDACR0 = SIFDACR0 + 30;
SIFDACR1 = SIFDACR1 - 30;
//传感器2
//测试1
while (!(SIFCTL3 & 0x02))
{
for(i = 0;i <= 100;i++);
SIFDACR2=SIFDACR2-1;
SIFDACR3=SIFDACR3-1;
}
V1 = SIFDACR2;
SIFDACR2 = 0x200;
SIFDACR3 = 0x200;
//测试2
while (SIFCTL3&0x02)
{
for(i = 0;i <= 100;i++);
SIFDACR2=SIFDACR2+1;
SIFDACR3=SIFDACR3+1;
}
V2 = SIFDACR3;
//平均值
SIFDACR2 = (V2 + V1) / 2;
SIFDACR3 = SIFDACR2;
SIFDACR2 = SIFDACR2 + 30;
SIFDACR3 = SIFDACR3 - 30;
}
#if __VER__ < 200
interrupt [SCANIF_VECTOR] void ISR_ScanIF(void)
#else
#pragma vector=SCANIF_VECTOR
__interrupt void ISR_ScanIF(void)
#endif
{
SIFCTL1 &= ~0x0060;
}
#if __VER__ < 200
interrupt [WDT_VECTOR] void ISR_WDT(void)
#else
#pragma vector=WDT_VECTOR
__interrupt void ISR_WDT(void)
#endif
{
WaitCounter = WaitCounter - 1;
}