📄 3539a.c
字号:
#include <msp430x14x.h>
#include "sfuntion.h"
#define INT1 BIT7 //P2.7
#define SDA BIT1 //P3.1
#define SCK BIT3 //P3.3
extern uchar real_1[7];
extern uchar real_2[3];
uchar data[7]={0x08,0x05,0x20,0x02,0x17,0x09,0x55};//实时数据
uchar INT1_Dat[3]={0x00,0x0d7,0x090}; //报警数据
void delay5us() //延时5us
{for(uchar i=0;i<7;i++);
}
void IO_s3539(void) //IO初始化
{P2DIR&=~INT1;
P2IE|=INT1;
P2IES|=INT1;
P3DIR|=SDA+SCK;
P3OUT&=~(SDA+SCK);
}
void start_s3539(void) //Strat condition
{ P3OUT|=SDA;
P3OUT|=SCK; //当sck为高时,sda有高到低的变化表示起始条件
delay5us();
P3OUT&=~SDA;
delay5us();
P3OUT&=~SCK;
}
void stop_s3539(void) //stop condition
{ P3OUT&=~SDA;
//delay5us();
P3OUT|=SCK;
delay5us();
P3OUT|=SDA;
delay5us();
P3OUT&=~SCK;
P3OUT&=~SDA;
}
uchar ACK_s3539(void) //s3539 acknowledge
{uchar i;
P3DIR&=~SDA;
_NOP();
_NOP();
delay5us();
P3OUT|=SCK;
//if(P3IN&SDA!=0)
i=P3IN;
delay5us();
P3OUT&=~SCK;
delay5us();
P3DIR|=SDA;
return (i&SDA); //i=0表示应答,i=1表示没有应答
}
void w_command(uchar com) //command data writing
{uchar i;
for(i=0;i<8;i++)
{ //delay5us();
if(com&0x80)
P3OUT|=SDA;
else
P3OUT&=~SDA;
_NOP();
_NOP(); //
delay5us();
P3OUT|=SCK;
delay5us();
P3OUT&=~SCK;
com<<=1;
}
}
void w_s3539(uchar com) //real-time data writing
{uchar i;
for(i=0;i<8;i++)
{ //delay5us();
if(com&0x01)
P3OUT|=SDA;
else
P3OUT&=~SDA;
_NOP();
_NOP();
delay5us();
P3OUT|=SCK;
delay5us();
P3OUT&=~SCK;
com>>=1;}
}
uchar r_s3539(void) // real-time data reading
{uchar i,dat=0;
P3DIR&=~SDA;
for(i=0;i<8;i++)
{ delay5us();
P3OUT|=SCK;
dat>>=1;
if(P3IN&SDA)
dat|=0x80;
delay5us();
P3OUT&=~SCK;
//delay5us();
}
P3DIR|=SDA;
return dat;
}
void ACK_430(void)//CPU acknowledge
{ P3OUT&=~SDA;
//_NOP();
// _NOP();
delay5us();
P3OUT|=SCK;
delay5us();
P3OUT&=~SCK;
delay5us();
}
void rst_s3539(void)
{uchar ack;
str:
do
{ start_s3539();
w_command(0x60); //写入复位指令,并应答
ack=ACK_s3539();}
while(ack);
w_s3539(0x03);
ack=ACK_s3539();
if(ack)
goto str;
stop_s3539();
}
void INT_s3539(void) //设置INT1为报警中断
{uchar ack;
str:
do
{ start_s3539();
w_command(0x62); //写入寄存器2命令
ack=ACK_s3539();}
while(ack);
w_s3539(0x04); //中断模式设置
ack=ACK_s3539();
if(ack)
goto str;
stop_s3539();
}
void init_s3539(void) //初始化,并且写入实时数据,模式为默认
{uchar ack,i;
IO_s3539();
rst:
do
{ rst_s3539();
start_s3539();
w_command(0x64); //写入写实时数据指令,并应答
ack=ACK_s3539();}
while(ack);
for(i=0;i<7;i++) //写入实时数据
{w_s3539(data[i]);
ack=ACK_s3539();
if(ack)
goto rst;}
stop_s3539();
}
void INT_Status1()
{uchar ack,i;
sta:
do
{start_s3539();
w_command(0x68); //写入写INT1寄存器_1指令,并应答
ack=ACK_s3539();}
while(ack);
for(i=0;i<3;i++) //写入INT1寄存器_1
{w_s3539(INT1_Dat[i]);
ack=ACK_s3539();
if(ack)
goto sta;}
stop_s3539();
}
void Read_realtime1(void)
{uchar ack,i;
do
{ start_s3539();
w_command(0x65);
ack=ACK_s3539();}
while(ack);
for(i=0;i<7;i++)
{real_1[i]=r_s3539();
if(i<6)
ACK_430();
}
stop_s3539();
}
void Read_realtime2(void)
{uchar ack,i;
do
{ start_s3539();
w_command(0x67);
ack=ACK_s3539();}
while(ack);
for(i=0;i<3;i++)
{real_2[i]=r_s3539();
if(i<2)
ACK_430();
}
stop_s3539();
}
uchar Read_status1()
{uchar ack,i;
do
{ start_s3539();
w_command(0x61);
ack=ACK_s3539();}
while(ack);
i=r_s3539();
return i;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -