📄 i2c_sample.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 + -