5384|9

447

帖子

0

TA的资源

纯净的硅(中级)

楼主
 

给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);
void start_I2C(void);
void stop_I2C(void);
void send_char(void);
int write_PCF8563();

 

unsigned char ctrl_Buf,ack, slave_addr, write_addr, writedata;

 

main()
{ WDTCTL = WDTPW+WDTHOLD;        //关闭看门狗定时器
   int Y;
   P3DIR |=  BIT7;
   P5DIR |=  BIT4;

 

   slave_addr=0xA2;
   write_addr=0x02;
   writedata=59;

   Y=write_PCF8563();
}

 

void Delay(void)
  {_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;
    Delay();
}

 

void send_char(void)    //发送一字节数据
{unsigned char cnt, tmp=0x80;
 for(cnt=0;cnt<8;cnt++)
   {if((ctrl_Buf&tmp)>0)
      {SDA_1;}
    else{SDA_0;}
    tmp=tmp/2;           //tmp右移一位
    SCL_1;               //置时钟线为高,通知从机开始接收数据位
    Delay();
    SCL_0;
}
    Delay();
    SDA_1;             //8位发送完后释放数据线,准备接收应答位
    Delay();
    SCL_1;
    DIR_IN;
    if(SDA_IN ==1)     //判断是否接收到应答信号
       ack=0;               //无应答
    else ack=1;         //应答
    SCL_0;
    Delay();
    DIR_OUT;
}

 

int write_PCF8563()
{  start_I2C();               //启动总线
   ctrl_Buf=slave_addr;
   send_char();             //发送器件地址
   if(ack==0)
   return 0 ;
   ctrl_Buf=write_addr;
   send_char();           //发送器件子地址
   if(ack==0)
   return 0 ;

  ctrl_Buf=writedata;
  send_char();            //发送数据
   if(ack==0)
   return 0 ;
  
   stop_I2C();            //结束总线 
   return 1;
}

这是用5438给PCF8563写数据的一个程序,用IAR编译后,查看Y的值(Y的作用是说明数据是否写入),显示ERROR.检查半天也不知道哪里出错,希望大家给看看

PS:MCLK=1.045MHZ

     因为写数据过程中用不到ACK和NACK(即应答和不应答),所以没写。

     因为PCF8563里数据存储为BCD码格式,会是这个原因吗?

 

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

最新回复

你的Y值只有一个地方赋值,没有其他地方使用,编译器在编译的时候会把Y变量优化掉,所以编译器会提示Y未被使用。你看下你的汇编代码就清楚了。  详情 回复 发表于 2012-2-21 11:45
 
点赞 关注

回复
举报

400

帖子

0

TA的资源

五彩晶圆(中级)

沙发
 

1. 先提你代码的问题:

    if(SDA_IN ==1) //判断是否接收到应答信号

    这句代码是有问题的,至于什么问题,你自己去查。

2. 你的代码虽然很不合理,但时序是对的。 下图是用你的代码跑出来的时序

3.  你判断是否写入的标准是如何的.

    帖子里说你是判断Y值,但如何判断的?从代码中看不出来你如何能通过Y值来判断是否写入。

 

 

 
 

回复

400

帖子

0

TA的资源

五彩晶圆(中级)

板凳
 
另外,纠正你一个概念,I2C即使是写也是需要ACK的。
 
 
 

回复

447

帖子

0

TA的资源

纯净的硅(中级)

4
 

回复 板凳 Triton.zhang 的帖子

1 ack为应答标志位,无应答时ack=0,有应答时ack=1.如果从机无应答说明发送数据失败,write_PCF8563()返回0给Y, 主机发送 stop_I2C(); //结束总线 后说明发送数据成功,write_PCF8563()返回1给Y。所以通过判断Y的值,来判断写数据是否成功。

 2 在写数据过程中,主机发送一个字节后便检测应答以确认从机是否收到,所以主机只需要检测,而从机应答(ACK).我觉得主机不需要应答,所以就把ACK去掉了。如果需要加上ACK这个子函数的话,是为了给从机用吗?

3  使用PCF8563时,一定要使用它的驱动程序吗?

[ 本帖最后由 zzbaizhi 于 2012-2-19 09:45 编辑 ]
 
 
 

回复

447

帖子

0

TA的资源

纯净的硅(中级)

5
 
本来是想采用写入然后读取办法来检验数据是否写入,但怕出错后不好检查,就设置了Y
 
 
 

回复

424

帖子

0

TA的资源

纯净的硅(高级)

6
 
为什么不使用硬件I2C?还是单纯为了学习?
 
 
 

回复

447

帖子

0

TA的资源

纯净的硅(中级)

7
 

回复 6楼 鸵鸟蝈蝈 的帖子

打算学习完这个,再学习硬件的
 
 
 

回复

400

帖子

0

TA的资源

五彩晶圆(中级)

8
 
从代码看,你是无法通过Y值判断来看是否写入的。
 
 
 

回复

207

帖子

0

TA的资源

一粒金砂(中级)

9
 
看的我眼都花了,我供的是这个8563的芯片.
 
 
 

回复

400

帖子

0

TA的资源

五彩晶圆(中级)

10
 
你的Y值只有一个地方赋值,没有其他地方使用,编译器在编译的时候会把Y变量优化掉,所以编译器会提示Y未被使用。你看下你的汇编代码就清楚了。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表