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

📄 iicfram.c

📁 全新的铁电存储器的操作代码.铁电存储器是近几年开发出来的掉电保持存储器,具有SRAM的快速读写和EEPROM的保持特性,做工控,完全可替换EEPROM
💻 C
字号:
FRAM IIC SoftWare:
sbit sdar= P1^4; /*串行数据*/
sbit sclr= P1^5; /*串行时钟*/
bit ACK_flagr; 
 
/************************函数列表**********************/
void delay(unsigned char ms);
void start(void);
void stop(void);
void ackr(void);
void noackr(void);
void sendbyte(unsigned char senddata);
unsigned char recbyte(void);
 
 
/*发送起始条件*/
void start(void) /*起始条件*/
{
       sdar = 1;
_nop_ (); 
       sclr = 1;
       _nop_ ();
       _nop_ ();
_nop_ ();
_nop_ ();
_nop_ (); 
       sdar = 0;
       _nop_ ();
       _nop_ ();
_nop_ ();
_nop_ ();
_nop_ (); 
       sclr = 0;
_nop_ ();
}
 
void stop(void) /*停止条件*/
{
       sdar=0;
       _nop_ ();
       sclr=1;
       _nop_ ();
       _nop_ ();
       _nop_ ();
_nop_ ();
_nop_ ();
 
       sdar=1;
       _nop_ ();
}
 
void ackr(void) /*应答位*/
{
       sdar=0;
       _nop_ ();
       _nop_ ();
_nop_ ();
_nop_ ();
       sclr=1;
       _nop_ ();
       _nop_ ();
       _nop_ ();
       _nop_ ();
       sclr=0;
 
}
 
void noackr(void) /*反向应答位*/
{
       sdar=1;
       _nop_ ();
       _nop_ ();
       _nop_ ();
       _nop_ ();
       sclr=1;
       _nop_ ();
       _nop_ ();
       _nop_ ();
       _nop_ ();
       sclr=0;
}
 
/***************发送字节数据子程序*****************/
void sendbyte(unsigned char senddata)
{
  unsigned char i;
  for(i=0;i<8;i++)
  {
    sdar=(bit)(senddata&0x80); /*取最高位*/
    senddata=senddata<<1;
    _nop_ ();
    sclr=1;
     _nop_ ();
    _nop_ ();
    _nop_ ();
    _nop_ ();
     _nop_ ();
              sclr=0;
  }
  ackr();
  _nop_();
  _nop_();
  _nop_();
  _nop_();  
  if(sdar==1)
  {
    ACK_flagr=0;   //数据发送错误
  }  
  else
  {
    ACK_flagr=1;   //数据发送正确
  } 
}
 
unsigned char recbyte(void)
{
       unsigned char i;
       unsigned char recdata=0;    //接受到的数据
       sdar=1;
       for(i=0;i<8;i++)
       {
              _nop_ (); 
              sclr=0;
              _nop_ ();
              _nop_ ();
              _nop_ ();
              _nop_ ();
              _nop_ ();  
              _nop_ (); 
              sclr=1;
              _nop_ (); 
              _nop_ ();              
              recdata=recdata<<1;
              if(sdar==1)
              {
                     recdata++;
                     _nop_ (); 
                     _nop_ (); 
              }
              sclr=0; 
              _nop_ (); 
              _nop_ (); 
   }
  return(recdata);
}
 
 
bit WrToFRam(unsigned char slv_addr,unsigned int sub_addr,unsigned char *s,unsigned char no)
{
       unsigned char i;
       unsigned char addrh;                      //存放存储单元地址高8位
       unsigned char addrl;    
       addrh = (char)(sub_addr/256);                         //取高八位
       addrl = (char)(sub_addr & 0x00ff);                    //取低八位   
       start(); /*发送启动信号*/
       sendbyte(slv_addr); /*发送SLA+W*/
       if(ACK_flagr==0)
    return(0);
       sendbyte(addrh); /*发送高位地址*/
       if(ACK_flagr==0)
    return(0);
       sendbyte(addrl); /*发送低位地址*/
       if(ACK_flagr==0)
    return(0);
       for(i=0;i<no;i++)
       {
              sendbyte(*s);
              if(ACK_flagr==0)
              return(0);
              s++;
       }
       stop();
       return(1);
}
 
bit RdFromFRam(unsigned char slv_addr,unsigned int sub_addr,unsigned char *s,unsigned char no)
{
       unsigned char addrh,addrl;//,tempdata;                      //存放存储单元地址高8位
       unsigned char i;  
       addrh = (char)(sub_addr/256);                         //取高八位
       addrl = (char)(sub_addr& 0x00ff);  
       start();
       sendbyte(slv_addr-1);
       if(ACK_flagr==0)
           return(0);
       sendbyte(addrh);
       if(ACK_flagr==0)
           return(0);
       sendbyte(addrl);
       if(ACK_flagr==0)
           return(0);
       stop();
       _nop_();
       _nop_();
       start();
       sendbyte(slv_addr);
       if(ACK_flagr==0)
    return(0);
       for(i=0;i<no-1;i++) 
    {
        *s=recbyte();
          ackr();
          s++;
     }           
       *s=recbyte();
       noackr();
       sclr=0;
       stop();
//     return(tempdata);
       return(1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -