📄 iic24c0x.c
字号:
/********************************************************************
*以下程序为24C0x的操作
/*******************************************************************/
//#pragma la //存储器为大模式
#define __IIC24C0x_h__
#include "Includes.h" //函数声明
sbit SDA = P1^6;
sbit SCL = P1^7;
/********************************************************************
*延时子程序,执行时间: 4*count+4(字节时间)
********************************************************************/
void delay(INT16U count)
{
while (count-- != 0);
}
/********************************************************************
*I2C总线初始化。在main()函数中应首先调用本函数
********************************************************************/
void I2C_init(void)
{
SCL = low;
delay(1);
I2C_stop();
}
/********************************************************************
*提供I2C总线工作时序中的起始条件
********************************************************************/
void I2C_start(void)
{
SDA = high;
delay(1);
SCL = high;
delay(1);
SDA = low;
delay(1);
SCL = low;
}
/********************************************************************
*提供I2C总线工作时序中的停止条件
********************************************************************/
void I2C_stop(void)
{
SDA = low;
delay(1);
SCL = high;
delay(1);
SDA = high;
delay(1);
SCL = low;
}
/********************************************************************
*向I2C总线发送8 bit数据
********************************************************************/
C51_BOOLEAN I2C_sendByte(INT8U I2C_data)
{
INT8U i;
C51_BOOLEAN ack;
for (i=0;i<8;i++)
{
SDA = (C51_BOOLEAN)(I2C_data & 0x80);
I2C_data = I2C_data << 1;
SCL = high;
delay(1);
SCL = low;
}
delay(1);
SDA = high;
delay(1);
SCL = high;
delay(1);
if (SDA) ack = false; //Wait for Slave Ack
else ack = true;
SCL = low;
if (ack) return (true);
else return (false);
}
/********************************************************************
*从I2C总线上接收8 bit数据,并将接收到8 bit数据作为一个字节返回,
********************************************************************/
INT8U I2C_receiveByte(void)
{
INT8U I2C_data = 0;
INT8U i;
SDA = high;
for (i=0;i<8;i++)
{
I2C_data *= 2;
SCL = high;
delay(1);
if (SDA) I2C_data++;
SCL = low;
}
return (I2C_data);
}
/********************************************************************
*向24C0X写入器件地址及从地址
********************************************************************/
void I2C_issue_add(INT8U chipAdd,
INT16U subAdd)
{
INT8U low_add;
INT8U wd = 0;
low_add = subAdd; //Addressing byte address
#ifdef _24C04
subAdd >>= 7;
wd = subAdd & 0x02; //Addressing page
#endif
#ifdef _24C08
subAdd >>= 7;
wd = subAdd & 0x06; //Addressing page
#endif
wd |= chipAdd;
I2C_start();
I2C_sendByte(wd);
I2C_sendByte(low_add);
}
/********************************************************************
*将指针地址buf中的n_buf个字节数据写入到24C0X的地址S_add处,
*采用连续写入操作方式,连续写字节数不能大于8,并且连续字节
*地址须在同一页内
********************************************************************/
void I2C_write_block(INT8U chipAdd,
INT16U S_add,
INT8U n_buf,
INT8U *buf)
{
INT8U i;
// WDTC = 0x06; //关闭看门狗
// EA = 0;
I2C_issue_add(chipAdd,S_add);
for (i=0;i<n_buf;i++)
{
I2C_sendByte(*(buf+i));
}
I2C_stop();
delay(3000); //I2C_stop与I2C_start间隔10ms
// WDTC = 0x86; //Enable Watchdog,Watchdog time-out period: 314.5728ms (CR:40MHz)
// EA = 1;
}
/********************************************************************
*从24C0X中读取n_buf个字节的数据存于指针buf指向的地址中,
*采用序列读方式从片内S_add地址开始连续读取数据,连续读字节数不能大于8.
*地址须在同一页内
********************************************************************/
void I2C_read_block(INT8U chipAdd,
INT16U S_add,
INT8U n_buf,
INT8U *buf)
{
INT8U i;
INT8U rd=0;
// WDTC = 0x06; //关闭看门狗
// EA = 0;
I2C_issue_add(chipAdd,S_add);
#ifdef _24C04
S_add >>= 7;
rd = S_add & 0x02; //Addressing page
#endif
#ifdef _24C08
S_add >>= 7;
rd = S_add & 0x06; //Addressing page
#endif
rd |= chipAdd;
rd |= 0x01; //READ command
I2C_start(); //Repeated START condition
I2C_sendByte(rd);
for (i=0;i<n_buf-1;i++)
{
*(buf+i) = I2C_receiveByte();
SDA = low; //Master ACK
delay(1);
SCL = high;
delay(1);
SCL = low;
SDA = high;
}
*(buf+i) = I2C_receiveByte();
I2C_stop();
// WDTC = 0x86; //Enable Watchdog,Watchdog time-out period: 314.5728ms (CR:40MHz)
// EA = 1;
}
//=======================================================================================
// End of file.
//=======================================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -