这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » PCF8563 PCF8563的困惑

共2条 1/1 1 跳转至

PCF8563 PCF8563的困惑

院士
2006-09-17 18:14:16     打赏
PCF8563 PCF8563的困惑



关键词: PCF8563     困惑    

院士
2006-12-22 22:43:00     打赏
2楼
问 我写什么,读出来的依然如旧,时钟不走,CLKOUT正常。请教DX 1: 有遇到这个问题的请帮帮忙 2: 估计是没有写进去。 3: 试试这个/****************************************************************************
* 文件名:I2CTest.C
* 功能:使用硬件I2C对E2PROM进行操作,利用中断方式操作。
* 说明:将跳线器JP5、JP9短接。
****************************************************************************/
#include  "config.h"

#define   PCF8563 0xA2            /* 定义器件地址 */

#define      BEEPCON    (1<<7)            
void GET8563(void);
void SET8563(void);
   uint8  data_buf[7];


/****************************************************************************
* 名称:I2C_Init()
* 功能:主模式I2C初始化,包括初始化其中断为向量IRQ中断。
* 入口参数:fi2c        初始化I2C总线速率,最大值为400K
* 出口参数:无
****************************************************************************/
void  I2C_Init(uint32 fi2c)
{  if(fi2c>400000) fi2c = 400000;

   PINSEL0 = (PINSEL0&0xFFFFFF0F) | 0x50; // 设置I2C控制口有效

   I2SCLH = (Fpclk/fi2c + 1) / 2;    // 设置I2C时钟为fi2c
   I2SCLL = (Fpclk/fi2c) / 2;
   I2CONCLR = 0x2C;
   I2CONSET = 0x40;                    // 使能主I2C
   
   /* 设置I2C中断允许 */
   VICIntSelect = 0x00000000;        // 设置所有通道为IRQ中断
   VICVectCntl0 = 0x29;                // I2C通道分配到IRQ slot 0,即优先级最高
   VICVectAddr0 = (int)IRQ_I2C;        // 设置I2C中断向量地址    
   VICIntEnable = 0x0200;           // 使能I2C中断
}


/****************************************************************************
* 名称:DelayNS()
* 功能:长软件延时
* 入口参数:dly        延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void  DelayNS(uint32  dly)
{  uint32  i;

   for(; dly>0; dly--)
      for(i=0; i<50000; i++);
}
    
    
/****************************************************************************
* 名称:WrEepromErr()
* 功能:读写EEPRM出错蜂鸣报警。
* 入口参数:无
* 出口参数:无
****************************************************************************/    
void  WrEepromErr(void)    
{  while(1)
   {  IO0SET = BEEPCON;
      DelayNS(2);
      IO0CLR = BEEPCON;
      DelayNS(2);
   }
}
            

/****************************************************************************
* 名称:main()
* 功能:向E2PROM写入10字节数据,然后读出判断是否正确写入。
* 说明:在STARTUP.S文件中使能IRQ中断(清零CPSR中的I位);
*      在CONFIG.H文件中包含I2CINT.H。
****************************************************************************/
int  main(void)
{  uint8  i;

   PINSEL0 = 0x00000000;            
   PINSEL1 = 0x00000000;        
   IO0DIR = BEEPCON;
   IO0SET = BEEPCON;
   
   I2C_Init(100000);                          // I2C初始化
   //设置为05-03-15 15:21:00
   data_buf[0]=0x00;
   data_buf[1]=0x21;
   data_buf[2]=0x15;
   data_buf[3]=0x15;
   data_buf[4]=0x01;
   data_buf[5]=0x03;
   data_buf[6]=0x05;

//SET8563();
   DelayNS(1);                              // 等待写周期结束
   
   for(i=0; i<7; i++) data_buf[i] = 0;
    GET8563();  



   
   while(1);
   return(0);                    
}
void GET8563(void)
{

   IRcvStr(PCF8563, 0x02, data_buf, 7);    // 在0x00地址处读出10字节数据
    data_buf[0]&=0x7f;
    data_buf[1]&=0x7f;
    data_buf[2]&=0x3f;
    data_buf[3]&=0x3f;
    data_buf[4]&=0x07;
    data_buf[5]&=0x1f;



}
void SET8563(void)
{

   data_buf[0]=0x00;
   data_buf[1]=0x21;
   data_buf[2]=0x15;
   data_buf[3]=0x14;
   data_buf[4]=0x01;
   data_buf[5]=0x03;
   data_buf[6]=0x05;


   ISendStr(PCF8563, 0x02, data_buf, 7);    // 在0x00地址处写入10字节数据

}
   
//--------------------------------------------------------------------------------

// 0x02:秒/0x03:分/0x04:小时/0x05:日/0x06:星期/0x07:月  /0x08:年
// ---------------------------------------------------------------------------------



共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]