打印
[MSP430]

MSP430模拟时序读写24C32的问题

[复制链接]
1583|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我用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_data
unsigned 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;
}
请高手指教,谢谢!下面贴出波形图。

相关帖子

沙发
wangch_sh|  楼主 | 2014-6-15 13:27 | 只看该作者


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

使用特权

评论回复
板凳
wangch_sh|  楼主 | 2014-6-15 13:28 | 只看该作者
发送24C32高位地址。

使用特权

评论回复
地板
wangch_sh|  楼主 | 2014-6-15 13:29 | 只看该作者
发送24C32低位地址。

使用特权

评论回复
5
wangch_sh|  楼主 | 2014-6-15 13:29 | 只看该作者
重新起始位。发送0XA1

使用特权

评论回复
6
wangch_sh|  楼主 | 2014-6-15 13:31 | 只看该作者
读数据。

有的数据1没有降到0又变成高电平了。

使用特权

评论回复
7
wangch_sh|  楼主 | 2014-6-15 13:33 | 只看该作者
黄的是数据,蓝的是时钟。请高手支招。谢谢!
还有I2C芯片,我用51读写是好的,加10K上拉。
MSP430是3.3V的,用10K上拉可以吧?

使用特权

评论回复
8
rszhao| | 2014-6-15 16:05 | 只看该作者
上拉4.7k就可以的 看看你的时序 一般都是时序出现问题照成的

使用特权

评论回复
9
wangch_sh|  楼主 | 2014-6-15 16:18 | 只看该作者
谢谢!终于搞好啦!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:为江山踏坏了乌骓马,为社稷拉断了宝雕弓。

318

主题

2817

帖子

5

粉丝