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

📄 fpc8583.c.bak

📁 电动机保护测量程序,用的是DSP2407,
💻 BAK
字号:
#include "math.h"
#include "2407.h"

#define SDA_1() {PFDATDIR = PFDATDIR|0x2000;PFDATDIR = PFDATDIR|0x0020;} /* SDA_1( ) */	
#define SDA_0() {PFDATDIR = PFDATDIR|0X2000;PFDATDIR = PFDATDIR&0XFFDF;} /* SDA_0( ) */
#define SCL_1() {PFDATDIR = PFDATDIR|0X0100;PFDATDIR = PFDATDIR|0X0001;} /* SCL_1( ) */
#define SCL_0() {PFDATDIR = PFDATDIR|0X0100;PFDATDIR = PFDATDIR&0XFFFE;} /* SCL_0( ) */
#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;

 //读取时钟芯片PCF8583的时间
/****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*/
    SCL_0();
    iic_dly(); 

    for( i=0; i<8; i++ )
    {
	if( (tmp_data & 0x0080) == 0 )
	{
	    SDA_0();		/*SDA=0*/
	}
	else
	{
	    SDA_1();      /*SDA=1*/
	}
	iic_dly();
	SCL_1();	/*SCL=1*/
	iic_dly();
	SCL_0();	/*SCL=0*/ 
	tmp_data = tmp_data << 1;
    }
}   

/*接收子程序*/
void receive() 
{
    int i;
    
    tmp_data = 0;
    PFDATDIR = PFDATDIR&0xDFFF;// SDA为输入
    
    iic_dly();
    for( i=0; i<8; i++ )
    {
	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)+((PFDATDIR&0x0020)>>5);
	//tmp_data=(tmp_data << 1)+(GpioDataRegs.GPADAT.all& DATAH)>>4;
	iic_dly();
	SCL_0();		/*SCL=0*/
	iic_dly();
    }
    PFDATDIR = PFDATDIR|0x2000;// SDA为输出   
}      

void start()
{
    
    PFDATDIR = PFDATDIR|0x2000;// SDA为输出
    // PFDATDIR = PFDATDIR | DATACLOCKH;     /*SDA=SCL=1*/
    SDA_1();
    SCL_1();
    iic_dly();
    //PFDATDIR = PFDATDIR & DATAL;			/*SDA=0*/
    SDA_0();
    iic_dly();
    //PFDATDIR = PFDATDIR & CLOCKL;			/*SCL=0*/ 
    SCL_0();
}     


void tingzhi()
{
    SDA_0();			/*SDA=0*/
    iic_dly();
    SCL_1();			/*SCL=1*/
    iic_dly();
    SDA_1();      	        /*SDA=1*/ 
    iic_dly();
    SCL_0();			/*SCL=0*/
}


void slave_ack()
{
    SDA_1();      	/*SDA=1*/ 
    iic_dly();
    //delay()
    
    //PFDATDIR = PFDATDIR & DATAINPUT;      /*SDA设为输入*/ 
    PFDATDIR = PFDATDIR&0xDFFF;// SDA为输入
    iic_dly();
    SCL_1();			/*SCL=1*/
    iic_dly();
    
   if( ((PFDATDIR&0x0020)>>5) == 0 ) //????/ 
   {
	    //PFDATDIR = (PFDATDIR | DATAOUTPUT) & DATACLOCKL;
	    PFDATDIR = PFDATDIR|0x2000;// SDA为输出
            SDA_0();
            SCL_0();
   }
   else
   {
	    asm("	nop	");
	    asm("	nop	");
	    asm("	nop	");/*添加应答错误处理程序*/
   }
	
   PFDATDIR = PFDATDIR|0x2000;// SDA为输出
}  


void master_ack()
{
    //PFDATDIR = PFDATDIR & DATAL;			/*SDA=0*/
    SDA_0();
    no_ack();
}       

void no_ack()
{
    //PFDATDIR = PFDATDIR | CLOCKH;			/*SCL=1*/
    SCL_1();
    iic_dly();
    //PFDATDIR = PFDATDIR & CLOCKL;			/*SCL=0*/
    SCL_0();
}


void iic_dly()
{
    //asm("	rpt	#1h	");
    delay(360);
    asm("	nop	");
    asm("	nop	"); 

}   

void init_8583()
{
        r_data=0xff;
        byte_addr=0x00;
        t_data=0x00;
        byte_wr();
        byte_rd();
    
        ms_data=0x02;
        sec_data=0x03;
        min_data=0x04;
        hour_data=0x05;
        yd_data=0x01;
        mon_data=0x06;
        ms_data1=0xff;
        sec_data1=0xff;
        min_data1=0xff;
        hour_data1=0xff;
        yd_data1=0xff;
        mon_data1=0xff;
        delay(360);
        write_iic();
//loop:      
        delay(36000);
        read_iic();
        asm ( " nop " );  
        asm ( " nop " );
        asm ( " nop " );         
//        goto loop; 
 


}   

void clock_transmit(int ch)
{
    int i;
    
    SCL_0();	/*SCL=0*/
    iic_dly(); 

    for( i=0; i<8; i++ )
    {
        if( (ch & 0x0080) == 0 )
	{
	    SDA_0();		/*SDA=0*/
	}
	else
	{
	    SDA_1();      /*SDA=1*/
	}
	iic_dly();
	SCL_1();	/*SCL=1*/
	iic_dly();
	SCL_0();	/*SCL=0*/ 
	ch = ch << 1;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -