⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fpc8583.c

📁 AD7888的调试程序,串行模式
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -