5438给PCF8563读写数据,出错,请大家给找找错

2019-03-24 14:56发布

#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 编辑 ] 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
kingheimer
1楼-- · 2019-03-24 18:27
 精彩回答 2  元偷偷看……
zzbaizhi
2楼-- · 2019-03-24 22:56
< :TI_MSP430_内容页_SA7 --> 看见别人有写初始化的子函数,但我的start_I2C中的头两步就实现初始化了。
8563的控制寄存器中的设置大多与中断有关,我这用不到,所以默认设置就可以了。
MCLK=1.045MHZ,I2C频率应该没超400K。
Triton.zhang
3楼-- · 2019-03-24 23:27
你有没有示波器,打下波形呢?
如果没有示波器,建议在网上买一个最简单的逻辑分析仪,就几十块钱,能够帮你很多忙。
kingheimer
4楼-- · 2019-03-25 00:05
 精彩回答 2  元偷偷看……

一周热门 更多>

相关问题

    相关文章