📄 init8583.c
字号:
#include "DSP281x_Device.h" // DSP281x Headerfile Include File From TI
#include "SCI2.h"
void init_8583()
{
/* do
{start_8583();
ADDRESS_8583.all=0x00A0; //slave address
write_8583();
EX_ACK(); //检查应答信号
}while(FLAG_8583==0);
do
{ADDRESS_8583.all=0x0003; //ALARM CONTROL寄存器address
write_8583();
EX_ACK(); //检查应答信号
}while(FLAG_8583==0);
//re3
do
// {ADDRESS_8583.all=0x000A; //分 初始化状态寄存器,这里应该是data,但为了方便编程还用address
{ADDRESS_8583.all=0x0055; //妙 初始化状态寄存器,这里应该是data,但为了方便编程还用address
write_8583();
EX_ACK();
}while(FLAG_8583==0);
TR_NACK();
stop_8583(); //完成一次写ALARM CONTROL寄存器的操作
getdata_8583();
*/
//re0
do
{start_8583();
ADDRESS_8583.all=0x00A0; //slave address
write_8583();
EX_ACK(); //检查应答信号
}while(FLAG_8583==0);
do
{ADDRESS_8583.all=0x0000; //状态寄存器address
write_8583();
EX_ACK(); //检查应答信号
}while(FLAG_8583==0);
//re1
do
{ADDRESS_8583.all=0x0004; //初始化状态寄存器,这里应该是data,但为了方便编程还用address
write_8583();
EX_ACK();
}while(FLAG_8583==0);
TR_NACK();
stop_8583(); //完成一次写状态寄存器的操作
//re2
do
{start_8583();
ADDRESS_8583.all=0x00A0; //slave address
write_8583();
EX_ACK(); //检查应答信号
}while(FLAG_8583==0);
do
{ADDRESS_8583.all=0x0008; //ALARM CONTROL寄存器address
write_8583();
EX_ACK(); //检查应答信号
}while(FLAG_8583==0);
//re3
do
{ADDRESS_8583.all=0x000A; //分 初始化状态寄存器,这里应该是data,但为了方便编程还用address
// {ADDRESS_8583.all=0x0009; //妙 初始化状态寄存器,这里应该是data,但为了方便编程还用address
write_8583();
EX_ACK();
}while(FLAG_8583==0);
TR_NACK();
stop_8583(); //完成一次写ALARM CONTROL寄存器的操作
//re4
do
{start_8583();
ADDRESS_8583.all=0x00A0; //slave address
write_8583();
EX_ACK(); //检查应答信号
}while(FLAG_8583==0);
do
{ADDRESS_8583.all=0x0007; //周期寄存器address
write_8583();
EX_ACK(); //检查应答信号
}while(FLAG_8583==0);
//re5
do
{ADDRESS_8583.all=0x0040; //初始化周期寄存器,这里应该是data,但为了方便编程还用address
write_8583();
EX_ACK();
}while(FLAG_8583==0);
TR_NACK();
stop_8583(); //完成一次写周期寄存器的操作
getdata_8583();
}
void getdata_8583(void)
{
start_8583();
ADDRESS_8583.all=0x00A0; //slave address for write
write_8583();
EX_ACK();
ADDRESS_8583.all=0x0008; //周期寄存器address
write_8583();
EX_ACK();
start_8583();
ADDRESS_8583.all=0x00A1; //slave address for read
write_8583();
EX_ACK();
ADDRESS_8583.all=0;
read_8583();
TR_NACK();
stop_8583();
}
void read_8583(void)
{
EALLOW;
GpioMuxRegs.GPADIR.bit.GPIOA8=0;
EDIS;
GpioDataRegs.GPADAT.bit.GPIOA9=1;
Delay_4us();
ADDRESS_858.bit.ADDRESS_7=GpioDataRegs.GPADAT.bit.GPIOA8;
GpioDataRegs.GPADAT.bit.GPIOA9=0;
Delay_4us();
GpioDataRegs.GPADAT.bit.GPIOA9=1;
Delay_4us();
ADDRESS_858.bit.ADDRESS_6=GpioDataRegs.GPADAT.bit.GPIOA8;
GpioDataRegs.GPADAT.bit.GPIOA9=0;
Delay_4us();
GpioDataRegs.GPADAT.bit.GPIOA9=1;
Delay_4us();
ADDRESS_858.bit.ADDRESS_5=GpioDataRegs.GPADAT.bit.GPIOA8;
GpioDataRegs.GPADAT.bit.GPIOA9=0;
Delay_4us();
GpioDataRegs.GPADAT.bit.GPIOA9=1;
Delay_4us();
ADDRESS_858.bit.ADDRESS_4=GpioDataRegs.GPADAT.bit.GPIOA8;
GpioDataRegs.GPADAT.bit.GPIOA9=0;
Delay_4us();
GpioDataRegs.GPADAT.bit.GPIOA9=1;
Delay_4us();
ADDRESS_858.bit.ADDRESS_3=GpioDataRegs.GPADAT.bit.GPIOA8;
GpioDataRegs.GPADAT.bit.GPIOA9=0;
Delay_4us();
GpioDataRegs.GPADAT.bit.GPIOA9=1;
Delay_4us();
ADDRESS_858.bit.ADDRESS_2=GpioDataRegs.GPADAT.bit.GPIOA8;
GpioDataRegs.GPADAT.bit.GPIOA9=0;
Delay_4us();
GpioDataRegs.GPADAT.bit.GPIOA9=1;
Delay_4us();
ADDRESS_858.bit.ADDRESS_1=GpioDataRegs.GPADAT.bit.GPIOA8;
GpioDataRegs.GPADAT.bit.GPIOA9=0;
Delay_4us();
GpioDataRegs.GPADAT.bit.GPIOA9=1;
Delay_4us();
ADDRESS_858.bit.ADDRESS_0=GpioDataRegs.GPADAT.bit.GPIOA8;
GpioDataRegs.GPADAT.bit.GPIOA9=0;
Delay_4us();
EALLOW;
GpioMuxRegs.GPADIR.bit.GPIOA8=1;
EDIS;
}
void start_8583(void)
{
GpioDataRegs.GPADAT.bit.GPIOA8=1; //SDA=1
Delay_4us();
GpioDataRegs.GPADAT.bit.GPIOA9=1; //SCL=1
Delay_4us();
GpioDataRegs.GPADAT.bit.GPIOA8=0; //SDA=0
Delay_4us();
GpioDataRegs.GPADAT.bit.GPIOA9=0; //SCL=0
Delay_4us();
}
void stop_8583(void)
{
GpioDataRegs.GPADAT.bit.GPIOA8=0; //SDA=0
Delay_4us();
GpioDataRegs.GPADAT.bit.GPIOA9=1; //SCL=1
Delay_4us();
GpioDataRegs.GPADAT.bit.GPIOA8=1; //SDA=1
Delay_4us();
GpioDataRegs.GPADAT.bit.GPIOA9=0; //SCL=0
Delay_4us();
}
void write_8583(void)
{
if(ADDRESS_8583.bit.ADDRESS_7==1)
{
write_1();
}
else
{
write_0();
}
if(ADDRESS_8583.bit.ADDRESS_6==1)
{
write_1();
}
else
{
write_0();
}
if(ADDRESS_8583.bit.ADDRESS_5==1)
{
write_1();
}
else
{
write_0();
}
if(ADDRESS_8583.bit.ADDRESS_4==1)
{
write_1();
}
else
{
write_0();
}
if(ADDRESS_8583.bit.ADDRESS_3==1)
{
write_1();
}
else
{
write_0();
}
if(ADDRESS_8583.bit.ADDRESS_2==1)
{
write_1();
}
else
{
write_0();
}
if(ADDRESS_8583.bit.ADDRESS_1==1)
{
write_1();
}
else
{
write_0();
}
if(ADDRESS_8583.bit.ADDRESS_0==1)
{
// write_1();
GpioDataRegs.GPADAT.bit.GPIOA8=1; //SDA=1
Delay_4us();
//*****
//*****
GpioDataRegs.GPADAT.bit.GPIOA9=1; //SCL=1
Delay_4us();
GpioDataRegs.GPADAT.bit.GPIOA9=0; //SCL=0
Delay_4us();
}
else
{
// write_0();
GpioDataRegs.GPADAT.bit.GPIOA8=0; //SDA=0
Delay_4us();
GpioDataRegs.GPADAT.bit.GPIOA9=1; //SCL=1
Delay_4us();
GpioDataRegs.GPADAT.bit.GPIOA9=0; //SCL=0
Delay_4us();
}
}
void write_1(void)
{
GpioDataRegs.GPADAT.bit.GPIOA8=1; //SDA=1
Delay_4us();
GpioDataRegs.GPADAT.bit.GPIOA9=1; //SCL=1
Delay_4us();
GpioDataRegs.GPADAT.bit.GPIOA9=0; //SCL=0
Delay_4us();
// GpioDataRegs.GPADAT.bit.GPIOA8=0; //SDA=0
Delay_4us();
}
void write_0(void)
{
GpioDataRegs.GPADAT.bit.GPIOA8=0; //SDA=0
Delay_4us();
GpioDataRegs.GPADAT.bit.GPIOA9=1; //SCL=1
Delay_4us();
GpioDataRegs.GPADAT.bit.GPIOA9=0; //SCL=0
Delay_4us();
// GpioDataRegs.GPADAT.bit.GPIOA8=1;
// Delay_4us();
}
/*
;******************************************************************************
;05应答位检查子程序EX_ACK
;(经验证明,对准双向口没接收一位都要上拉为高电平)
;功能:发送完一个字节的数据后,检查数据接收端(Receiver)发来的应答信号。.
; 若收到的是应答信号(低电平0),则置标志位为0,表示接收端收到了刚发送的
; 字节;若收到的是非应答信号,则置标志位为1(发送子程序将判断是重发数据还
; 是结束发送数据)。
*/
void EX_ACK(void)
{
// GpioDataRegs.GPADAT.bit.GPIOA8=1; //SDA=1
EALLOW;
GpioMuxRegs.GPADIR.bit.GPIOA8=0;
EDIS;
GpioDataRegs.GPADAT.bit.GPIOA9=1; //SCL=1
// Delay_4us();
Delay_4us();
ADDRESS_8583.bit.ADDRESS_8=GpioDataRegs.GPADAT.bit.GPIOA8;
// ADDRESS_8583.bit.ADDRESS_9=GpioDataRegs.GPADAT.bit.GPIOA9;
if(ADDRESS_8583.bit.ADDRESS_8==0)
{
FLAG_8583=1;
}
else
{
FLAG_8583=0;
}
GpioDataRegs.GPADAT.bit.GPIOA9=0; //SCL=0
Delay_4us();
EALLOW;
GpioMuxRegs.GPADIR.bit.GPIOA8=1;
EDIS;
Delay_4us();
}
/*
;*****************************************************************************
;04发送非应答位子程序TR_NACK
;功能:接收完一个字节的数据后,向发送端(Receiver)发送一个非应答位(1),指示发送端
; (Transmitter)停止发送数据。
;使用寄存器:
;*****************************************************************************
*/
void TR_NACK(void)
{
GpioDataRegs.GPADAT.bit.GPIOA8=1; //SDA=1
Delay_4us();
GpioDataRegs.GPADAT.bit.GPIOA9=1; //SCL=1
Delay_4us();
GpioDataRegs.GPADAT.bit.GPIOA9=0; //SCL=0
Delay_4us();
GpioDataRegs.GPADAT.bit.GPIOA8=0; //SDA=0
Delay_4us();
}
/*
void TR_ACK(void)
{
GpioDataRegs.GPADAT.bit.GPIOA8=0; //SDA=0
Delay_4us();
GpioDataRegs.GPADAT.bit.GPIOA9=1; //SCL=1
Delay_4us();
GpioDataRegs.GPADAT.bit.GPIOA9=0; //SCL=0
Delay_4us();
// GpioDataRegs.GPADAT.bit.GPIOA8=0; //SDA=0
// Delay_4us();
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -