打印

FM33256 RTC 问题

[复制链接]
2491|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
六楼的窗户|  楼主 | 2010-4-28 22:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
向FM33256写时间信息:0x30, 0x40, 0x14, 0x05, 0x07, 0x12, 0x07 (07年12月7日 星期5  14:40)
串口收到的结果却一直是:46 53 00 01 01 01 11
程序如下:
/**************************************************************************
* Copyright(C)2007
* All rights reserved.
*
* 文 件 名:
*           Check33256.C
* 文件描述:
*           FM33256 * 创 建 人:
* 当前版本: 1.0
* 完成日期: 2007年12月6日
* 修改记录:
*
* 说    明:
*           *           
*           全局变量(Global Variable)后缀:_G
***************************************************************************/
#include < reg952.h >
/*宏定义*/
#define uchar unsigned char
#define uint  unsigned int
#define uintl unsigned long
#define BRGR1_DATA  0x04    /*9600 baud @ 11.0592MHz*/
#define BRGR0_DATA  0x70
#define ADIN_Channel 0x60    /*T:AD05   V:AD06*/
#define PULSES   100                 /*计频率的脉冲个数,此值有待确定*/
#define f0    11059200.0    /*晶振频率*/
/*FM33256 op-codes*/
#define WREN  0x06
#define WRDI  0x04
#define RDSR  0x05
#define WRSR  0x01
#define READ  0x03
#define WRITE 0x02
#define RDPC  0x13
#define WRPC  0x12

sbit Ctrl_232 = P0^3;     /*RS232关断控制*/
sbit pow_en   = P1^7;     /*后级电源控制*/
sbit cs_FM    = P2^4;     /*FM33256片选*/
bit readflag=0;      /*33256读完成标志*/
/*=========================================================================
* 名    称:Delayms()
* 功能描述:
*           N*1ms级延时
* 入口参数:
*    N  延时参数
* 出口参数:
*           无
*
* 函数说明:N值越大,延时越久
=========================================================================*/
void Delayms ( uint N )
{
uint j;
while ( N>0 )
  {
   for ( j=0; j<=500; j++) ;
   N-- ;
  }
}
/*=========================================================================
* 名    称:Init_CPU()
* 功能描述:
*           初始化CPU各部件
* 入口参数:
*    无
* 出口参数:
*           无
*        
* 函数说明:无      
=========================================================================*/
void Init_CPU ( )
{
/*I/O口初始化*/
P0M1=0x87;      
   P0M2=0x00;
   
P1M1=0x3c;
   P1M2=0x00;
   
P2M1=0x02;
   P2M2=0x00;
   
P4M1=0xf3;
   P4M2=0x00;
   
P5M1=0x00;
   P5M2=0x00;
/*A/D转换模式*/
AD0INS=ADIN_Channel;        /*使能待选通道*/
ADMODA|=0x20;                  /*双通道、连续转换模式*/
ADMODB =0x00;          /*ADC时钟为1分频CCLK 8次产生中断*/
/*UART0 初始化*/
//PCON    &= 0x3f;      /**/
S0CON    = 0xf0;      /*MODE 3、使能接受、使能多机通讯*/
BRGCON_0 = 0x00;      /*载入波特率常数*/
BRGR1_0  = BRGR1_DATA;     /*9600 baud @ 11.0592MHz*/
BRGR0_0  = BRGR0_DATA;      
BRGCON_0 = 0x03;      /*选择独立的波特率发生器、并使能*/
S0STAT   = 0x20;      /*使用独立的Rx和Tx中断*/
/*UART1 初始化*/
S1CON    = 0x50;      /*MODE 1  使能接收*/
BRGCON_1 = 0x00;      /*载入波特率常数*/
BRGR1_1  = BRGR1_DATA;     /*9600 baud @ 11.0592MHz*/
BRGR0_1  = BRGR0_DATA;      
BRGCON_1 = 0x03;      /*选择独立的波特率发生器、并使能*/
S1STAT   = 0x20;      /*使用独立的Rx和Tx中断*/
/*SPI初始化*/
SPCTL=( 1<<7 )  |  /*SSIG=1,MSTR确定器件为主机还是从机。/SS引脚可作为普通I/O口*/
       ( 1<<6 )  |  /*SPEN=1,SPI使能*/
    ( 0<<5 )  |  /*DORD=1,MSB最先发送(满足FF33256的时序)*/
    ( 1<<4 )  |  /*MSTR=1,配置为主机*/
    ( 1<<3 ) |  /*CPOL=1,SPICLK空闲时为高电平,前上升沿,后下降沿*/
    ( 1<<2 )  |  /*CPHA=1,数据在/SS为低的时候被驱动,在SPICLK的后时钟沿被改变,并在前时钟沿被采样*/
    ( 0<<1 ) |  /*SPR1=0,SPR0=0: SPI时钟为CCLK/4*/
    ( 0<<0 );

SPSTAT=0xc0;   /*(写入1)清传输完成、写冲突标志位*/
cs_FM=1;
/*T0 T1 初始化*/
TMOD=0x15;                        /*定时器0:计数   定时器1:定时;  模式1:16位; TRn控制*/
TCON=0X01;                        /*外中断0下降沿触发  外中断1低电平触发*/
IEN2=0x04;        /*使能UART1接收中断*/
}
/*=========================================================================
* 名    称:WriteCompanion()
* 功能描述:
*           往指定地址写10 Byte数据
* 入口参数:
*    uint  address    1字节地址
*           uchar *buf_WFM   待写入的数据指针
*           uchar length     待写入数据的长度
* 出口参数:
*           无
*
* 函数说明:
*         
===========================================================================*/
void WriteCompanion( uchar address, uchar *buf_WFM, uchar length )
{
cs_FM=0;         /*片选FM33256*/

SPDAT=WREN;         /*Set Write Enable Latch op-code*/
while( (SPSTAT & 0x80) ==0 );    /*等待写完成*/
SPSTAT=0xc0;        /*(写入1)清传输完成、写冲突标志位*/

cs_FM=1;         /*禁止FM33256*/

cs_FM=0;

SPDAT=WRPC;           /*WRPC op-code*/
while( (SPSTAT & 0x80) ==0 );
SPSTAT=0xc0;

SPDAT=address;       /*address*/
while( (SPSTAT & 0x80) ==0 );
SPSTAT=0xc0;
  
while( length-- )      /*先用再减*/
  {
   SPDAT=*buf_WFM;        /*Data In*/
   while( (SPSTAT & 0x80) ==0 );
   SPSTAT=0xc0;
   buf_WFM++;
  }
cs_FM=1;

Delayms ( 10 );
}
/*=========================================================================
* 名    称:ReadCompanion()
* 功能描述:
*           从指定地址读出10 Byte数据
* 入口参数:
*    uint  address     1字节地址
*   uchar *buf_R         读出数据的指针
*   uchar length         读数据的长度
* 出口参数:
*           无
*
* 函数说明:
*           
===========================================================================*/
void ReadCompanion( uchar address, uchar *buf_RFM, uchar length )
{
cs_FM=0;
SPDAT=RDPC;         /*RDPC op-code*/
while( (SPSTAT & 0x80) ==0 );
SPSTAT=0xc0;
           
SPDAT=address;        /*address*/
while( (SPSTAT & 0x80) ==0 );
SPSTAT=0xc0;

while( length-- )
  {
   SPDAT=0xff;          /*产生CLK*/
   while( (SPSTAT & 0x80) ==0 );

    *buf_RFM=SPDAT;           /*Data Out*/
  
   SPSTAT=0xc0;
   buf_RFM++;
   }
cs_FM=1;
readflag=1;                 /*置读完成标志*/
Delayms ( 10 );
}
/*=========================================================================
* 名    称:main()
* 功能描述:
*           
* 入口参数:
*    无
* 出口参数:
*           无
*
* 函数说明:无
===========================================================================*/
void main ( )
{
uchar temp[7]={0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
uchar RTCdata[7]={0x30, 0x40, 0x14, 0x05, 0x07, 0x12, 0x07};   /*S M H Day Date month year*/

uchar i;
Delayms ( 10 );
Init_CPU ();
EA=1;

Ctrl_232=0;                          /*打开232-允许TxOUT*/

WriteCompanion( 0x00, 0x12, 1 );      /* /OSEN=0  AEN=1  CAL=0  W=1  R=0*/
WriteCompanion( 0x02, RTCdata, 7 );         /*向指定地址写入RTC数据*/

WriteCompanion( 0x00, 0x10, 1 );

while( 1 )
  {
   pow_en=0;
      
   
   Delayms ( 5000 );
   
   WriteCompanion( 0x00, 0x11, 1 );       /* /OSEN=0  AEN=1  CAL=0  W=0  R=1*/
   ReadCompanion(  0x02, temp, 7 );    /*向指定地址读7 Byte数据*/
   WriteCompanion( 0x00, 0x10, 1 );    /*清零R*/
   
     
   if( readflag ==1 )
    {
     for( i=0; i<7; i++ )
      {
       S1BUF=temp;              /*将读出的数据发送至UART1*/
       while( (S1CON & 0x02) == 0x00 );      
       S1CON &=0xfd;
      }
     readflag=0;
       }
   
   Delayms ( 500 );
   pow_en=~pow_en;
   Delayms ( 500 );        
  }
}

相关帖子

沙发
金鱼木鱼| | 2010-4-28 22:03 | 只看该作者
读写已调试正确,具体的程序调试过程,见如下地址:

http://www.edacn.net/?uid-70720-action-viewspace-itemid-32335

使用特权

评论回复
板凳
六楼的窗户|  楼主 | 2010-4-28 22:04 | 只看该作者
但是居然又出现用备用电池供电的时候,时间居然没有走动。

使用特权

评论回复
地板
6019赵文| | 2010-4-28 22:05 | 只看该作者
我的FM3104 也是时钟不走  不知道何故

外接3.7V锂电池

真是急人呀

我先对0到0BH一次性写入  02,0,0,     50h,21h,07h,06h,07h,12h,07h,    0,0,0   (07年12月7日星期6  21点50分0秒)  清WATCHDOG

在对0H写入0   初始化结束。

然后等到几十秒  0H 写入 01H(0.0 R=1),读取02H到09H的时钟数据  在对)0H写0   完成一个读周期  发现读出的时钟和写入的一样  不走

如果将0H.2  (CAL =1) 写入 进入校正模式  可以在链接到CAL/FPO 的引脚上检测到变化的脉冲信号  速率大概1HZ  应该时钟在走   为何在CAL=0 是我读不到变化的时钟数据

有人知道吗?

使用特权

评论回复
5
yoyowodeai| | 2010-4-28 22:06 | 只看该作者
电路图给出看看

使用特权

评论回复
6
金鱼木鱼| | 2010-4-28 22:06 | 只看该作者
为什么无法直接上传图纸

原理图





线路板:



使用特权

评论回复
7
S3C2440| | 2010-4-28 22:07 | 只看该作者
兄弟,弄好没啊?

用过铁电的兄弟们看看,有什么建议没啊?

使用特权

评论回复
8
linux1| | 2010-4-28 22:07 | 只看该作者
进入校正模式的时候,ACS引脚输出的应该是512HZ的频率吧?另外,建议用逻辑分析仪(如LA1032)看一下相关数据线的数据,这样可以预防程序中处理数据错误的可能性。

用备用电池的时候,注意应该先提供VDD,再装上电池(或者电容),次序不能反,正常情况下当VDD掉电后,通信口锁存数据,因此在掉电情况下不能正常通信,但是内部时钟仍然还是走到的,当VDD恢复后,再次读取数据就可以校验。

使用特权

评论回复
9
huzixian| | 2010-4-28 22:08 | 只看该作者
现在的问题就是,主电源供电时钟走的正常。当主电源掉电,我等一两分钟去读时间数据,还是我掉电的时候的时间值啊!如果一直加外部电源,时钟继续走。

使用特权

评论回复
10
LPC300| | 2010-4-28 22:08 | 只看该作者
我觉主要还是电源的原因,您换一个电池或者换成电容试一试吧。

使用特权

评论回复
11
六楼的窗户|  楼主 | 2010-4-28 22:10 | 只看该作者
对芯片进行重新初始化:

写1H=0

写0H=2 (0.1W=1)

写02-07= 00h,51h,21h,6h,08h,01h,08h

写0H=0

写1H=0

到了星期天晚上  读到的时间值  21时 53分 30秒    才走了2分多钟

电池我量了 一下  断电时3.4V左右  正常供电时 3.7V

使用特权

评论回复
12
maoyanketi| | 2010-4-28 22:10 | 只看该作者
期待楼主解决问题介绍经验!

使用特权

评论回复
13
六楼的窗户|  楼主 | 2010-4-28 22:11 | 只看该作者
电池我们已经换过,从钮扣电池到3.6V可充电电池,但是结果一样的,到VBAK时钟不走!

我觉得跟电池没多大关系的。

是否会有什么地方设置不对,导致切换到VBAK的时候振荡器停止。但是技术文档未见相关说明。

个人觉得相关人员可以测试一下,以给使用者一些指导。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

102

主题

497

帖子

0

粉丝