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

📄 i2c_sample.c

📁 T-Kernel下PCF8563的驱动程序开发
💻 C
字号:
/**************************************************************************/
/*                                                                        */
/*     Copyright (C) 2002 Oki Electric Industry Co., LTD.                 */
/*                                                                        */
/*     System Name  :  ML674001 series                                    */
/*     Module Name  :  ML674001 i2c sample program                        */
/*     File   Name  :  i2c_sample.c                                       */
/*     Revision     :  01.00                                              */
/*     Date         :  2002/12/11                                         */
/*                     Initial version                                    */
/*                                                                        */
/**************************************************************************/
#include   "ML674001.h"
#include   "common.h"


/* functions */
int     main(void);             /* main routine */
void    init_i2c(void);         /* initialize I2C */

UBYTE   i2c_send_low(UBYTE, UBYTE); /* I2C send process */
UBYTE   i2c_receive_low(UBYTE*,UBYTE);     /* I2C receive process */
UBYTE   i2c_IR_chk(void);      /* I2C interrupt handler */
void    led_on(UHWORD);         /* LED on */


/******************************************************************/
/*  Entry point                                                   */
/*  Function : main                                               */
/*      Parameters                                                */
/*          Input  :  Nothing                                     */
/*          Output :  0                                           */
/******************************************************************/

#define BUFFSIZE	16
unsigned char iic_snd(unsigned char slvaddr,unsigned short wordaddr,unsigned char *buffer,unsigned char len);
unsigned char iic_rcv(unsigned char slvaddr,unsigned short wordaddr,unsigned char *buffer,unsigned char len);
unsigned char date[]={0x00,0x01,0x00,0x59,0x15,0x24,0x04,0x03,0x05,0x80,0x80,0x80,0x80,0xdd,0xff,0xdf};
unsigned char receive_buff[BUFFSIZE];
int main(void)
{
	int flg=0;
    put_wvalue(ROMAC,0x0);      /* OE/WE palse width :1 (fastest) */
    init_i2c();                 /* initialize i2c */

	iic_snd(0xA2,0x0000,(unsigned char*)&date[0],16); //initial 16 registers of pcf8563
	
    while(1) {      /* loop1 */
 
 		if(flg)
        iic_snd(0xA2,0x0000,(unsigned char*)&date[0],16);
        iic_rcv(0xA2,0x0002,(unsigned char*)&receive_buff[0],14);
    }


    return 0;
}

/******************************************************************/
/*  Initialize I2C                                                */
/*  Function : init_i2c                                           */
/*      Parameters                                                */
/*          Input  :  Nothing                                     */
/*          Output :  Nothing                                     */
/******************************************************************/
void init_i2c()
{
    UHWORD  i;
    UHWORD  gppo_data;
    UHWORD  set_data;
   
    /***********************************************************
        Setup of I2C
        I2CCLR_I2CMD	corresponds to Fast-mode(400kHz)
        I2CBC_I2CBC		corresponds to HCLK=20MHz,I2CMD=400kHz
        I2CIR_I2CIR		corresponds to interrupt clear
        I2CIMR_I2CMF	corresponds to interrupt mask off
    ***********************************************************/
    put_value(I2CCLR ,I2CCLR_CMD4);
    put_value(I2CBC ,I2CBC_400K20);/*DingF 050323*/
    put_value(I2CIMR ,I2CIMR_MF);

    set_hbit(GPCTL,GPCTL_I2C);    /* selection of a secondary function (I2C)*/
    
    put_value(I2CCON, I2CCON_STCM);	/*added by dingfei 050324!! reset&release the IIC bus*/

}

/******************************************************************/
/*  I2C-Data send/receive 		                                  */
/*  Function : iic_snd,iic rcv 2005-03-24                         */
/*      Parameters                                                */
/*          Input  :  Nothing                                     */
/*          Output :  Nothing                                     */
/******************************************************************/
unsigned char iic_snd(unsigned char slvaddr,unsigned short wordaddr,unsigned char *buffer,unsigned char len)
{
	unsigned char i,isOK,isLast;
	
	if(len<=0)
		return 0;
	put_value(I2CSAD,(slvaddr | I2CSAD_RW_SND));
	
	i2c_send_low((unsigned char)(wordaddr>>8),(I2CCON_STCM | I2CCON_OC));
	i2c_send_low((unsigned char)(wordaddr&0xff),(I2CCON_STCM | I2CCON_OC));
	
            for(i = 0;i < len;i ++) 										/* loop4 */
            {  
                															/* next data  */
                isLast = (i == (len-1)) ? 1 : 0;
                if(isLast ==0) 
                {
                    isOK=i2c_send_low(buffer[i],(I2CCON_STCM | I2CCON_OC)); /* send request */
                } 
                else
                {
                    isOK=i2c_send_low(buffer[i],I2CCON_STCM); 				/* send request */
                }
                if(isOK==0)
                	return isOK;
            }
            put_value(I2CCON, I2CCON_STCM);	/*added by dingfei 050323!!*/
            
    return isOK;
}
unsigned char iic_rcv(unsigned char slvaddr,unsigned short wordaddr,unsigned char *buffer,unsigned char len)
{
	unsigned char i,isOK,isLast,recflg,read_data;
	
	if(len<=0)
		return 0;
            /***  adderse send  ***/
            put_value(I2CSAD,(slvaddr | I2CSAD_RW_SND));
	
			isOK = i2c_send_low((unsigned char)(wordaddr>>8),(I2CCON_STCM | I2CCON_OC));
			isOK = i2c_send_low((unsigned char)(wordaddr&0xff),(I2CCON_STCM | I2CCON_OC));
            
            /***  data read  ***/
            put_value(I2CSAD,(slvaddr | I2CSAD_RW_REC));
            recflg = I2CCON_EN;     							 /* send/write mode change */
            for(i=0;i<len;i++)
            {   												 /* loop3 */
                if(len == (i+1))
                {												 /* next read data exists */
                    recflg += (I2CCON_STCM);
                }
                else
                {
                    recflg += (I2CCON_STCM | I2CCON_OC);
                }
                isLast = (i == (len-1)) ? 1 : 0;
                
                isOK = i2c_receive_low(&read_data,recflg);      /* receive request */
                
                if(isOK==0)
                {  												/* send NG */
                    return isOK;
                }
                buffer[i] = read_data;   						/* receive data save */
                recflg = 0;
            }
    return isOK;	
}

/******************************************************************/
/*  I2C data send                                                 */
/*  Function : i2c_send                                           */
/*      Parameters                                                */
/*          Input  :  send data                                   */
/*          Output :  Nothing                                     */
/******************************************************************/
UBYTE    i2c_send_low(UBYTE send_data, UBYTE set_data)
{

    put_value(I2CDR ,send_data);

    /* last_flag setting                           */
    /*  :0(data)      =set I2CCON_STCM | I2CCON_OC */
    /*  :1(last data) =set I2CCON_STCM             */
    put_value(I2CCON, (set_data));        /* Set control register */

    if(i2c_IR_chk() != 1) {   /* send/receive check */
        put_value(I2CCON, I2CCON_STCM);
    }

    return;
}

/******************************************************************/
/*  I2C data receive                                              */
/*  Function : i2c_receive                                        */
/*      Parameters                                                */
/*          Input  :  Nothing                                     */
/*          Output :  receive data                                */
/******************************************************************/
UBYTE   i2c_receive_low(UBYTE *read_data,UBYTE oc_flag)
{

    /* last_flag setting                           */
    /*  :0( data)     =set I2CCON_STCM | I2CCON_OC */
    /*  :1(last data) =set I2CCON_STCM             */
    put_value(I2CCON, oc_flag);    /* Set control register */

    if(i2c_IR_chk() == 1) {   /* send/receive check */
        put_value(I2CCON, I2CCON_STCM);
    }
    else 
    	return (0);

    /* waite receive complete */
    *read_data = get_value(I2CDR);       /* Read receive data */

    return(1);
}

/********************************************************************/
/*  I2C Interruption check                                          */
/*  Function : i2c_IR_chk                                           */
/*        Parameters                                                */
/*            Input  :  Nothing                                     */
/*            Output :  Nothing                                     */
/********************************************************************/
UBYTE i2c_IR_chk()
{
    unsigned  char  chk_data,ret;
    while((get_value(I2CIR) & I2CIR_IR) != I2CIR_IR) ;
    
    chk_data = get_value(I2CSR);    /* read I2CSR register */
    if((chk_data & I2CSR_AAK) == I2CSR_AAK) {   /* address ACK no receive ? */
        ret=0;
    }
    else if((chk_data & I2CSR_DAK) == I2CSR_DAK) {  /* data ACK no receive ? */
        ret=0;
    }
    put_value(I2CIR,I2CIR_IR);      /* Interruption clean */
	ret=1;
    return(ret);
}

⌨️ 快捷键说明

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