📄 i22c.c
字号:
/***********************************************************/
// This Program Is Designed For Operating 24 Series EEPROM /
// It is Suitable For All the Products By Using The Very /
// Function. /
// It Has A Head File.It Must Be Added To Your Project, /
// And As Well As The C File. /
// It Was Designed By Bozai. /
// Last Modefied At 2005.08.21. /
/***********************************************************/
#include <intrins.h>
#include "I2C.h"
#define uchar unsigned char
#define uint unsigned int
/***************************************************/
// 基本操作函数 //
/***************************************************/
bit ack; /*应答标志位*/
// 启动总线
void Start_I2c()
{
SDA=1;
_nop_();
_nop_();
SCL=1;
_nop_(); _nop_();_nop_();_nop_();_nop_();
SDA=0;
_nop_(); _nop_();_nop_();_nop_();_nop_();
SCL=0;
_nop_();_nop_(); _nop_();
}
// 停止总线
void Stop_I2c()
{
SDA=0;
_nop_();_nop_();
SCL=1;
_nop_(); _nop_();_nop_();_nop_();_nop_();
SDA=1;
_nop_(); _nop_();_nop_();_nop_();
}
// 发送一个字节
void SendByte(uchar Data)
{
uchar i;
for(i=0;i<8;i++)
{
if((Data<<i)&0x80)SDA=1;
else SDA=0;
_nop_(); _nop_();
SCL=1;
_nop_(); _nop_(); _nop_();_nop_();_nop_();
SCL=0;
}
_nop_();_nop_();_nop_();_nop_();
SDA=1;
_nop_();_nop_(); _nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();
if(SDA==1)ack=0;
else ack=1;
_nop_(); _nop_();
SCL=0;
_nop_();_nop_();
}
// 接受一个字节
uchar ReceiveByte()
{
uchar temp;
uchar i;
temp=0;
SDA=1;
for(i=0;i<8;i++)
{
_nop_();
SCL=0;
_nop_();_nop_(); _nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();
temp=temp<<1;
if(SDA==1)temp|=0x01;
_nop_();_nop_();
}
SCL=0;
_nop_();_nop_();
return(temp);
}
// 应答信号
void Ack_I2c(bit NoReply)//1为非应答
{
if(NoReply==0)SDA=0;
else SDA=1;
_nop_();_nop_(); _nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_(); _nop_();
SCL=0;
_nop_();_nop_();
}
/*******************************************************************
用户操作函数
*******************************************************************/
// 向有一个数据地址的器件发送多个字节
bit SendStringOneDataAddress(uchar ChipAddress,uchar DataAddress,uchar *Buffer,uchar Length)
{
uchar i;
WP=0;
Start_I2c(); /*启动总线*/
SendByte(ChipAddress); /*发送器件地址*/
if(ack==0)return(0);
SendByte(DataAddress); /*发送器件子地址*/
if(ack==0)return(0);
for(i=0;i<Length;i++)
{
SendByte(Buffer[i]); /*发送数据*/
if(ack==0)return(0);
}
Stop_I2c(); /*结束总线*/
WP=1;
return(1);
}
// 从有一个数据地址的器件读多个字节
bit ReceiveStringOneDataAddress(uchar ChipAddress,uchar DataAddress,uchar *Buffer,uchar Length)
{
uchar i;
WP=0;
Start_I2c(); /*启动总线*/
SendByte(ChipAddress); /*发送器件地址*/
if(ack==0)return(0);
SendByte(DataAddress); /*发送器件子地址*/
if(ack==0)return(0);
Start_I2c(); /*重新启动总线*/
SendByte(ChipAddress+1);
if(ack==0)return(0);
for(i=0;i<Length-1;i++)
{
Buffer[i]=ReceiveByte(); /*发送数据*/
Ack_I2c(0); /*发送就答位*/
}
Buffer[i]=ReceiveByte();
Ack_I2c(1); /*发送非应答位*/
Stop_I2c(); /*结束总线*/
WP=1;
return(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -