3798|4

447

帖子

0

TA的资源

纯净的硅(中级)

楼主
 

5438给PCF8563读写数据,出错,请大家给找找错 [复制链接]

#include <msp430x54x.h>

 

#define SDA_1       P3OUT |=  BIT7             //SDA = 1
#define SDA_0       P3OUT &=~ BIT7             //SDA = 0
#define SCL_1       P5OUT |=  BIT4             //SCL = 1
#define SCL_0       P5OUT &=~ BIT4              //SCL = 0
#define DIR_IN       P3DIR &=~ BIT7            //I/O口为输入
#define DIR_OUT    P3DIR |=  BIT7              //I/0口为输出
#define SDA_IN      (P3IN & 0x80)              //Read SDA

 

void Delay();
void start_I2C();
void stop_I2C();
void Ack();
void NAck();
void CheckAck();
void SendByte(unsigned char c);
unsigned char  ReadByte();
unsigned char  read_PCF8563(unsigned char slave_addr,unsigned char write_addr);
void write_PCF8563(unsigned char slave_addr,unsigned char write_addr,unsigned char  writedata);

 

void main()
{  WDTCTL = WDTPW+WDTHOLD;                   //关闭看门狗定时器
   P3DIR |=  BIT7;
   P5DIR |=  BIT4;
  
  write_PCF8563(0xA2,0x02,0x59);
  read_PCF8563(0xA2,0x02);
}


void  Delay()
     {_NOP();}

void start_I2C(void)       //I2C的开始条件
{ SDA_1;    //发送起始条件的数据信号
  Delay();
  SCL_1;
  Delay();
  SDA_0;    //发送起始信号
  Delay();
  SCL_0;    //钳住I2C总线,准备发送或接收数据
  Delay();
}

void stop_I2C(void)      //I2C的停止条件
{SDA_0;                      //发送结束条件的数据信号
 Delay();
 SCL_1;  
 Delay();
 SDA_1;                     //发送I2C总线结束信号
 Delay();
}
 
void  SendByte(unsigned char c)
    {int BitCnt;
     for(BitCnt=0;BitCnt<8;BitCnt++) 
        { if((c<<BitCnt)&0x80)
          SDA_1;  
          else  SDA_0;               
          Delay();
          SCL_1;               //置时钟线为高,通知从机开始接收数据位
          Delay();    
          SCL_0;
         }
     Delay(); 
     CheckAck();
 }

unsigned char  ReadByte()

{ unsigned char read_data=0;
  unsigned char BitCnt;
 
  DIR_IN;               //置数据线为输入方式
  for(BitCnt=0;BitCnt<8;BitCnt++)
      { Delay();          
        SCL_0;                  //置时钟线为低,准备接收数据位
        Delay();        
        SCL_1;                  //置时钟线为高使数据线上数据有效
        Delay();
        if(SDA_IN==0x80)
          read_data=read_data+1;  //读数据位,接收的数据位放入read_data中
        read_data=read_data<<1;
        Delay();     

      }
  SCL_0;   
  Delay();
  DIR_OUT;
  return(read_data);
}

  void CheckAck()
  {unsigned char count=20;
   DIR_IN;
   SDA_1;            //8位发送完后释放数据线,准备接收应答位
   Delay();
   SCL_1;
   Delay();
  while(SDA_IN)
  {count--;
    if(!count)
      stop_I2C();
  }
  SCL_0;
  Delay();
  DIR_OUT;
}


void Ack()
{  SDA_0;           //在此发出应答信号
   Delay();
   SCL_1;
   Delay(); 
   SCL_0;        //清时钟线,钳住I2C总线以便继续接收
   Delay();
}

void NAck()
  {SDA_1;
   Delay();
   SCL_1;
   Delay(); 
   SCL_0;        //清时钟线,钳住I2C总线以便继续接收
   Delay();

}

void write_PCF8563(unsigned char slave_addr,unsigned char write_addr,unsigned char writedata)
{  start_I2C();                               //启动总线
   SendByte(slave_addr);             //发送器件地址
   SendByte(write_addr);           //发送器件子地址
   SendByte(writedata);            //发送数据
   stop_I2C();                           //结束总线
}

unsigned char read_PCF8563(unsigned char slave_addr,unsigned char write_addr)
{  unsigned char Y;
   start_I2C();                                  //启动总线
   SendByte(slave_addr);                //发送器件地址
   SendByte(write_addr);               //发送器件子地址
   start_I2C();                                //重新启动总线
   SendByte(slave_addr+1);
   Y=ReadByte();      
   NAck();                                     //发送非应位
   stop_I2C();                               //结束总线
   return(Y);
}

 

用5438给PCF8563读写数据,试了一下,每次都是检测不到从机应答(即运行到CheckAck后便停止),想让大家给看看程序是不是有问题,如果程序没问题的话,那是不是PCF8563坏了?

 

[ 本帖最后由 zzbaizhi 于 2012-2-21 16:40 编辑 ]

最新回复

没看到你程序里有初使化的代码啊?  详情 回复 发表于 2012-2-24 08:57
 
点赞 关注

回复
举报

188

帖子

0

TA的资源

纯净的硅(初级)

沙发
 
8563应该先初使化打开时钟,操作控制/状态寄存器0,另外看看你的IIC操作频率不要超400K
 
 

回复

447

帖子

0

TA的资源

纯净的硅(中级)

板凳
 

回复 沙发 kingheimer 的帖子

看见别人有写初始化的子函数,但我的start_I2C中的头两步就实现初始化了。
8563的控制寄存器中的设置大多与中断有关,我这用不到,所以默认设置就可以了。
MCLK=1.045MHZ,I2C频率应该没超400K。
 
 
 

回复

400

帖子

0

TA的资源

五彩晶圆(中级)

4
 
你有没有示波器,打下波形呢?
如果没有示波器,建议在网上买一个最简单的逻辑分析仪,就几十块钱,能够帮你很多忙。
 
 
 

回复

188

帖子

0

TA的资源

纯净的硅(初级)

5
 

回复 板凳 zzbaizhi 的帖子

没看到你程序里有初使化的代码啊?
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表