?? iic_drv.c
字號:
/***********************************************************************/
/* */
/* FILE :iic_drv.c */
/* DATE :2005-7-27 12:49 */
/* DESCRIPTION :Define IIC Functions */
/* CPU TYPE : */
/* FUNCTION :send and receive functions */
/* */
/* */
/***********************************************************************/
#include "iic_drv.h"
#include "delay.h"
#include "sfr26a.h"
/*#define SDADIR pd7_0
#define SCLDIR pd7_1
#define SDAPORT p7_0
#define SCLPORT p7_1*/
static void iic_ini(void)
{
SETSCL;
SETSDA;
}
static void iic_sta(void)
{
SETSCL;
SETSDA;
delay(5);
SETSCL;
CLRSDA;
delay(5);
CLRSCL;
}
static void iic_stop(void)
{
CLRSDA;
SETSCL;
delay(10);
SETSDA;
}
static void iic_sendack(const UINT_8 ack)
{
if (0==ack)
{
CLRSDA; //send ack
}
else
{
SETSDA; //send noack
}
delay(5);
SETSCL;
delay(10);
CLRSCL;
}
static UINT_8 sendbyte(const UINT_8 data)
{
UINT_8 mask=0x80;
UINT_8 ack=0;
do
{
if ( 0 != data&mask)
{
SETSDA;
}
else
{
CLRSDA;
}
SETSCL;
delay(10);
CLRSCL;
mask >>= 1;
}while (mask);
delay(10);
SETSCL;
SETSDAIN;
delay(10);
if ( SDAPORT )
{
SETSDA;
SETSDAOUT;
CLRSCL;
return (1);
}
else
{
CLRSDA;
SETSDAOUT;
CLRSCL;
return (0);
}
//return (ack);
}
static UINT_8 readbyte(void)
{
UINT_8 data = 0;
UINT_8 times;
SETSDAIN;
for (times=0;times<8;times++)
{
SETSCL;
delay(10);
data <<= 1;
if (SDAPORT)
{
data |= 0x01;
}
else
{
data &= 0xFE;
}
CLRSCL;
delay(10);
}
return (data);
}
BOOLEAN iic_byte_write(const SINT_8 dev_adr,const UINT_8 word_adr,UINT_8 data)
{
UINT_8 error_times;
UINT_8 dev_adr_write;
dev_adr_write = dev_adr<<1;
for (error_times=0;error_times<5;error_times++)
{
iic_sta();
if ( 1U == sendbyte(dev_adr_write))
{
iic_stop();
}
else
{ //ack ok, send device_address succesfully
if ( 1U == sendbyte(word_adr))
{
iic_stop();
}
else
{
if (1U == sendbyte(data))
{
iic_stop(); //ack means successful
}
else
{
iic_stop();
break;
}
}
}
}
//CLRPDSDA;
if (error_times >= 5)
{
return ( false ); //write operation failed
}
else
{
return ( true ); //write operation succeed
}
}
BOOLEAN iic_currentadr_read(const SINT_8 dev_adr, UINT_8 * const rdram)
{
UINT_8 error_times;
UINT_8 dev_adr_read;
SINT_16 data;
dev_adr_read = (dev_adr<<1)|0x01; //add READ command to the dev_adr
for (error_times = 0; error_times < 5; error_times++ )
{
iic_sta();
if ( 1U == sendbyte(dev_adr_read))
{
iic_stop();
}
else
{
*rdram = readbyte();
iic_sendack(1); //send noack
iic_stop;
break;
}
}
if (error_times>=5)
{
return ( false ); //read operation failed
}
else
{
return ( true ); //read operation succeed
}
}
BOOLEAN iic_page_write(const SINT_8 dev_adr,const UINT_8 word_adr,UINT_8 * data_point,const UINT_8 data_no)
{
UINT_8 error_times = 0;
UINT_8 index = 0;
UINT_8 dev_adr_write;
//RTSTS temp_data;
dev_adr_write= (dev_adr<<1)&0xFE ;
if (data_no <= PAGE_WIDTH) // 8-byte page write,right?
{
for (error_times=0;error_times<5;error_times++)
{
iic_sta();
if ( 1U == sendbyte(dev_adr_write))
{
iic_stop();
}
else
{
if (sendbyte(word_adr))
{
iic_stop();
}
else
{
while (index<data_no)
{
if (sendbyte(*data_point))
{
iic_stop();
break;
}
else
{
index++;
data_point++;
}
}
break;
}
}
}
}
else
{
;
}
iic_stop();
SETSDAIN;
if (error_times>=5)
{
return ( false ); //page write operation failed
}
else
{
return ( true ); //page write operation succeed
}
}
BOOLEAN iic_random_read(const SINT_8 dev_adr,const UINT_8 word_adr,UINT_8 * const rdram)
{
UINT_8 error_times;
UINT_8 dev_adr_read,dev_adr_write;
SINT_16 data;
dev_adr_read = (dev_adr<<1)|0x01;
dev_adr_write = (dev_adr<<1)&0xFE;
for (error_times=0;error_times<5;error_times++)
{
iic_sta();
if ( 1U == sendbyte(dev_adr_write))
{
iic_stop();
}
else
{
if ( 1U == sendbyte(word_adr))
{
iic_stop();
}
else
{
iic_sta();
delay(10);
if ( 1U == sendbyte(dev_adr_read))
{
iic_stop();
}
else
{
*rdram = readbyte();
iic_sendack(1); //send noack
}
iic_stop();
break;
}
}
}
SETSDAIN;
if (error_times>=5)
{
return (false);
}
else
{
return (true);
}
}
BOOLEAN iic_sequ_read(const SINT_8 dev_adr,const UINT_8 word_adr,UINT_8 data_no,UINT_8 * rdram_array)
{
UINT_8 error_times;
UINT_8 number=0;
UINT_8 index=1;
UINT_8 dev_adr_write,dev_adr_read;
dev_adr_read=(dev_adr<<1)|0x01;
dev_adr_write=(dev_adr<<1)&0xFE;
for (error_times=0;error_times<5;error_times++)
{
iic_sta();
if ( 1U == sendbyte(dev_adr_write))
{
iic_stop();
}
else
{
if ( 1U == sendbyte(word_adr))
{
iic_stop();
}
else
{
iic_sta();
delay(10);
if ( 1U == sendbyte(dev_adr_read))
{
iic_stop();
}
else
{
*rdram_array = readbyte();
}
iic_sendack(0); //send ack, ask the device to output the data address
while( number++ < data_no - 1)
{
if (number >= RECEIVE_BUF_SIZE)
{
number = RECEIVE_BUF_SIZE ;
}
*rdram_array = readbyte();
rdram_array ++;
iic_sendack(0);
}
*rdram_array = readbyte();
}
}
iic_sendack(1);
iic_stop();
if (number >= data_no)
{
break; //all data have been read
}
}
SETSDAIN;
if (error_times>=5)
{
return (false);
}
else
{
return (true);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -