📄 iic.c
字号:
#include<reg51.h>
#include"IIC.h"
//短延时函数:ShortDelay()
void nNop(uint i)
{
for(;i>0;i--) ;
}
//长延时函数:LongDelay()
void LongDelay(uint i)
{
uint j;
for(;i>0;i--)
{ for(j=1000;j>0;j--);}
}
//IC起始信号:
void StartIIC(void)
{
PinSDA = 1;
nNop(20);
PinSCL = 1;
nNop(20);
PinSDA = 0;
nNop(20);
PinSCL = 0;
//nNop(50);
}
//IIC停止信号:
void StopIIC(void)
{
PinSDA = 0;
nNop(20);
PinSCL = 1;
nNop(20);
PinSDA = 1;
nNop(50);
}
//读取从机应答信号函数:
bit GetACK(void)
{
bit ack;
PinSDA = 1;
PinSCL = 1;
nNop(50);
ack = PinSDA;
PinSCL = 0;
nNop(50);
return(ack);
}
//向IIC总线发出应答信号函数:
void PutACK(bit ack)
{
PinSDA = ack;
PinSCL = 1;
nNop(50);
PinSCL = 0;
nNop(50);
}
//初始化IIC总线函数:
void InitIIC(void)
{
PinSCL = 1;
nNop(10);
PinSDA = 1;
nNop(50);
}
//功能向IIC总线写一字节数据函数:
void IIC_WriteByte(uchar temp)
{
uchar i;
for(i=0;i<8;i++)
{
PinSDA = (bit)(temp & 0x80);
temp = temp << 1;
nNop(20);
PinSCL = 1;
nNop(20);
PinSCL = 0;
//nNop(50);
}
}
//从IIC总线读一字节数据函数:
uchar IIC_ReadByte(void)
{
uchar i;
uchar temp;
PinSDA = 1;
for(i=0;i<8;i++)
{
temp = temp << 1;
PinSCL = 1;
while(PinSDA) temp++;
PinSCL = 0;
nNop(20);
}
return(temp);
}
//向IIC总线上的从机写多字节数据函数:
bit IIC_Puts(uchar SlaveAddr, uchar SubAddr, uint size, uchar *dat)
{
uchar i;
//确保从机地址最低位是0
SlaveAddr &= 0xfe;
//启动I2C总线
StartIIC();
//发送从机地址
IIC_WriteByte(SlaveAddr);
if ( GetACK() )
{
StopIIC();
return 1;
}
//发送子地址
IIC_WriteByte(SubAddr);
if ( GetACK() )
{
StopIIC();
return 1;
}
//发送数据
for(i=0;i<size;i++)
{
IIC_WriteByte(*dat++);
if ( GetACK() )
{
StopIIC();
return 1;
}
}
//发送完毕,停止I2C总线,返回
StopIIC();
return 0;
}
//从IIC总线上的从机读多字节数据函数:
bit IIC_Gets(uchar SlaveAddr, uchar SubAddr, uint size, uchar *dat)
{
//确保从机地址最低位是0
SlaveAddr &= 0xfe;
//启动I2C总线
StartIIC();
//发送从机地址
IIC_WriteByte(SlaveAddr);
if ( GetACK() )
{
StopIIC();
return 1;
}
//发送子地址
IIC_WriteByte(SubAddr);
if ( GetACK() )
{
StopIIC();
return 1;
}
//发送重复起始条件
StartIIC();
//发送从机地址
SlaveAddr |= 0x01;
IIC_WriteByte(SlaveAddr);
if ( GetACK() )
{
StopIIC();
return 1;
}
//接收数据
for(;;)
{
*dat++ = IIC_ReadByte();
if ( --size == 0 )
{
PutACK(1);
break;
}
PutACK(0);
}
//接收完毕,停止I2C总线,返回
StopIIC();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -