📄 24cxx.h
字号:
#ifndef I2C_2003_7_24
#define I2C_2003_7_24
#include "USER.H"
sbit SDA=P3^7;
sbit SCL=P3^6;
void I2C_Start(); // 开启总线 (内部函数)
void I2C_Stop(); // 结束总线函数 (内部函数)
void I2C_Init(); // 初始化函数 (内部函数)
bit I2C_Clock(); // 发送或接收1Bit (内部函数)
void I2C_SendByte(uchar Data); // 发送一个字节(内部函数)
uchar I2C_ReceiveByte(); // 接收从器件传来的数据(内部函数)
void I2C_Ack(bit a); // 发送应答信号 I2C_Ack(TRUE);
// 发送非应答信号I2C_Ack(FALSE);
bit I2C_Write(uchar Control, uchar Addr, uchar *Buffer,uchar n);
// 将n个字节的数据写入/读出, Control为控制字符, Addr为地址
bit I2C_Read(uchar Control, uchar Addr, uchar *Buffer, uchar n);
void Write24CXX(uint Addr, uchar *Buffer, uchar n);
// 对AT24C16读写数据, Addr为16位地址 0x0000~0x07FF
void Read24CXX(uint Addr, uchar *Buffer, uchar n);
bit Ack; // 应答标志位
void I2C_Start() // 开启总线
{
Delay1us();
SCL=1; // 初始化高电平
Delay5us();
SDA=0; // 发送开始信号
Delay5us();
SCL=0; // 拉低时钟信号,以锁定总线
Delay5us();
}
void I2C_Stop() // 结束总线函数
{
SDA=0; // 发送结束条件的数据信号
Delay1us();
SCL=1; // 发送结束条件的时钟信号
Delay5us();
SDA=1; // 发送I2C总线结束信号
Delay5us();
SCL=0; // 关闭总线
}
void I2C_Init() // 初始化函数
{
SCL=0;
Delay5us();
I2C_Stop();
}
bit I2C_Clock() // 用于发送1Bit(调用前要将数据送到SDA)
{ // 也可用于接收(接收时钟上升3us后的数据)
bit Sample;
Delay2us();
SCL=1; // 拉高时钟
Delay3us();
Sample=SDA; // 读取数据线状态
Delay2us();
SCL=0; // 恢复时钟低电平
Delay5us();
return Sample;
}
void I2C_SendByte(uchar Data) // 发送一个字节
{
uchar i;
for(i=0; i<8; i++)
{
SDA=(bit)(Data&0x80);
I2C_Clock();
Data=Data<<1;
}
SDA=1;
Ack=!I2C_Clock();
}
uchar I2C_ReceiveByte() //接收从器件传来的数据
{
uchar Data=0, i;
SDA=1;
for(i=0; i<8; i++)
{
Data=Data<<1;
if(I2C_Clock()) Data++;
}
return Data;
}
void I2C_Ack(bit a) // 发送应答信号 I2C_Ack(TRUE);
{ // 发送非应答信号 I2C_Ack(FALSE);
if(a==FALSE) SDA=1;
else SDA=0;
Delay3us();
SCL=1;
Delay5us();
SCL=0; // 清时钟线,钳住I2C总线以便继续接收
Delay2us();
}
bit I2C_Write(uchar Control, uchar Addr, uchar *Buffer,uchar n)
{
// 将n个字节的数据写入器件中, Control为控制字符, Addr为地址
uchar i;
I2C_Init();
I2C_Start(); // 启动总线
I2C_SendByte(Control); // 发控制字符
if(Ack==0)
return(0);
I2C_SendByte(Addr); // 发送器件地址
if(Ack==0)
return(0);
for(i=0;i<n;i++)
{
I2C_SendByte(*Buffer); // 发送数据
if(Ack==0)
return(0);
Buffer++;
}
I2C_Stop(); // 结束总线
return(1);
}
bit I2C_Read(uchar Control, uchar Addr, uchar *Buffer, uchar n)
{
// 从器件中读出n个字节的数据到Buffer中, Control为控制字符, Addr为地址
uchar i;
I2C_Init();
I2C_Start(); // 启动总线
I2C_SendByte(Control); // 发控制字符
if(Ack==0)
return(0);
I2C_SendByte(Addr); // 发送器件地址
if(Ack==0)
return(0);
I2C_Start(); // 重新启动总线
I2C_SendByte(Control|0x01);
if(Ack==0)
return(0);
for(i=0; i<n-1; i++)
{
*Buffer=I2C_ReceiveByte();// 接收数据
I2C_Ack(TRUE); // 发送应答信号
Buffer++;
}
*Buffer=I2C_ReceiveByte();
I2C_Ack(FALSE); // 发送非应答信号
I2C_Stop(); // 结束总线
return 1;
}
/** 对AT24CXX写数据, Addr为16位地址 0x0000~0x07FF **/
void Write24CXX(uint Addr, uchar *Buffer, uchar n)
{
uchar h, l;
h = (Addr>>7)&0x0E;
l = Addr&0x00FF;
I2C_Write(0xA0|h, l, Buffer, n);
}
/** 读取AT24CXX数据, Addr为16位地址 0x0000~0x07FF **/
void Read24CXX(uint Addr, uchar *Buffer, uchar n)
{
uchar h, l;
h = (Addr>>7)&0x0E;
l = Addr&0x00FF;
I2C_Read(0xA0|h, l, Buffer, n);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -