#include <GLOBAL.h>
#include <stdlib.h>
#include <stdbool.h>
#include <msp430f4371.h>
#define SdaDirOut P6OUT &= ~BIT6//---弱拉输出
#define SdaDirIns P6DIR &=~ BIT6//---弱拉输入
#define SdaLow P6DIR |= BIT6//---被动低
#define SdaHig P6DIR &=~ BIT6//---被动高
#define SdaInSt P6IN & BIT6//---
/*
#define SdaDirOut P6DIR |= BIT6//---强拉输出
#define SdaDirIns P6DIR &=~ BIT6//---强拉输入
#define SdaHig P6OUT |= BIT6//---输出高
#define SdaLow P6OUT &=~ BIT6//---输出低
#define SdaInSt P6IN & BIT6
*/
void InitRTC(void)
{
SCFQCTL=SCFQ_2M;//---------------------时钟为2M
FLL_CTL0 |= XCAP10PF;
WDTCTL=WDT_ADLY_1000;//---工作于定时状态
IE1=WDTIE;//---使能看门狗定时中断;
}
void DelayTempa(unsigned int Time)
{
unsigned char i,j;
i=Time;
j=Time;
_NOP();
while(i--);
_NOP();
while(j--);
_NOP();
}
void TempaInit(void)
{
SdaDirOut;
SdaHig;
}
unsigned char ChkTempaChip(void)
{
unsigned char Chip;
SdaDirOut;
SdaHig;
DelayTempa(10);
SdaLow;
DelayTempa(480);//---等待480微秒
SdaHig;
SdaDirIns;
DelayTempa(10);
if(P6IN & BIT6)
{
Chip=0xff;
}
else
{
Chip=0x00;
}
SdaDirOut;
SdaHig;
DelayTempa(10);//---等待480微秒
return Chip;
}
//-----***-从slave端读取一个数据-***-----//
unsigned char ReadByte(void)
{
unsigned char i;
unsigned char ByteData=0;
SdaDirOut;
SdaLow;
for(i=0;i<8;i++)
{
SdaDirOut;
SdaLow;
ByteData>>=1;
SdaHig;
SdaDirIns;
if(P6IN & BIT6)
{
ByteData |=0x80;
}
DelayTempa(5);
SdaDirOut;
DelayTempa(25);
}
return ByteData;
}
//-----***-传送一个 Byte 数据到 slave-***-----//
void WriteByte(unsigned char DataByte)
{
unsigned char i;
SdaDirOut;
for(i=0;i<8;i++)
{
SdaLow;
if(DataByte & 0x01)
{
SdaHig;//IicSda=1;
}
else
{
SdaLow;
}
DelayTempa(30);
SdaHig;
DataByte >>=1;
}
DelayTempa(10);
}
void ReadTempa(unsigned char *RecData)
{
*(RecData)=0;
*(RecData+1)=0;
if(ChkTempaChip()==0x00)
{
WriteByte(0xCC);
WriteByte(0x44);
DelayTempa(3000);
}
if(ChkTempaChip()==0x00)
{
WriteByte(0xCC);
WriteByte(0xBE);
*(RecData)=ReadByte();
*(RecData+1)=ReadByte();
}
}
void TempPack(void)
{
if(SecondsConn&0x40)//---秒使能控制
{
_DINT();
TempaData=0;
ReadTempa((unsigned char*)&TempaData);
TempaData=TempaData*625;
TempaData=TempaData/100;
_EINT();
SecondsConn&=0xbf;
}
}
int main(void)
{
InitRTC();
TempaInit();
for(;;)
{
TempPack();
}
}
#pragma vector=WDT_VECTOR
__interrupt void WDT_Delay(void)
{
SecondsConn=0xff;
LPM3_EXIT;
}