📄 c24lc256.cpp
字号:
#include "class.h"
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 向无子地址器件发送字节数据函数
//函数原型: bit WriteByte(INT8U sla,ucahr c);
//功能: 从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.
// 如果返回1表示操作成功,否则操作有误。
//注意: 使用前必须已结束总线。
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
INT8U C24lc256::WriteByte(INT16U addr,INT8U c)
{
INT8U ack=0;
INT8U temp;
INT8U err;
OSSemPend(GI2CSem, 0, & err);
I2cStart(); //启动总线//
ack+=I2cSendByte(0xa0);
//if(ack==FALSE) return(FALSE);
temp=addr>>8;
ack+=I2cSendByte(temp);
//if(ack==FALSE) return(FALSE);
ack+=I2cSendByte(addr); //发送数据//
// if(ack==FALSE) return(FALSE);
WriteEnable();
I2cSendByte(c); //发送数据//
I2cStop();
WriteDisable(); //结束总线//
Xms(8);
err = OSSemPost(GI2CSem);
if(ack<3) ack=FALSE;
else ack=TRUE;
return(ack);
}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 向有子地址器件发送多字节数据函数
//函数原型: bit WriteStr(INT8U sla,INT8U suba,ucahr /s,INT8U no);
//功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
// 地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
// 如果返回1表示操作成功,否则操作有误。
//注意: 使用前必须已结束总线。
///如果《32字节,最好从页的起始地址开始,如果》32字节,必须,从页的中间开始差+32 */
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
INT8U C24lc256::WriteNByte(INT16U addr, INT8U *s,INT8U no)
{
INT8U i;
INT8U ack=0;
INT8U temp;
INT16U add;
INT8U err;
OSSemPend(GI2CSem, 0, & err);
add=addr;
while(no)
{
I2cStart(); //启动总线
ack+=I2cSendByte(0xa0); ///发送器件地址
//if(ack==FALSE) {return(FALSE);}
temp=add>>8;
ack+=I2cSendByte(temp);
//if(ack==FALSE) {return(FALSE);}
ack+=I2cSendByte(add); //发送器件子地址
//if(ack==FALSE) { return(FALSE);}
WriteEnable();
temp=add&0x3f;
if(no+temp>64)//是否要换页
{
temp=64-temp;
no-=temp;
add=add&0xffc0;
add=add+64;
}
else
{
temp=no;
no=0;
}
for(i=0;i<temp;i++)//temp是本次要写的字节数
{
I2cSendByte(*s); //发送数据
//if(ack==FALSE) {return(FALSE);}
s++;
}
I2cStop();
WriteDisable(); //结束总线
Xms(8);
}
err = OSSemPost(GI2CSem);
if(ack<3) ack=FALSE;
else ack=TRUE;
return(ack);
}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 向无子地址器件读字节数据函数
//函数原型: bit II2c_RcvByte(INT8U sla,ucahr /c);
//功能: 从启动总线到发送地址,读数据,结束总线的全过程,从器件地
// 址sla,返回值在c.
// 如果返回1表示操作成功,否则操作有误。
//注意: 使用前必须已结束总线。
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
INT8U C24lc256:: ReadByte(INT16U addr,INT8U *outdata)
{
INT8U ack=0;
INT8U temp;
INT8U err;
OSSemPend(GI2CSem, 0, & err);
I2cStart(); //启动总线//
ack+=I2cSendByte(0xa0); //发送器件地址//
//if(ack==FALSE)return(FALSE);
temp=addr>>8;
ack+=I2cSendByte(temp);
//if(ack==FALSE) return(FALSE);
ack+=I2cSendByte(addr);
I2cStart();
ack+=I2cSendByte(0xa1);
//if(ack==FALSE) return(FALSE);
*outdata=I2cRcvByte(); //读取数据//
I2cAck(1); //发送非就答位//
I2cStop();
err = OSSemPost(GI2CSem); //结束总线//
if(ack<4) ack=FALSE;
else ack=TRUE;
return(ack);
}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 向有子地址器件读取多字节数据函数
//函数原型: bit WriteStr(INT8U sla,INT8U suba,ucahr /s,INT8U no);
//功能: 从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
// 地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
// 如果返回1表示操作成功,否则操作有误。
//注意: 使用前必须已结束总线。
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
INT8U C24lc256::ReadNByte(INT16U addr,INT8U no,INT8U *s)
{
INT8U i;
INT8U temp;
INT8U ack=0;
INT8U err;
OSSemPend(GI2CSem, 0, & err);
I2cStart(); //启动总线//
ack+=I2cSendByte(0xa0); //发送器件地址//
//if(ack==FALSE)return(FALSE);
temp=addr>>8;
ack+= I2cSendByte(temp);
//if(ack==FALSE)return(FALSE);
ack+=I2cSendByte(addr); //发送器件子地址//
//if(ack==FALSE)return(FALSE);
I2cStart();
ack+=I2cSendByte(0xa1);
//if(ack==FALSE)return(FALSE);
for(i=0;i<no-1;i++)
{
*s=I2cRcvByte(); //发送数据//
I2cAck(0); //发送就答位//
s++;
}
*s=I2cRcvByte();
I2cAck(1); //发送非应位//
I2cStop(); //结束总线//
err = OSSemPost(GI2CSem);
if(ack<4) ack=FALSE;
else ack=TRUE;
return(ack);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -