📄 fpc8583.c
字号:
#include "DSP28_Device.h"
#include "DSP28_Work.h"
#include "math.h"
//extern struct TabStruct
//{
// unsigned int scireq; /* SCI 请求 */
// unsigned int status; /* 事件执行的状态 0xaaaa=有请求数据,0x5555=无请求数据 */
// void *func; /*当前状态应该执行的功能操作*/
//};
//extern struct TabStruct FuncTab[16];
extern void delay(int );
#define CLOCK_SDA GpioDataRegs.GPADAT.bit.GPIOA14
#define CLOCK_SCL GpioDataRegs.GPADAT.bit.GPIOA15
#define CLOCK_SDADIR GpioMuxRegs.GPADIR.bit.GPIOA14
#define DEVSELWR 0xA0 /*I2C器件写操作命*/
#define DEVSELRD 0xA1 /*I2C器件读操作命令*/
unsigned int DATAH; /*数据线SDA=1 (IOPf2)*/
unsigned int DATAL; /*SDA=0*/
unsigned int CLOCKH; /*时钟线SCL=1 (IOPF1)*/
unsigned int CLOCKL; /*SCL=0*/
unsigned int DATACLOCKH; /*SDA=SCL=1*/
unsigned int DATACLOCKL; /*SDA=SCL=0*/
unsigned int DATAINPUT; /*PFDATDIR.11=0,即IOPF2引脚作为输入*/
unsigned int DATAOUTPUT; /*PFDATDIR.11=1,即IOPF2引脚作为输出*/
unsigned int dingshijishu; /*系统定时计数器*/
unsigned int XiaFa_MINSEC,XiaFa_DAYHOUR,XiaFa_YEARMON; /*下发分秒、日时、年月*/
unsigned int RAM_MINSEC,RAM_DAYHOUR,RAM_YEARMON; /*备份分秒、日时、年月*/
unsigned int ms_data,sec_data,min_data,hour_data,
mon_data,yd_data; /*读iic变量:毫秒、秒、分、时、月、年日*/
unsigned int ms_data1,sec_data1,min_data1,hour_data1,
mon_data1,yd_data1;
unsigned int ms_ZhiHou; /*8583滞后系统毫秒数*/
unsigned int YEAR0; /*系统当前年份除4整数*/
unsigned int YEAR4; /*系统当前年份除4余数*/
unsigned int tmp_data,byte_addr,t_data,r_data,flag_iic,flag_data;
extern void transmit();
extern void clock_transmit(int ch);
extern void receive();
extern void start();
extern void tingzhi();
extern void slave_ack();
extern void master_ack();
extern void no_ack();
extern void iic_dly();
extern void CLOCK_IOinit();
extern void read_iic();
extern void write_iic();
extern void byte_wr();
extern void init_8583();
extern void PCF8583Init_time();
extern void SetTimeToPCF8583();
extern unsigned int millisecond_set,millisecond_get;
extern unsigned int millisecond_gewei;
extern unsigned int millisecond_js;
extern unsigned int second_set,second_get;
extern unsigned int minute_set,minute_get;
extern unsigned int hour_set,hour_get;
extern unsigned int week_set,week_get;
extern unsigned int day_set,day_get;
extern unsigned int month_set,month_get;
extern unsigned int year_set,year_get;
extern unsigned int yearflag;
extern unsigned int Time[32]; //存放时钟的变量
extern unsigned int DiShiQi_1S;
extern int lgctestext;
extern int samptest1;
extern void GetTimeFromPCF8583(); //从8583中读取数据
extern void SetPCF8583(unsigned int timetype,unsigned int value); //设置时钟程序
extern void GetPCF8583(unsigned int firsttype,unsigned int count,unsigned int *buff);
//读取时钟芯片PCF8583的时间
extern int WaitAck(void);
void SendAck(void);
void SendNotAck(void);
void I2CSendByte(int ch);
void CLOCK_IOinit()
{
//MCRA=MCRA&0x87ff;
EALLOW;
CLOCK_SDADIR = 1;//8583DATA Output
GpioMuxRegs.GPADIR.bit.GPIOA5 = 1;//8583CLK Output
EDIS;
lgctestext=12;
}
/****iic各子程序****/
void read_iic() /*读取各时间单元*/
{
int i;
start(); /*启动子程序*/
tmp_data = DEVSELWR; /*I2C器件写操作命令*/
transmit(); /*字节发送写控制字*/
slave_ack(); /*读从机应答*/
byte_addr = 0x01; /*各时间单元8583内开始地址*/
tmp_data = byte_addr;
transmit();
slave_ack();
start();
tmp_data = DEVSELRD; /*I2C器件读操作命令*/
transmit();
slave_ack();
//receive();
//ms_data = tmp_data; /*接收的字节送毫秒单元*/
//master_ack();
//receive();
//sec_data = tmp_data; /*接收的字节送秒单元*/
//master_ack();
//receive();
//min_data = tmp_data; /*接收的字节送分单元*/
//master_ack();
//receive();
//hour_data = tmp_data; /*接收的字节送时单元*/
//master_ack();
//receive();
//yd_data = tmp_data; /*接收的字节送年单元*/
//master_ack();
//receive();
//mon_data = tmp_data; /*接收的字节送月单元*/
for (i=1;i<32;i++)
{
receive();
Time[i] = tmp_data; /*接收的字节送年单元*/
master_ack();
}
no_ack();
tingzhi();
ms_data1=ms_data;
sec_data1=sec_data;
min_data1=min_data;
hour_data1=hour_data;
yd_data1=yd_data;
mon_data1=mon_data;
}
void write_iic()
{
start();
tmp_data=DEVSELWR;
transmit();
slave_ack();
byte_addr=0x01;
tmp_data=byte_addr; /*各时间单元8583内开始地址*/
transmit();
slave_ack();
tmp_data=ms_data;
//tmp_data=100;
transmit();
slave_ack();
tmp_data=sec_data;
//tmp_data=59;
transmit();
slave_ack();
tmp_data=min_data;
//tmp_data=49;
transmit();
slave_ack();
tmp_data=hour_data;
//tmp_data=12;
transmit();
slave_ack();
tmp_data=yd_data;
//tmp_data=2005;
transmit();
slave_ack();
tmp_data=mon_data;
//tmp_data=11;
transmit();
slave_ack();
tingzhi();
}
/*字节写*/
void byte_wr()
{
start();
tmp_data = DEVSELWR;
transmit();
slave_ack();
tmp_data = byte_addr;
transmit();
slave_ack();
tmp_data = t_data;
transmit();
slave_ack();
tingzhi();
}
/*字节读*/
void byte_rd()
{
start();
tmp_data = DEVSELWR;
transmit();
slave_ack();
tmp_data = byte_addr;
transmit();
slave_ack();
start();
tmp_data = DEVSELRD;
transmit();
slave_ack();
receive();
r_data = tmp_data;
no_ack();
tingzhi();
}
/*发送子程序*/
void transmit()
{
int i;
CLOCK_SCL=0; /*SCL=0*/
iic_dly();
for( i=0; i<8; i++ )
{
if( (tmp_data & 0x0080) == 0 )
{
CLOCK_SDA=0; /*SDA=0*/
}
else
{
CLOCK_SDA=1; /*SDA=1*/
}
iic_dly();
CLOCK_SCL=1; /*SCL=1*/
iic_dly();
CLOCK_SCL=0; /*SCL=0*/
tmp_data = tmp_data << 1;
}
}
/**--------------------------------------------------------------------------------
调用方式:uchar I2CReceive(void)
函数说明:私有函数,I2C专用
--------------------------------------------------------------------------------*/
int I2CReceiveByte(void)
{
int i=8;
int ddata=0;
//PADATDIR = PADATDIR&0xF7FF;// SDA为输入
EALLOW;
CLOCK_SDADIR = 0;//SDA Input
EDIS;
iic_dly();
while (i--)
{
//SCL_0();
CLOCK_SCL=0;
iic_dly();
//SCL_1();
CLOCK_SCL=1;
iic_dly();
//ddata<<=1;
//ddata1=(PADATDIR&0x0008);
//ddata|=((PADATDIR&0x0008)>>3);
ddata<<=1;
ddata|=CLOCK_SDA>>3;
}
//SCL_0();
CLOCK_SCL=0;
iic_dly();
EALLOW;
CLOCK_SDADIR = 1;//SDA output
EDIS;
return ddata;
}
/*接收子程序*/
void receive()
{
int i;
tmp_data = 0;
//PFDATDIR = PFDATDIR & DATAINPUT; /*SDA设为输入*/
EALLOW;
CLOCK_SDADIR = 0;//SDA Input
EDIS;
iic_dly();
for( i=0; i<8; i++ )
{
CLOCK_SCL=1; /*SCL=1*/
iic_dly();
//tmp_data = (tmp_data << 1) + ( (PFDATDIR & DATAH) >> 2 );//????/
//hour_data1=CLOCK_SDA;
//hour_data1=GpioDataRegs.GPADAT.all;
tmp_data=(tmp_data << 1)+CLOCK_SDA;
//tmp_data=(tmp_data << 1)+(GpioDataRegs.GPADAT.all& DATAH)>>4;
iic_dly();
CLOCK_SCL=0; /*SCL=0*/
iic_dly();
}
//PFDATDIR = PFDATDIR | DATAOUTPUT; /*SDA设为输出*/
EALLOW;
CLOCK_SDADIR = 1;//SDA Input
EDIS;
}
/**--------------------------------------------------------------------------------
调用方式:void I2CStart(void)
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2CStart(void)
{
//asm(" SETC INTM");
EALLOW;
CLOCK_SDADIR = 1;//SDA Output
EDIS;
CLOCK_SDA=1;
iic_dly();
asm(" nop ");
//SCL_1();
CLOCK_SCL=1;
iic_dly(); //INI
//SDA_0();
CLOCK_SDA=0;
iic_dly(); //START
//SCL_0();
CLOCK_SCL=0;
iic_dly(); //START
iic_dly();
}
void start()
{
// PFDATDIR = PFDATDIR | DATACLOCKH; /*SDA=SCL=1*/
//PFDATDIR =0xff06;
EALLOW;
CLOCK_SDADIR = 1;//SDA Output
EDIS;
CLOCK_SDA=1;
CLOCK_SCL=1;
iic_dly();
//PFDATDIR = PFDATDIR & DATAL; /*SDA=0*/
CLOCK_SDA=0;
iic_dly();
//PFDATDIR = PFDATDIR & CLOCKL; /*SCL=0*/
CLOCK_SCL=0;
}
void tingzhi()
{
CLOCK_SDA=0; /*SDA=0*/
iic_dly();
CLOCK_SCL=1; /*SCL=1*/
iic_dly();
CLOCK_SDA=1; /*SDA=1*/
iic_dly();
CLOCK_SCL=0; /*SCL=0*/
}
void slave_ack()
{
CLOCK_SDA=1; /*SDA=1*/
iic_dly();
//delay()
//PFDATDIR = PFDATDIR & DATAINPUT; /*SDA设为输入*/
EALLOW;
CLOCK_SDADIR = 0; //SDA Input
EDIS;
iic_dly();
CLOCK_SCL=1; /*SCL=1*/
iic_dly();
if( (GpioDataRegs.GPADAT.bit.GPIOA4) == 0 ) //????/
{
//PFDATDIR = (PFDATDIR | DATAOUTPUT) & DATACLOCKL;
EALLOW;
CLOCK_SDADIR = 1; //SDA 设为输出
EDIS;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -