向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 );
}
}
|