📄 i2c.c
字号:
/*************读写EEPROM卡**********************/
/*************I2c读写**********************/
//#define DELAY_5us asm("NOP");asm("NOP");asm("NOP");
__idata uchar IC_data;
#define SDA P2_bit.P21
#define SCL P2_bit.P22
//#define I2C_INPUT 1 /* data direction input */
//#define I2C_OUTPUT 0 /* data direction output */
//sbit ICout=IC_data^7;
//sbit ICin=IC_data^0;
/*******pcf8563*********/
/** 移位字节 **/
//sbit ICout1=IC1_data^7;
//sbit ICin1=IC1_data^0;
/************************************************
** 函数原型: void IC_init(void); **
** 功 能: IC总线初始化.在main()函数中应首先 **
** 调用本函数,然后再调用其它函数. **
************************************************/
//void IC_init(void)
//{
// SCL=1;SCL=1;
// SDA=1;SDA=1;
// WP=1;
//}
/************************************
** 函数原型: void IC_start(void); **
** 功 能: IC总线起始位. **
************************************/
void IC_start()
{
SCL=1; /** Send Start **/
SDA=1;
//DELAY_5us;
SDA=0;
// DELAY_5us;
SCL=0;
}
/**********************************
** 函数原型: void IC_stop(void); **
** 功 能: IC总线停止位. **
**********************************/
void
IC_stop()
{
SCL=0; /** Send Stop **/
SDA=0;
// DELAY_5us;
SCL=1;
//DELAY_5us;
SDA=1;
//
}
/***************************************************
** 函数原型: bit IC_writebyte(uchar wdata); **
** 功 能: 向IC总线发送8位数据,并请求一个应答信 **
** 号ACK.如果收到ACK应答则返回1(TRUE), **
** 否则返回0(FALSE). **
***************************************************/
unsigned char IC_WriteByte( uchar wdata)
{
uchar i;
for(i=0;i<8;i++){
SCL=0;
if(wdata&0x80) SDA=1;
else SDA=0;
// SDA=ICout;
// SDA=ICout;
SCL=1;
wdata<<=1;
}
SCL=0;
SCL=1;
i=0;
while(SDA){
if(++i>12)
{
SCL=0;
ei();
return(0);
}
}
SCL=0;
// EA=1;
return(1);
}
/***********************************************
** 函数原型: uchar IC_readbyte(void); **
** 功 能: 从IC总线上接收8位数据,并将接受到 **
** 8位数据作为一个字节返回,不回送应 **
** 答信号ACK. **
***********************************************/
uchar IC_ReadByte(void)
{
uchar i;
IC_data=0;
// EA=0;
SCL=0;
SDA=1;
for(i=0;i<8;i++){
// SDA=1;
SDA=1;
SCL=1;
IC_data<<=1;
IC_data|=SDA;
SCL=1;
SCL=0;
}
SCL=0;
// EA=1;
return(IC_data);
}
/***************************************************************
** 函数原型: bit readEEone(uchar instr,uchar addr,uchar num); **
** 功 能: 从S42WD42中读取num个字节的数据,采用序列读操作方 **
** 式从片内Address地址开始连续读取数据.S42WD42不接 **
** 受指定的地址则返回0(FALSE). **
***************************************************************/
unsigned char readEEone24(uchar instr,uchar addr,uchar num)
{
uchar i;
di();
IC_start();
if(!IC_WriteByte(WRITE+instr)){
IC_stop(); return(0);
}
if(!IC_WriteByte(addr)){
IC_stop(); return(0);
}
IC_start();
if(!IC_WriteByte(READ+instr)){
IC_stop(); return(0);
}
for(i=0;i<num-1;i++){
EEbuf[i]=IC_ReadByte();
SDA=0; // Send ACK
SDA=0;
SCL=1;
}
EEbuf[num-1]=IC_ReadByte();
SDA=1; // Send Read End
SDA=1;
SCL=1;
IC_stop();
ei();
// Dismark();
return(1);
}
/***************************************************************
** 函数原型: bit readEE(uchar instr,uchar addr,uchar num); **
** 功 能: 从S42WD42中读取num个字节的数据,采用序列读操作方 **
** 式从片内Address地址开始连续读取数据.S42WD42不接 **
** 受指定的地址则返回0(FALSE). **
***************************************************************/
unsigned char readEE24(uchar instr,uchar addr,uchar num)
{
uchar i;
for(i=0;i<3;i++){
if(readEEone24(instr,addr,num))
{
ei();
return(1);
}
}
ei();
return(0);
}
/****************************************************************
** 函数原型: bit writeEEone(uchar instr,uchar addr,uchar num); **
** 功 能: 将EEbuf[]单元中的数据写入S42WD42的num个字节. **
** 采用页写操作方式,每次写入时都需要指定片内地址. **
** 如果S42WD42不接受指定的地址或某个传送的字节未收到 **
** 应答信号ACK,则返回0(FALSE). **
****************************************************************/
unsigned char writeEEone24(uchar instr,uchar addr,uchar num)
{
uchar i;
di();
IC_start();
if(!IC_WriteByte(WRITE+instr)){
IC_stop(); return(0);
}
if(!IC_WriteByte(addr)){
IC_stop(); return(0);
}
for(i=0;i<num;i++){
if(!IC_WriteByte(EEbuf[i])){
IC_stop(); return(0);
}
}
IC_stop();
ei();
Delay(6);
return(1);
}
/****************************************************************
** 函数原型: bit writeEE(uchar instr,uchar addr,uchar num); **
** 功 能: 将EEbuf[]单元中的数据写入S42WD42的num个字节. **
** 采用页写操作方式,每次写入时都需要指定片内地址. **
** 如果S42WD42不接受指定的地址或某个传送的字节未收到 **
** 应答信号ACK,则返回0(FALSE). **
****************************************************************/
unsigned char writeEE24(uchar instr,uchar addr,uchar num)
{
uchar i;
for(i=0;i<3;i++){
if(writeEEone24(instr,addr,num)){ei();return(1);}
}
ei();
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -