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

📄 eeprom.h

📁 430读写IIC总线以及中断控制程序
💻 H
字号:
#ifndef EEPROM_H
#define EEPROM_H

#include <msp430x41x.h>

#define SDA_1  P2OUT |=BIT3   //==SDA 接P2.3 ;  SCL接 P2.4 ;     WP接 地;    电源接P2.5;
#define SDA_0  P2OUT &= ~BIT3 
#define SCL_1  P2OUT |=BIT4
#define SCL_0  P2OUT &=~BIT4

#define ee_on  P2OUT ^= BIT5      //FM24CL02供电
#define ee_off P2OUT &=~BIT5      //FM24CL02断电
#define uint unsigned int
#define uchar unsigned char
#define ulint unsigned long 
#define SENDCOM  0xa0
#define RECCOM   0Xa1 
uchar ack;
//***********************************************************************************
void Start_I2c(void);
void Stop_I2c(void);
void  SendByte(unsigned char  c);
unsigned char  RcvByte(void);
void Ack_I2c(unsigned char a);
unsigned char IRcvStr(uchar suba1,uchar *s1,uchar length);
unsigned char ISendStr(uchar suba,uchar *s,uchar length);
unsigned char TestAck(void);
/*******************************************************************
                     起动总线函数               
函数原型: void  Start_I2c();  
功能:       启动I2C总线,即发送I2C起始条件.
  
********************************************************************/
void Start_I2c(void)
{
  _NOP();
  _NOP();
  _NOP();
  SDA_1;   /*发送起始条件的数据信号*/
  _NOP();
  SCL_1;
  _NOP();    /*起始条件建立时间大于4.7us,延时*/
  _NOP();
  _NOP();
  _NOP();
  _NOP();    
  SDA_0;   /*发送起始信号*/
  _NOP();    /* 起始条件锁定时间大于4μs*/
  _NOP();
  _NOP();
  _NOP();
  _NOP();       
  SCL_0;   /*钳住I2C总线,准备发送或接收数据 */
  _NOP();
  _NOP();
}
/*******************************************************************
                      结束总线函数               
函数原型: void  Stop_I2c();  
功能:       结束I2C总线,即发送I2C结束条件.
  
********************************************************************/
void Stop_I2c(void)
{
   _NOP();
  _NOP();
  _NOP();  
  SDA_0;  /*发送结束条件的数据信号*/
  _NOP();   /*发送结束条件的时钟信号*/
  SCL_1;  /*结束条件建立时间大于4μs*/
  _NOP();
  _NOP();
  _NOP();
  _NOP();
  _NOP();
  SDA_1;  /*发送I2C总线结束信号*/
  _NOP();
  _NOP();
  _NOP();
  _NOP();
  _NOP();
 
}
/*******************************************************************
                 字节数据传送函数               
函数原型: void  SendByte(uchar c);
功能:  将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
     此状态位进行操作.(不应答或非应答都使ack=0 假)     
     发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
********************************************************************/
void  SendByte(unsigned char  c)
{
 unsigned char  BitCnt;
 
 for(BitCnt=0;BitCnt<8;BitCnt++)  /*要传送的数据长度为8位*/
    {
     if((c<<BitCnt)&0x80) SDA_1;   /*判断发送位*/
       else  SDA_0;                
     _NOP();
     SCL_1;               /*置时钟线为高,通知被控器开始接收数据位*/
      _NOP(); 
      _NOP();               /*保证时钟高电平周期大于4μs*/
      _NOP();
      _NOP();
      _NOP();         
      SCL_0; 
    }
    
    _NOP();
    _NOP();
    SDA_1;               /*8位发送完后释放数据线,准备接收应答位*/
    _NOP();
    _NOP();   
    SCL_1;
    _NOP();
    _NOP();
    _NOP();
    SCL_0;
    _NOP();
    _NOP();
}
/*******************************************************************
                 字节数据传送函数               
函数原型: uchar  RcvByte();
功能:  用来接收从器件传来的数据,并判断总线错误(不发应答信号),
     发完后请用应答函数。  
********************************************************************/	
unsigned char  RcvByte(void)
{
  unsigned char  retc;
  unsigned char BitCnt;
  
  retc=0; 
  SDA_1;             /*置数据线为输入方式*/
  for(BitCnt=0;BitCnt<8;BitCnt++)
      {
        _NOP();           
        SCL_0;       /*置时钟线为低,准备接收数据位*/
        _NOP();
        _NOP();         /*时钟低电平周期大于4.7μs*/
        _NOP();
        _NOP();
        _NOP();
        SCL_1;       /*置时钟线为高使数据线上数据有效*/
        _NOP();
        _NOP();
        retc=retc<<1;
        if(TestAck()) retc=retc+1; /*读数据位,接收的数据位放入retc中 */
        _NOP();
        _NOP(); 
      }
  SCL_0;    
  _NOP();
  _NOP();
  return(retc);
}

