TI中文支持网
TI专业的中文技术问题搜集分享网站

msp430lanchpad模拟时序读写24c32的问题

我用MSP430模拟时序读写24C32不成功。
程序如下:

#include "MSP430G2553.h"
#define uchar unsigned char
#define uint unsigned int
//sbit sda=P1^1;//;模拟I2C 数据    //  sbit scl=P1^0;//;模拟I2C 时钟#define sda_1 P1OUT|=BIT3
#define sda_0 P1OUT&=~BIT3
#define scl_1 P1OUT|=BIT1
#define scl_0 P1OUT&=~BIT1
unsigned char data[3];
      void delay1(uint z)//延时为 1ms      {  
      uchar x,x1;      for(;z>0;z–)      {      for(x=0;x<114;x++)      {      for(x1=0;x1<96;x1++);      }      }      }  
      void delay()//5us延时      {   unsigned char i,j;
   for(i=0;i<96;i++)
   {
              j=j;
              j=j;
              j=j;
   }
      }      void star()//开始      {      sda_1;      delay();//5us延时      scl_1;      delay();//5us延时      sda_0;      delay();//5us延时      }      void stop()//停止      {      sda_0;      delay();//5us延时      scl_1;      delay();//5us延时      sda_1;      delay();//5us延时      }      void ack()//应答      {        uchar z=0;
       P1DIR&=~BIT3;       P1REN|=BIT3;
       delay();
       delay();
       //
      while((P1IN&0X08)&&(z<200))z++;//条件判断, sda=1,则没有应答。如果没有应答则延时:z<50,z++;后返回      scl_0;      delay();//5us延时      P1DIR|=BIT3;
      P1REN&=~BIT3;
      delay();
      delay();
      //
      }      ///写一个数据函数      //器件写地址 slave_write_address      //字节高地址 byte_High_address      //字节低地址 byte_Low_address      //待写入数据 data_data      void write(uchar slave_write_address,uchar byte_High_address,uchar      byte_Low_address,uchar data_data)//写一个数据      {      uchar temp,temp1,i,ii;      star();//开始      for(ii=0;ii<4;ii++)//根据 24CXX文档资料,和时序图,按顺序送:器件写地址,字节地址,数据      {  
      if(ii==0)      {      temp=slave_write_address;//送 器件写地址      temp1=slave_write_address;      }      else if(ii==1)      {      temp=byte_High_address;//送 字节高地址      temp1=byte_High_address;      }      else if(ii==2)      {      temp=byte_Low_address;//送 字节低地址      temp1=byte_Low_address;      }      else if(ii==3)      {      temp=data_data;//送 数据      temp1=data_data;      }
      for(i=0;i<8;i++)      {      scl_0;      delay();//5us延时      temp=temp1;      temp=temp&0x80;// 相 与 后,把不相关的位清零      if(temp==0x80)//根据前面 相 与 后,判断 temp是否等于0x80,是则该位为 1      sda_1;  
      else      sda_0;      delay();//5us延时      scl_1;      delay();//5us延时      scl_0;      delay();//5us延时      temp1=temp1<<1;//向左移出1位      }      sda_1;      delay();//5us延时      scl_1;      delay();//5us延时      ack();      }      stop();//停止      }      ///读一个数据函数      //器件写地址 slave_write_address      //器件读地址 slave_read_address      //字节高地址 byte_High_address      //字节低地址 byte_Low_address      //读出的数据 data_dataunsigned char  read(uchar slave_write_address,uchar byte_High_address,uchar byte_Low_address,uchar      slave_read_address)//读一个数据      {      uchar temp,temp1,i,ii,x,data_data;      star();//开始      for(ii=0;ii<4;ii++)//根据 24CXX文档资料,和时序图,按顺序送:器件写地址,字节地址,器件读地址      {  
      if(ii==0)      {      temp=slave_write_address;//送 器件写地址      temp1=slave_write_address;      }      else if(ii==1)      {      temp=byte_High_address;//送 字节高地址      temp1=byte_High_address;      }      else if(ii==2)      {      temp=byte_Low_address;//送 字节低地址      temp1=byte_Low_address;      }      else if(ii==3)      {  
      star();//开始      temp=slave_read_address;//送 器件读地址      temp1=slave_read_address;      }
      for(i=0;i<8;i++)//开始读数据      {      scl_0;      delay();//5us延时      temp=temp1;      temp=temp&0x80;// 相 与 后,把不相关的位清零      if(temp==0x80)//根据前面 相 与 后,判断 temp是否等于0x80,是则该位为 1      sda_1;  
      else      sda_0;      delay();//5us延时      delay();//5us延时      scl_1;      delay();//5us延时      scl_0;      delay();//5us延时      temp1=temp1<<1;//向左移出1位      }      sda_1;      delay();//5us延时      scl_1;      delay();//5us延时      delay();//5us延时
      ack();//应答      }      delay();
      for(x=0;x<8;x++)      {      data_data=data_data<<1;//向左移入1位      //sda=1;      P1DIR&=~BIT3;
      P1REN|=BIT3;
      delay();//5us延时      delay();//5us延时      scl_0;      delay();//5us延时      scl_1;      delay();//5us延时      if(P1IN&0X08)//判断 数据线是否是高电平      data_data|=0x01;//把读到的数据 或 0X01  
      //else  
      //data_data|=0x00;      }      ack();//应答      stop();//停止      P1DIR|=BIT3;
      P1REN&=~BIT3;
      return data_data;//返回读到的数据      }int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  P1SEL&=~(BIT1+BIT3);
  P1DIR|=BIT0+BIT1+BIT3;
  //write(0xa0,0x00,0x01,0x66);//向器件写一个数据:      //(0xa0 是器件写地址;0x00 是字节高地址;0x01 是字节低地址;0x66 是待写入的数据)      //delay1(5);//写与读的时间间隔应大于5ms,取决于器件 24C02的响应速度      //向器件读一个数据      //把读出的数据送 P1口显示      //data[0]=read(0xa0,0x00,0x01,0xa1);//向器件读一个数据:      //(0xa0 是器件写地址;0x00 是字节高地址;0x01 是字节低地址;0xa1 是器件读地址)  while(1)
  {
    data[0]=read(0xa0,0x00,0x02,0xa1);//向器件读一个数据: ;
    delay1(1);
  }
  //return 0;
}
请高手指教,谢谢!下面贴出波形图。

ccb bcc:

都是读时序的波形图。我想先试好读程序,再加上写的。起始位,发送0xa0.感觉应答位好像有问题。

ccb bcc:

回复 ccb bcc:

搞定了。。。。。。。。

赞(0)
未经允许不得转载:TI中文支持网 » msp430lanchpad模拟时序读写24c32的问题
分享到: 更多 (0)