📄 i2c.c
字号:
#include "my_89x51.h"
extern void d1ms(unsigned int);
#define READMODE 0xa1
#define WRITEMODE 0xa0
/**--------------------------------------------------------------------------------
调用方式:void I2CStart(void) ﹫200 /07/0 4
函数说明:I2C启始位
---------------------------------------------------------------------------------*/
void I2CStart()
{
EA = 0;
SCL = 0;
SDA = 1;
SCL = 1;
_nop_();
SDA = 0;
_nop_();
SCL = 0;
}
/**--------------------------------------------------------------------------------
调用方式:void I2CStop(void) ﹫200 /07/0 4
函数说明:I2C结束位
---------------------------------------------------------------------------------*/
void I2CStop()
{
SDA = 0;
SCL = 1;
_nop_();
SDA = 1;
EA = 1;
}
/**--------------------------------------------------------------------------------
调用方式:bit I2CAck(void) ﹫200 /07/0 4
函数说明:I2C用,等待从器件接收方的应答
返回1--正确
返回0--错误
---------------------------------------------------------------------------------*/
unsigned char WaitAck()
{
unsigned char data errtime = 255;//因故障接收方无ACK 超时值为255
while (SDA){
errtime--;
if (!errtime){
SCL = 0;
I2CStop();
return (0);
}
}
SCL = 0;
return (1);
}
/**--------------------------------------------------------------------------------
调用方式:void SendAck(void) ﹫200 /07/0 4
函数说明:I2C用,主器件为接收方,从器件为发送方时,应答信号。
---------------------------------------------------------------------------------*/
void SendAck()
{
SDA = 0;
SCL = 1;
SCL = 0;
SDA = 1;
}
/**--------------------------------------------------------------------------------
调用方式:void SendAck(void) ﹫200 /07/0 4
函数说明:I2C用,主器件为接收方,从器件为发送方时,非应答信号。
--------------------------------------------------------------------------------*/
void SendNotAck()
{
SDA = 1;
SCL = 1;
SCL = 0;
}
/**--------------------------------------------------------------------------------
调用方式:void I2CSend(unsigned char ch) ﹫200 /07/0 5
函数说明:I2C用,发送BYTE
---------------------------------------------------------------------------------*/
void I2CSendByte(unsigned char ch)
{
unsigned char data i;
for (i = 0; i < 8; i++){
ch <<= 1;
SDA = CY;
SCL=1;
somenop;
SCL = 0;
somenop;
}
SDA = 1;
SCL = 1;
}
/**--------------------------------------------------------------------------------
调用方式:unsigned char I2CReceive(void) ﹫200 /07/0 5
函数说明:I2C用,接收BYTE
---------------------------------------------------------------------------------*/
unsigned char I2CReceiveByte()
{
unsigned char data i = 8;
unsigned char data ddata = 0;
SDA = 1;
while (i--){
SCL = 1;
ddata <<= 1;
if (SDA)
ddata++;
SCL = 0;
}
return (ddata);
}
/******************
函数说明:读取E2ROM
******************/
void i2c_read(unsigned char nadd, unsigned char nlen, unsigned char data *pdt)
{
I2CStart();
I2CSendByte(WRITEMODE);
_nop_();
WaitAck();
_nop_();
I2CSendByte(nadd);
WaitAck();
_nop_();
I2CStart();
I2CSendByte(READMODE);
WaitAck();
_nop_();
while(nlen > 0){
*pdt = I2CReceiveByte();
somenop;
if (nlen != 1)
SendAck();
nlen--;
pdt++;
}
SendNotAck();
I2CStop();
}
/******************
函数说明:写E2ROM
******************/
void i2c_write(unsigned char nadd, unsigned char nlen, unsigned char data *pdt)
{
I2CStart();
I2CSendByte(WRITEMODE);
WaitAck();
I2CSendByte(nadd);
WaitAck();
while(nlen > 0){
I2CSendByte(*pdt);
WaitAck();
pdt++;
nlen--;
d1ms(50);
}
I2CStop();
d1ms(200);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -