📄 24wcxx.c
字号:
//器件:24WC32/64
//注1:上电后需1MS才能进行读写操作
//注2:时钟频率Fscl_max=100Hz(1.8v,2.5v)/400Hz(4.5v~5.5v)
//注3:32字节页写缓冲器,内部低5 位地址加1 高位地址保持不变
//注4:当WP=VCC时,写保护(只读),当WP=GND/悬空时,可读/写,
// CAT24WC32/64 可以接收从器件地址和字节地址但是装置在
// 接收到第一个数据字节后不发送应答信号从而避免寄存器区域
// 被编程改写
#include "fun.h"
#include "var.h"
/**********************只在本文件使用*****************************/
/*功能:提供I2C总线工作时序中的起始位*/
void I_start(void){
SCL=1;
SCL=1;
SDA=0;
SDA=0;
SCL=0;
SCL=0;
}
/*功能:提供I2C总线工作时序中的停止位*/
void I_stop(void)
{SDA=0;
SDA=0;
SCL=1;
SCL=1;
SDA=1;
SDA=1;
SCL=0;
SCL=0;
}
/*功能:I2C总线初始化。在MAIN()函数中应先调用本函数,然后再调用其他函数。*/
void I_init(void)
{SCL=0;
I_stop();}
/*功能:提供I2C的时钟信号,并返回在时钟电平为高期间SDA信号线上状态。
*本函数可用于数据接收。*/
bit I_clock(void)
{bit sample;
SCL=1;
delay(1);
sample=SDA;
SCL=0;
delay(1);
return(sample);}
/*功能:向I2C总线发送8位数据,并请求一个应答信号ACK。
*如果收到ACK应答则返回1,否则返回0*/
bit I_send(uchar I_data)
{uchar i;
/*发送8位数据*/
for (i=0;i<8;i++)
{SDA=(bit)(I_data&0x80);
I_data=I_data<<1;
I_clock();}
/*请求应答信号ACK*/
SDA=1;
return(~I_clock());}
/*功能:从I2C总线上接收8位数据信号,并将接收到8位数据作为一个
*字节返回,不回送应答信号ACK。主函数在调用本函数之前应保证SDA
*信号线处于浮置状态,即SDA置1。*/
uchar I_receive(void)
{uchar I_data=0;
uchar i;
for(i=0;i<8;i++)
{I_data<<=1;
if(I_clock())I_data++;}
return(I_data);
}
/*功能:向I2C总线发送一个应答信号ACK,一般用于连续数据读取时。*/
void I_Ack(void)
{SDA=0;
I_clock();
SDA=1;}
/*功能:向24WCXX写入器件地址和一个指定的字地址*/
bit E_address(uchar Address)
{I_start();
if(I_send(I2C_24WCXX_WR))return(I_send(Address));
else return(FALSE);
}
/*bit E_address(uint Address)
{uchar i;
I_start();
if(I_send(I2C_24WCXX_WR))
{i=(uchar)Address>>8;
if(!I_send(i))return(FALSE);
i=(uchar)Address;
return(I_send(i));
}
else return(FALSE);
} */
/*******************************************************/
//写24wcxx
bit wr_24wcxx(uchar address) //
{uchar i=7;
uchar *p;
p=(uchar *)&binary_24wcxx;
I_init();
if(E_address(address))
{while(i--)
{if(!I_send(*p++))
{I_stop();return(FALSE);}
}
I_stop();delay(600);return(TRUE);
}
else{I_stop();return(FALSE);}
}
//读24wcxx
bit rd_24wcxx(uchar address) //
{uchar i=7;
uchar *p;
p=(uchar *)&binary_24wcxx;
I_init();
if(E_address(address))/*发送重复启动信号*/
{I_start();
if(I_send(I2C_24WCXX_RD))
{while(i--)
{*p++=I_receive();if(i)I_Ack();}
I_stop();
return(TRUE);
}
else{I_stop();return(FALSE);}
}
else {I_stop();return(FALSE);}
}
/********************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -