📄 i2ceeprom.c
字号:
#include"Reg935.h"
#include"UserDef.h"
/*******************************************************************
* 申请总线
* 功能: 进行I2C总线的初始化----包括时钟选择,
I2C使能,发送起始信号等等。
* I2EN为1,设置为主机;
CRSEL位为0,使用内部SCL发生器
*******************************************************************/
void GetBus()
{
I2SCLH = 15; // 设置SCL高电平的PCLK周期数
I2SCLL = 15; //设置SCL低电平的PCLK周期数,6MHz 时为100Kbit/S
//申请成为主机,起动总线。使用内部SCL发生器,I2EN 和AA 置位
I2CON = RELEASE_BUS_STA; //I2CON = 0110 0100B = 0x64
while( SI==0 ); // 等待起始位的发送
}
/*******************************************************************
* 发送数据函数
* 功能:用于向总线发送数据
* 入口参数:C 待发送的数据
*******************************************************************/
void SendByte(uchar c)
{
I2DAT = c;
I2CON = RELEASE_BUS_ACK; //I2CON = 0100 0100B = 0x44 ,清除SI位等等
while( SI==0 ); // 等待数据的发送
}
/*******************************************************************
* 向有子地址器件发送多字节数据函数
* 功能:从启动总线到发送地址,子地址,数据,结束总线的全过程。
* 入口参数: slvAddr-- 从器件地址
* subAddr-- 子地址(从器件装载数据的地址)
* s -- 发送内容的指针
* num-- 发送字节数
* 出口参数: 返回1 表示操作成功,否则操作有误。
********************************************************************/
bit ISendStr(uchar slvAddr, uint subAddr, uchar *s, uchar num)
{
uchar i;
uchar subAddrH, subAddrL;
subAddrL = (subAddr & 0x00FF);
subAddrH = (subAddr & 0xFF00)>>8;
GetBus(); //启动总线
SendByte(slvAddr & WRITE_DATA_COM); //发送器件地址,WRITE_DATA_COM = 0 写控制
if( I2STAT!=0x18 ) //已发送器件地址和写信号,并已接收应答信号
{
I2CON = GENERATE_STOP;
return(0);
}
SendByte(subAddrH); //发送器件子地址高位
if( I2STAT!=0x28 ) //已发送数据,并已接收应答信号
{
I2CON = GENERATE_STOP; //I2CON = 0101 0100B = 0x54 ,产生停止信号
return(0);
}
SendByte(subAddrL); //发送器件子地址低位
if( I2STAT!=0x28 ) //已发送数据,并已接收应答信号
{
I2CON = GENERATE_STOP; //I2CON = 0101 0100B = 0x54 ,产生停止信号
return(0);
}
for(i=0; i<num; i++)
{
SendByte(*s); //发送数据
if(I2STAT!=0x28) //已发送数据,并已接收应答信号
{
I2CON = GENERATE_STOP; //I2CON = 0101 0100B = 0x54 ,产生停止信号
return(0);
}
s++;
}
I2CON = GENERATE_STOP; // 结束总线
return(1);
}
/*******************************************************************
* 向有子地址器件读取多字节数据函数
*功能:从启动总线到发送地址,子地址,读数据,结束总线的全过程。
*入口参数:slvAddr--从器件地址
* subAddr--子地址(从器件装载数据的地址)
* s -- 读出的内容存储区的指针
* num-- 读num个字节。
*出口参数:函数返回1表示操作成功,否则操作有误。
********************************************************************/
bit IRcvStr(uchar slvAddr, uint subAddr, uchar *s, uchar num)
{
uchar i;
uchar subAddrH, subAddrL;
subAddrL = (subAddr & 0x00FF);
subAddrH = (subAddr & 0xFF00)>>8;
GetBus(); //启动总线
SendByte(slvAddr & WRITE_DATA_COM); //发送器件地址
if( I2STAT!=0X18) //已发送器件地址和写信号,并已接收应答信号
{
I2CON = GENERATE_STOP; //I2CON = 0101 0100B = 0x54 ,产生停止信号
return(0);
}
SendByte(subAddrH); //发送器件子地址高位
if( I2STAT!=0X28 ) //已发送数据,并已接收应答信号
{
I2CON = GENERATE_STOP; //I2CON = 0101 0100B = 0x54 ,产生停止信号
return(0);
}
SendByte(subAddrL); //发送器件子地址低位
if( I2STAT!=0X28 ) //已发送数据,并已接收应答信号
{
I2CON = GENERATE_STOP; //I2CON = 0101 0100B = 0x54 ,产生停止信号
return(0);
}
I2CON = RELEASE_BUS_STA; //I2CON = 0110 0100B = 0x64 ,重新启动总线
while( SI==0 );
SendByte(slvAddr | READ_DATA_COM); //发送读数据信号
if( I2STAT!=0X40 ) //已发送器件地址和读信号,并已接收应答信号
{
I2CON = GENERATE_STOP; //I2CON = 0101 0100B = 0x54 ,产生停止信号
return(0);
}
for(i=0; i<num-1; i++)
{
I2CON = RELEASE_BUS_ACK; //I2CON = 0100 0100B = 0x44 ,接收一字节数据并发送应答位
while( SI==0 ); //等待接收数据
if( I2STAT!=0X50 ) //已接收数据字节,已返回应答信号
{
I2CON = GENERATE_STOP; //I2CON = 0101 0100B = 0x54 ,产生停止信号
return(0);
}
*s = I2DAT; //读取数据
}
s++;
I2CON = RELEASE_BUS_NOACK; //I2CON = 0100 0000B = 0x40 ,接收最后一字节数据并发送非应答位
while( SI==0 );
*s = I2DAT;
I2CON = GENERATE_STOP; //结束总线
return(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -