📄 at24c02.c
字号:
/* 0xa0--AT24C01的I2C通信的设备地址 */
/* 功能: at24c01开始工作 CLOCK在高电平,DATA从高变低 参数: 无 */
void start_at24c01()
{ bc_at24c01_data=1;
bc_at24c01_clk=1;
_nop_(); _nop_(); _nop_();
bc_at24c01_data=0;
_nop_(); _nop_(); _nop_();
bc_at24c01_clk=0;
_nop_();
}
/* 功能: at24c01 的结束工作 CLOCK在高电平,DATA从低变高 参数: 无 */
void stop_at24c01()
{ _nop_();
bc_at24c01_data=0;
_nop_(); _nop_();
bc_at24c01_clk=1;
_nop_(); _nop_(); _nop_();
bc_at24c01_data=1;
_nop_();_nop_();_nop_();
bc_at24c01_clk=0;
}
/* 功能: 读at24c01的应答位 bc_at24c01_data 应被拉低,表示有应答
参数: b_ack_at24c01_f 如果b_ack_at24c01_f=0表示有应答, b_ack_at24c01_f=1,表示没应答 */
void get_at24c01_ack()
{ bc_at24c01_clk=1;
bc_at24c01_data=1; // get ack bit from ptat24c01,ack bit is save in 000h
_nop_(); _nop_();
if(bc_at24c01_data==0) b_ack_at24c01_f=1; /* 有应答 */
if(bc_at24c01_data==1) b_ack_at24c01_f=0; /* 有应答 */
_nop_();
bc_at24c01_clk=0;
_nop_();
}
/* 功能: 写一字节到at24c01 先送最高位, CLOCK低电平时,DATA允许变化; CLOCK高电平时,DATA需稳定
参数: par_at24c01=一字节的发送数据 */
void send_a_byte_at24c01(uchar par_at24c01)
{
uchar i;
for(i=0;i<8;i++ )
{
bc_at24c01_clk=0;
_nop_(); _nop_();
if((par_at24c01&0x80)==0x80)
{ bc_at24c01_data=1; }
else
{ bc_at24c01_data=0; }
par_at24c01=par_at24c01<<1;
_nop_();
bc_at24c01_clk=1;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
}
bc_at24c01_clk=0;
}
/*在指定的地址和指写页写一数据 参数有地址=par_24c02_add 数据=par_24c02_data 都为全程变量*/
void at24c_write(uchar par_at24c01_add, uchar par_at24c01_data)
{
start_at24c01();
send_a_byte_at24c01(0xa0); get_at24c01_ack();
send_a_byte_at24c01(par_at24c01_add); get_at24c01_ack(); /* 写入地址 */
send_a_byte_at24c01(par_at24c01_data); get_at24c01_ack(); /* 写入数据 */
stop_at24c01();
delay(250); /* 延时时间,不得小于delay(100) */
delay(250); /* 延时时间,不得小于delay(100) */
}
/*指定地址和指写页读一数据 参数有地址=par_24c02_add 数据=par_24c02_data 都为全程变量
par_24C02在调入函数前是地址,调用函数后返回是所读到的数据 */
uchar at24c_read(uchar par_at24c01_add)
{
uchar i,par_24c02_data;
start_at24c01();
send_a_byte_at24c01(0xa0);
get_at24c01_ack();
send_a_byte_at24c01(par_at24c01_add);
get_at24c01_ack();
start_at24c01();
send_a_byte_at24c01(0xa1);
get_at24c01_ack();
for(i=0;i<8;i++) /* 读数据 */
{ bc_at24c01_clk=0;
bc_at24c01_data=1;
_nop_(); _nop_();
if(bc_at24c01_data==1) par_24c02_data=(par_24c02_data|0x80);
if(bc_at24c01_data==0) par_24c02_data=(par_24c02_data&0x7f);
par_24c02_data=_crol_(par_24c02_data,1);
bc_at24c01_clk=1;
_nop_(); _nop_();
}
bc_at24c01_clk=0;
stop_at24c01();
return par_24c02_data;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -