社区导航

 
查看: 356|回复: 3

[求助] 关于PCF8563T的一个程序,没调出来

[复制链接]

29

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2018-8-2 18:32:13 | 显示全部楼层 |阅读模式
本帖最后由 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
/******************************************/


此帖出自MSP430论坛


回复

使用道具 举报

29

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-8-2 18:33:30 | 显示全部楼层
本帖最后由 q891031520 于 2018-8-2 18:43 编辑

这是源文件

149源码.zip

144.13 KB, 下载次数: 0



回复

使用道具 举报

29

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-8-2 20:40:05 | 显示全部楼层
使用模拟IIC是因为IIC引脚已经被占用,而实际读出来的数据都是FFFFFFFFFF,


回复

使用道具 举报

1569

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2018-8-3 09:02:58 | 显示全部楼层
时序问题,用示波器看波形
为江山踏坏了乌骓马,为社稷拉断了宝雕弓。


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2018-8-16 23:37 , Processed in 0.123446 second(s), 15 queries , Gzip On, Redis On.

快速回复 返回顶部 返回列表