📄 i2c.c
字号:
//I2C BUS
//-----------------时间协议-----------------------------------------
//STOP 后须栽再等待至少4.7uS的时间才可以再STRAT,
//STRAT信号至少维持4.0uS的时间.
//SCL的低电平维持时间至少要4.7uS.
//SCL和SDA的上升时间最多不超过1.0uS的时间.
//SCL已经降到低电平,SDA至少维持5.0uS的时间.
//SCL的高电平维持时间至少要4.0uS.
//SCL和SDA的下降时间最多不超过0.3uS.
//SCL必须在SCL转换为高电平之前,SDA至少要领先0.25uS的时间.
//连续START时,SDA必须在SDA转换高电平之后,SDA至少多维持4.7uS的时间.
//STOP时,SCL至少领先4.0uS的时间.
//BOOL=bit; BYTE=char; WORD=int.
#include <intrins.h>
#include "define.h"
#include "global.h"
void I2CWait(void);
//----------------DELAY1mS------------------------------------------------
void DelayX1ms(uchar k)
{
uchar i,j;
for(i=0;i<k;i++)
for(j=0;j<200;j++)
_nop_();
}
//----------------EEprom I2C START-----------------------------------------
void I2CStart(void)
{
ISDA=1;
ISCK=1;
I2CWait();
ISDA=0;
I2CWait();
ISCK=0;
}
//-----------------EEprom I2C Stop------------------------------------------
void I2CStop(void)
{
ISDA=0;
I2CWait();
ISCK=1;
I2CWait();
ISDA=1;
}
//------------------EEprom I2C Wait----------------------------------------
void I2CWait(void)
{
_nop_(); //等待1个机器周期,此函数在头文件<intrins.h>内.
_nop_();
}
//------------------传送确认信号"1"或"0"电平到slave端----------------------
void SendAcknowledge(bit ack)
{
ISDA=ack;
ISCK=1;
I2CWait();
ISCK=0;
}
//------------------EEprom I2C 发送数据------------------------------------
//传送一个字节到服务器.
//bytedata:要传送的数据.
bit I2CSentByte(uchar bytedata) //反回一个位的确认信号
{
uchar i;
bit ack; //定义确认信号
ISDA=1;
for(i=0;i<8;i++)
{
if(bytedata & 0x80)
ISDA=1;
else
ISDA=0;
bytedata<<=1;
I2CWait();
ISCK=1;
I2CWait();
ISCK=0;
I2CWait();
}
ISDA=1;
I2CWait();
ISCK=1;
I2CWait();
ack=ISDA;
I2CWait();
ISCK=0;
I2CWait();
return ack;
}
//--------------------------读取一个数剧-------------------------------------
uchar I2CReceiveByte(void)
{
uchar i;
uchar bytedata=0;
//从高位开始
for(i=0;i<8;i++)
{
ISCK=1;
I2CWait();
bytedata<<=1;
if(ISDA)
bytedata|=0x01;
ISCK=0;
I2CWait();
}
return bytedata;
}
//---------------------------将数据写入指定器件的地址内----------------------
//device:slave地址,每个IIC BUS的组件都有一个器件地址
//address:sub地址
//bytedata:数据
void I2cByteWrite (uchar device, uchar address, uchar bytedata )
{
uchar i;
bit ack;
bit FgTimeout;
FgTimeout=1;
for ( i=0;i<10;i++ )
{
I2CStart();
ack=I2CSentByte(device & 0xfe); // & 0xfe是写入指令
if (ack==1)
{
I2CStop();
continue;
}
ack=I2CSentByte(address);
if(ack==1)
{
I2CStop();
continue;
}
ack=I2CSentByte(bytedata);
if(ack==1)
{
I2CStop();
continue;
}
I2CStop();
FgTimeout=0;
if(ack==0)
break;
}
DelayX1ms(10);
}
//---------------------------------------从指定的器件地址内读取数据----------------------------------
uchar I2cByteRead(uchar device, uchar address )
{
uchar bytedata;
bit ack;
I2CStart();
if(ack=I2CSentByte(device))return; //注意器件地址加写入位
if(ack=I2CSentByte(address))return;
I2CStart();
if(ack=I2CSentByte(device|0x01))return;
bytedata=I2CReceiveByte;
SendAcknowledge(1); //Master 端送出确认的信号等于"1",即Acknowledge="1"
I2CStop();
return bytedata;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -