⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c24lc256.cpp

📁 24LC256完整的读完程序(长期产品中应用)
💻 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 + -