📄 iicwr.c
字号:
/*************************************************************************************
文件类型:IIC总线操作
文件作用:
修改权限:
文件相关:
创 建 人:chenbo
创建日期:2007.06.21
当前版本:Ver0.1
版本信息:Ver0.1 GeminiKQ
**************************************************************************************/
#include "Tiger.h"
struct bit_eep {
unsigned char b0:1;
unsigned char b1:1;
unsigned char b2:1;
unsigned char b3:1;
unsigned char b4:1;
unsigned char b5:1;
unsigned char b6:1;
unsigned char b7:1;
};
union byte_eep{
struct bit_eep bite;
unsigned char byte;
};
void delay_4()
{
nop();
nop();
}
void eeprom_start()
{
SET_SCL;
SET_SDAW;
EN_SCLOUT;
EN_SDAOUT;
SET_SCL;
SET_SDAW;
delay_4();
CLR_SDAW;
delay_4();
CLR_SCL;
delay_4();
}
void eeprom_stop()
{
EN_SDAOUT;
EN_SCLOUT;
CLR_SCL;
CLR_SDAW;
delay_4();
SET_SCL;
delay_4();
SET_SDAW;
delay_4();
CLR_SCL;
}
//======================================================
//
//
//=========================================================
void eeprom_wb(unsigned char a)
{unsigned char a1;
union byte_eep eeprom_use;
EN_SDAOUT;
EN_SCLOUT;
eeprom_use.byte=a;
for(a1=8;a1>0;a1--)
{ if(1==eeprom_use.bite.b7)
SET_SDAW;
else
CLR_SDAW;
//SDAW_IO=eeprom_use.bite.b7;
delay_4();
SET_SCL;
delay_4();
CLR_SCL;
eeprom_use.byte=eeprom_use.byte<<1;
}
delay_4();
}
unsigned char eeprom_rb()
{unsigned char a1;
union byte_eep eeprom_use;
EN_SDAIN;
DISEN_SDAOUT;
EN_SCLOUT;
delay_4();
for(a1=8;a1>0;a1--)
{ SET_SCL;
//delay_4();
eeprom_use.byte=eeprom_use.byte<<1;
if((SDAR_IO&0x08)==0x08)
eeprom_use.bite.b0=1;
else
eeprom_use.bite.b0=0;
//eeprom_use.bite.b0=SDAR_IO;
CLR_SCL;
//delay_4();
}
return eeprom_use.byte;
}
//============================================
//函数功能:检测写是否正确
//备注:0表示错误,1表示正确
//============================================
unsigned char eeprom_ack()
{unsigned char a;
a=0;
EN_SDAIN;
DISEN_SDAOUT;
EN_SCLOUT;
delay_4();
SET_SCL;
delay_4();
while((a!=30)&&((SDAR_IO&0x08)!=0))
a++;
if(a==30)
a=0;
else
a=1;
CLR_SCL;
delay_4();
return a;
}
void send_ack(void)
{CLR_SDAW;
CLR_SCL;
EN_SDAOUT;
EN_SCLOUT;
CLR_SDAW;
delay_4();
SET_SCL;
delay_4();
CLR_SCL;
DISEN_SDAOUT;
delay_4();
}
void send_noack(void)
{ SET_SDAW;
EN_SDAOUT;
EN_SCLOUT;
SET_SDAW;
delay_4();
SET_SCL;
delay_4();
CLR_SCL;
DISEN_SDAOUT;
delay_4();
}
//-------------------------------------------------------
//函数功能:从指定的EEPROM中读出需要的数据
//备注:1、参数addr表示的是芯片物理中地址。要读数据的地址放在data.addr中
// 2、返回数据放在读写缓存WR_BUFF数组中,最多一次读取50字节数据
// 3、返回1表示读成功,0表示读数据失败
//-------------------------------------------------------
unsigned char read_byte(a,addr)
unsigned char a,addr;
{unsigned char i,l;
l=0;
eeprom_stop();
eeprom_start();
eeprom_wb(addr);
#if(Type_EEP==E24C128||Type_EEP==E24C256)
if(1==eeprom_ack())
{eeprom_wb(data_addr.byte[2]);
if(1==eeprom_ack())
{ eeprom_wb(data_addr.byte[3]);
if(1==eeprom_ack())
{ eeprom_start();
eeprom_wb(addr|0x1);
if(1==eeprom_ack())
{ for(i=0;i<a;i++)
{ wr_buff[i]=eeprom_rb();
if(i<(a-1))
send_ack();
else
{ send_noack();
eeprom_stop();
l=1;
}
}
}
else
{ eeprom_stop();
l=0;
}
}
else
{ eeprom_stop();
l=0;
}
}
else
{ eeprom_stop();
l=0;
}
}
else
{ eeprom_stop();
l=0;
}
#else
if(1==eeprom_ack())
{ eeprom_wb(data_addr.byte[3]);
if(1==eeprom_ack())
{ eeprom_start();
eeprom_wb(addr|0x1);
if(1==eeprom_ack())
{ for(i=0;i<a;i++)
{ wr_buff[i]=eeprom_rb();
if(i<(a-1))
send_ack();
else
{ send_noack();
eeprom_stop();
l=1;
}
}
}
else
{ eeprom_stop();
l=0;
}
}
else
{ eeprom_stop();
l=0;
}
}
else
{ eeprom_stop();
l=0;
}
#endif
return l;
}
//-------------------------------------------------------
//函数功能:写数据到指定的EEPROM
//备注:1、参数addr表示的是芯片物理中地址。要写数据的地址放在data.addr中
// 2、要写的数据放在读写缓存WR_BUFF数组中,最多一次写50字节数据
// 3、返回1表示写成功,0表示写失败
//-------------------------------------------------------
unsigned char write_byte(unsigned char a,unsigned char addr,unsigned char *addrpoint)
{unsigned char i,value; //a==0 kao lv
CLR_WP; // WP输出低,允许写入
EN_WPOUT; // WP允许输出
CLR_WP; // WP输出低,允许写入
eeprom_stop();
eeprom_start();
#if(Type_EEP==E24C128||Type_EEP==E24C256)
eeprom_wb(addr); //a2 //eeprom_wb(0xa0|((data_addr.addrc[2]<<1)&0xe));
if(1==eeprom_ack())
{ eeprom_wb(data_addr.byte[2]);
if(1==eeprom_ack())
{ eeprom_wb(data_addr.byte[3]);
if(1==eeprom_ack())
{value=1;
for(i=0;i<a;i++)
{ eeprom_wb(addrpoint[i]);
if(0==eeprom_ack())
{ i=a;
value=0;
}
}
eeprom_stop();
return value;
}
else
{ eeprom_stop();
return 0;
}
}
else
{ eeprom_stop();
return 0;
}
}
else
{ eeprom_stop();
return 0;
}
#else
eeprom_wb(addr); //a2 //eeprom_wb(0xa0|((data_addr.addrc[2]<<1)&0xe));
if(1==eeprom_ack())
{ eeprom_wb(data_addr.byte[3]);
if(1==eeprom_ack())
{value=1;
for(i=0;i<a;i++)
{ eeprom_wb(addrpoint[i]);
if(0==eeprom_ack())
{ i=a;
value=0;
}
}
eeprom_stop();
return value;
}
else
{ eeprom_stop();
return 0;
}
}
else
{ eeprom_stop();
return 0;
}
#endif
//CLR_WP; // WP=1 禁止写入
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -