原创 MSP430F133扩展串行E PROM的方法源程序

2009-2-21 08:20 1362 3 3 分类: MCU/ 嵌入式

MSP430F133扩展串行E<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />PROM的方法源程序


以下为单片机从指定地址读取数据的程序。其中start(),stop(),ack(),notack(),writebyte(),readbyte()是最基本的子程序,E2PROM _read()通过反复调用这些子程序实现对外部存储器的顺序读操作。


#define SDA  0x01               //定义P6.0 SDA


#define SCL  0x02               //定义P6.1 SCL


#define uchar  unsigned char


#define uint   unsigned int


void start(void)                   //产生开始条件的子程序


{


 P6DIR&=~BIT0;                // P6.0 设为输入,SDA=1


 P6DIR&=~BIT1;                //P6.1 设为输入,则SCL=1


 _NOP();_NOP();                //延时


 P6DIR|=BIT0;                  // P6.0 设为输出,SDA=0


 _NOP();_NOP();


}


void stop(void)                   //产生停止条件的子程序


{


 P6DIR|=BIT0;


 P6DIR&=~BIT1;


 _NOP();_NOP();


 P6DIR&=~BIT0;


 _NOP();_NOP();


}


void ack(void)                   //产生应答的子程序


{


 P6DIR|=BIT0;


 _NOP();_NOP();


 P6DIR&=~BIT1;


 _NOP();_NOP();


 P6DIR|=BIT1;


}


void notack(void)                 //产生非应答的子程序


{


 P6DIR&=~BIT0;


 _NOP();_NOP();


 P6DIR&=~BIT1;


 _NOP();_NOP();


 P6DIR|=BIT1;


}


void writebyte(uchar data)           //写一个字节数据,data为指定数据


{


 uchar count="8";                   //字节位数控制


 uchar temp;                     //中间变量控制


 do


   {


    temp=data;


    P6DIR|=BIT1;                //SCL=0


    _NOP();_NOP();


    if((temp&0x80)==0x80)        //如果data最高位为“1


      P6DIR&=~BIT0;           // SDA=1


    else


      P6DIR|=BIT0;             //否则SDA=0


    P6DIR&=~BIT1;             //SCL=1


    temp=data<<1;               //数据左移一位


    data=temp;


    count--;


   }while (count);


 P6DIR|=BIT1;


}


uchar readbyte(void)            //读一个字节数据,并返回值到data


{


 uchar temp;


 uchar data="0";


 uchar count="8";


 P6DIR&=~BIT0;              //SDA=1


 do


   {


    P6DIR|=BIT1;               //SCL=0


    _NOP();_NOP();


    P6DIR&=~BIT1;             //SCL=1


    _NOP();_NOP();


    if(P6IN&BIT0)              //如果输入的SDA=1


      data=data|0x01;            //data的最低位置“1


    else


      data=data&0xFE;           //否则data的最低位置“0


    if(count-1)


     {


      temp=data<<1;


      data=temp;


      }


    count--;


   }while (count);


 return (data);                    //返回读取的数据到data


}


void E2PROM _read(uchar data[],uint address,uchar num)  //对外部存储器顺序读


{


  uchar i;


  uchar *pdata;


  pdata=data;


  P6OUT&=~(SDA+SCL);         //设置P6.0P6.1的输出寄存器为“0


  start();                        //开始


  writebyte(0xa0);                //写控制字


  ack();                        //应答信号


  writebyte(address>>8);          //指定地址的高8


  ack();


  writebyte(address&0x00ff);      //指定地址的低8


  ack();


  start();                       //再次启动开始条件


  writebyte(0xa1);               //读控制字


  ack();


  for(i=0;i<num;i++)


  {


   *(pdata+i)=readbyte();        //从存储器指定地址读数据,并放在预先定义的数组中


    P6DIR|=BIT1;


   if(i!=num-1) ack();           //除最后一个字节外,产生应答


  }


  notack();                    //最后一个字节读取后,产生非应答


  stop();                      //停止


}


 


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
3
关闭 站长推荐上一条 /3 下一条