/********************************************************************
                     应答子函数
原型:  void Ack_I2c(bit a);
 
功能:主控器进行应答信号,(可以是应答或非应答信号)
********************************************************************/
void Ack_I2c(uchar a)
{
  
  if(a==0) SDA_0;     /*在此发出应答或非应答信号 */
        else  SDA_1;
  _NOP();
  _NOP();
  _NOP();      
  SCL_1;
    _NOP();
    _NOP();              /*时钟低电平周期大于4μs*/
    _NOP();
    _NOP();
    _NOP();  
 SCL_0;                /*清时钟线,钳住I2C总线以便继续接收*/
    _NOP();
    _NOP();    
}

unsigned char TestAck(void)
{
 unsigned char a;
 P2DIR &= ~BIT3;  //P2.3设为输入
 a=P2IN &BIT3;
 P2DIR |= BIT3;  //P2.3恢复为输出
 return(a); 
}
/*******************************************************************
                    向有子地址器件发送多字节数据函数               
函数原型: bit  ISendStr(uchar SENDCOM,uchar suba,ucahr *s,uchar length);  
功能:     从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
          地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
           如果返回1表示操作成功,否则操作有误。
注意:    使用前必须已结束总线。
********************************************************************/
unsigned char ISendStr(uchar suba,uchar *s,uchar length)
{
   unsigned i;
   P2DIR|=BIT3+BIT4+BIT5;
   P2OUT|=BIT5;
   Start_I2c();               /*启动总线*/
   SendByte(SENDCOM);             /*发送器件地址*/
   SendByte(suba);            /*发送器件子地址*/

   for(i=0;i<length;i++)
    {   
     SendByte(*s);            /*发送数据*/
     s++;
    } 
 Stop_I2c();                  /*结束总线*/ 
 _NOP();
  _NOP();              
  _NOP();
  _NOP();
  _NOP();  
  P2OUT&=~BIT5;
  P2OUT&=~(BIT3+BIT4);
  return(1);
}
/*******************************************************************
                    向有子地址器件读取多字节数据函数               
函数原型: bit  ISendStr(uchar RECCOM,uchar suba,ucahr *s,uchar no);  
功能:     从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
          地址RECCOM,子地址suba,读出的内容放入s指向的存储区,读no个字节。
           如果返回1表示操作成功,否则操作有误。
注意:    使用前必须已结束总线。
********************************************************************/
unsigned char  IRcvStr(uchar suba1,uchar *s1,uchar length)
{
   unsigned char i;
   P2DIR|=BIT3+BIT4+BIT5;
   P2OUT|=BIT5;

   Start_I2c();               /*启动总线*/
   SendByte(SENDCOM);            /*发送器件地址*/
   SendByte(suba1);            /*发送器件子地址*/
   Start_I2c();
   
   SendByte(RECCOM);            //D0=1为读命令

   for(i=0;i<length;i++)
    {   
     *s1=RcvByte();               //发送数据
      Ack_I2c(0);                //发送就答位  
      s1++;
    } 
   *s1=RcvByte();
  Stop_I2c();                    //结束总线 
  _NOP();
  _NOP();              
  _NOP();
  _NOP();
  _NOP();  
  P2OUT&=~BIT5;
  P2OUT&=~(BIT3+BIT4);
  return(1);
}
#endif

⌨️ 快捷键说明

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