关于PCF8563T的一个程序,没调出来

2019-03-23 22:16发布

本帖最后由 q891031520 于 2018-8-2 18:42 编辑

最近试着用PCF8563T这个芯片,用IIC通信,不过在尝试了几次后没有写进去数据,也没有读出来。但是一样的逻辑51就可以读写。
又找了网上某兄弟的代码。改了下还是不行,贴出程序来大家帮忙看看,没怎么用过IIC。
/*  PCF8563 底层驱动程序
2006-04-18                      */
#include <msp430x14x.h>
//#include "msp430_m.h"
#include "BaseConfig.h"
#define ADDR_RD  0xa3
#define ADDR_WR  0xa2

#define REG_CTL1  0x00
#define REG_CTL2  0x01
#define REG_SEC   0x02
#define REG_MIN   0x03
#define REG_HOUR  0x04
#define REG_DAY   0x05
#define REG_WEEK  0x06
#define REG_MON   0x07
#define REG_YEAR  0x08
#define REG_ALARM_MIN  0x09
#define REG_ALARM_HOUR 0x0a
#define REG_ALARM_DAY  0x0b
#define REG_ALARM_WEEK 0x0c
#define REG_FREQ   0x0d
#define REG_TMRCTL 0x0e
#define REG_TMR    0x0f

#define uchar unsigned char
#define uint unsigned int
//******************************************************
#define set_sda()  Set_Bit(P3OUT,BIT2)//bitclr(P4DIR,BIT0); //设置为输入模式,因为有上拉电阻,故输出高电平
#define clr_sda()  Clr_Bit(P3OUT,BIT2) //bitset(P4DIR,BIT0) //设置为输出模式,端口POUT初始化时必须设定为0
#define sdain()    Clr_Bit(P3DIR,BIT2)
#define sdaout()   Set_Bit(P3DIR,BIT2)

#define set_sclk() Set_Bit(P3OUT,BIT3)//bitset(P4OUT,BIT3)
#define clr_sclk() Clr_Bit(P3OUT,BIT3)//bitclr(P4OUT,BIT3)
#define sclkout()  Set_Bit(P3OUT,BIT3)
#define bittest_sda_1()  (P3IN&BIT2)==BIT2//bittest(P4IN,BIT0) //测试SDA的输入信号是否为1
//*****************************************************************
uchar time_init_data[7]={0,0,12,5,5,9,14};
uchar time_data[7]={0,0,0,0,0,0,0};
uint sec;
void test_pcf8563(void);
void InitOSC(void)
{
  
    unsigned char i;
    BCSCTL1 &= ~XT2OFF;            //打开XT振荡器
    BCSCTL2 |= SELM_2+ SELS + DIVS_3;
   
    do
{
          IFG1 &= ~OFIFG;                 //清除振荡错误标志
          for(i = 0; i < 100; i++)
        _NOP();   //延时等待
        }
    while ((IFG1 & OFIFG) != 0); //如果标志为1继续循环等待
}

static void Start(void) //ok,启动IIC总线
{
   sdaout();
   sclkout();
   set_sda(); //1
   _NOP();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
   set_sclk();
   _NOP();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
   clr_sda();
   _NOP();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
   clr_sclk();
   _NOP();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
}

static void Stop(void)
{
   clr_sda();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
  set_sclk();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
  set_sda();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
  clr_sclk();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
}

static void Ack(void)
{
    clr_sda();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
   set_sclk();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
   clr_sclk();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
}

static void NoAck(void)
{
  set_sda();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
  set_sclk();
  _NOP();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
  clr_sclk();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
}

static void Write8Bit(unsigned char input)
{
  unsigned char i;
  
  for(i=0;i<8;i--)
  {
    if(input&0x80)
    {
       set_sda();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
       set_sclk();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
       clr_sclk();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
    }
    else
    {
      clr_sda();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
      set_sclk();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
      clr_sclk();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
    }
    input<<=1;
  }
}

/***********************************/
static  unsigned char Read8Bit(void)
{
    unsigned char i,rbyte;
   
    rbyte=0;
    for(i=0;i<8;i++)
    {
   
      sdain();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
      set_sclk();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
      rbyte<<=1;
      if(bittest_sda_1())
        rbyte|=0x01;
      clr_sclk();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
       _NOP();
    }
    return(rbyte);
}

/*************************************/
void pcf8563_wr(uchar addr,uchar *ptr_data1,uchar length)
{
  Start();
  Write8Bit(ADDR_WR);
  _NOP();
  _NOP();
  _NOP();
  _NOP();
  _NOP();
  Write8Bit(addr);
  _NOP();

_NOP();
_NOP();
  for(;length;--length)
  {
     
     Write8Bit(*ptr_data1++);
     _NOP();_NOP();_NOP();_NOP();_NOP();
  }
  Stop();
  
}

/*************************************/
void pcf8563_rd(uchar addr,uchar *ptr_data1,uchar length)
{
  Start();
  Write8Bit(ADDR_WR);
  Write8Bit(addr);
  Start();
  Write8Bit(ADDR_RD);
  
  for(;length;length--)
  {
    Ack();
    *ptr_data1++=Read8Bit();
  }
  
  NoAck();
  Stop();
}

void rtc_init()
{

  Start();
  Write8Bit(ADDR_WR);

  Write8Bit(0x00);

  Write8Bit(0x00);
  Stop();
}

void main (void)
{
  WDTCTL = WDTPW + WDTHOLD;

  rtc_init();
  while(1)
  pcf8563_rd(0x02,time_data,7);
  
}

/*******************************/
#if 0
uint sec;
void test_pcf8563(void)
{
  uchar i,arr[16];
  uchar const arr_init_rtc[]=
  {
    0x00,
    0x00,
    0x00,
    0x00,
    0x08,
    0x01,
    0x01,
    0x05,
    0x04,
    0x80,
    0x80,
    0x80,
    0x80,
    0x83,
    0x00     
  };
  for(i=0;i<sizeof(arr_init_rtc);++i)
    arr=arr_init_rtc;
  pcf8563_wr(0,arr,sizeof(arr_init_rtc));
  
  for(;;)
  {
     for(i=0;i<20;++i)
       arr=0;
     
     pcf8563_rd(0,arr,8);
     
     sec=(arr[2]>>4)*10;
     sec+=arr[2]&0x0f;
     
     i=sec;
     _NOP();
  }
}
#endif
/******************************************/


此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
q891031520
1楼-- · 2019-03-24 04:53
< 本帖最后由 q891031520 于 2018-8-2 18:43 编辑

这是源文件
q891031520
2楼-- · 2019-03-24 07:38
 精彩回答 2  元偷偷看……
chenbingjy
3楼-- · 2019-03-24 11:18
时序问题,用示波器看波形
q891031520
4楼-- · 2019-03-24 13:08
老帖子了,偏信别人的代码,不如自己写一个代码。感谢各位老哥!

一周热门 更多>

相关问题

    相关文章