📄 x5045.c
字号:
/*========================================================/
/ /
/ Copyright (C), 2001-2005, Pangu Automation. Co., Ltd. /
/ FileName: X5045.c /
/ Author: Zheng M.D. /
/ Version: 1.0 /
/ Date: 2005.11.12 /
/ Description: X5045驱动程序 /
/ Modify: /
/ /
/========================================================*/
#include <reg52.h>
#include "include\DataProces.h"
#include "include\time.h"
#include "include\x5045.h"
//////////////////////////////////////////////////////
//extern PRODUCESETING xdata SYSTEMCONFIG;
//extern TRANFORMGLOBAL xdata SYSTEMINI;
extern CALIPARAM idata pHCaliParam;
extern TRANSMISSION idata TransData;
/*************************************************
//函 数 名: wbyte_wdt()
//功 能: 向x5045写入1Byte数据 (内部函数)
//输入参数: w_byte(写入的数据)
//返 回 值: 无
*************************************************/
static void wbyte_wdt(unsigned char w_byte)
{
unsigned char i;
for(i = 0; i < 8; ++i)
{
__WDTSCK = 0;
if(w_byte & 0x80)
{
__WDTMOSI = 1; /* set port pin high to read data */
}
else
{
__WDTMOSI = 0;
}
__WDTSCK = 1;
w_byte <<= 1;
}
}
/*************************************************
//函 数 名: rbyte_wdt()
//功 能: 从x5045中读取1 byte数据
//输入参数: 无
//返 回 值: r_byte(读出的数据)
*************************************************/
static unsigned char rbyte_wdt(void)
{
unsigned char i, r_byte;
//释放数据总线
__WDTMISO = 1;
r_byte=0;
for(i=0; i<8; ++i)
{
//下降延送出数据
__WDTSCK = 1;
__WDTSCK = 0;
//最高位在前
r_byte <<= 1;
if (__WDTMISO)
{
r_byte |= 0x01;
}
}
return r_byte;
}
/*************************************************
//函 数 名: IfBusyX5045()
//功 能: 判忙5045芯片
//输入参数: 无
//返 回 值: 无
*************************************************/
void IfBusyX5045(void)
{
unsigned char i;
__WDTCS = 0; //打开x5045
for(i = 0; i < 100; i++)
{
wbyte_wdt(WDT_RSDR); //读状态字
if(!(rbyte_wdt() & 0x01)) // = 0,不忙
break;
}
__WDTCS = 1; //关闭x5045
// __WDTCS = 0; //打开x5045
}
/*************************************************
//函 数 名: WriteX5045()
//功 能: 写入x5045内部数据
//输入参数: addr(数据写入的地址),sdata(数据源指针),
len(写入数据的数量)
//返 回 值: 无
*************************************************/
void WriteX5045(short addr, unsigned char* sdata, unsigned char len)
{
char i;
if(addr >= 512 || len == 0) //x5045容量为512字节,写入长度为0字节
return;
while(addr < 512)
{
__WDTCS = 0; //打开x5045
wbyte_wdt(WDT_WREN); //打开写使能
__WDTCS = 1; //关闭x5045
__WDTCS = 0; //打开x5045
//写入多字节指令,判断地址在上半区还是下半区
wbyte_wdt((addr >= 256) ? (WDT_WRITE | 0x08) : WDT_WRITE);
//写入地址
wbyte_wdt((char)(addr % 256));
//写入数据,16个字节为一包
for(i = 0; i <= 16; i++)
{
wbyte_wdt(*sdata); //写数据
sdata ++; //数据指针+1
addr ++; //地址+1
len --; //剩余数据数量-1
//判断停止传输数据条件
if(len == 0 || addr >= 512)
{
__WDTCS = 1; //关闭x5045
IfBusyX5045(); //等待写入
return;
}
//判断x5045的页是否到头(16字节/每页)
if((addr & 0x000F) == 0)
{
__WDTCS = 1; //关闭x5045
IfBusyX5045(); //等待写入
break;
}
}
}
}
/*************************************************
//函 数 名: ReadX5045()
//功 能: 读取x5045内部数据
//输入参数: addr(数据读取的地址),sdata(目标数据指针),
len(读取数据的数量)
//返 回 值: 无
*************************************************/
void ReadX5045(short addr, unsigned char* sdata, unsigned char len)
{
if(addr >= 512 || len == 0) //x5045容量为512字节,写入长度为0字节
return;
__WDTCS = 0; //打开x5045
//读取多字节指令,判断地址在上半区还是下半区
wbyte_wdt((addr >= 256) ? (WDT_READ | 0x08) : WDT_READ);
//写入读取地址
wbyte_wdt((char)(addr % 256));
//读取数据
for(; len > 0; len --)
{
*sdata = rbyte_wdt(); //读取数据
sdata ++; //数据指针+1
addr ++; //地址+1
//判断停止传输数据条件,读取地址超出范围
if(addr >= 512)
{
__WDTCS = 1; //关闭x5045
return;
}
}
//数据读取完毕
__WDTCS = 1; //关闭x5045
return;
}
/*************************************************
//函 数 名: ResetWDT()
//功 能: 喂狗
//输入参数: 无
//返 回 值: 无
*************************************************/
void ResetWDT(void)
{
__WDTCS = 0; //打开x5045
delay_us(2); //打开写使能
__WDTCS = 1; //关闭x5045
}
/*************************************************
//函 数 名: X5045_Start()
//功 能: 初始化时钟芯片
//输入参数: 无
//返 回 值: 无
*************************************************/
void X5045_Start(void)
{
__WDTCS = 0; //打开x5045
wbyte_wdt(WDT_WREN); //打开写使能
__WDTCS = 1; //关闭x5045
__WDTCS = 0; //打开x5045
wbyte_wdt(WDT_WRSR); //写状态字
wbyte_wdt(0x00); //,打开wdt
__WDTCS = 1; //关闭x5045
}
/*************************************************
//函 数 名: X5045_Stop()
//功 能: 初始化时钟芯片
//输入参数: 无
//返 回 值: 无
*************************************************/
void X5045_Stop(void)
{
__WDTCS = 0; //打开x5045
wbyte_wdt(WDT_WREN); //打开写使能
__WDTCS = 1; //关闭x5045
__WDTCS = 0; //打开x5045
wbyte_wdt(WDT_WRSR); //写状态字
wbyte_wdt(0x30); //关闭wdt
__WDTCS = 1; //关闭x5045
}
/*************************************************
//函 数 名: PutDataConfig()
//功 能: 写入标定数据
//输入参数: 无
//返 回 值: 无
*************************************************/
void PutCaliParam(void)
{
//获取标定数据指针
unsigned char* sdata =(unsigned char*) &pHCaliParam;
//写入数据
WriteX5045(0x0000, sdata, sizeof(CALIPARAM));
}
/*************************************************
//函 数 名: GetDataConfig()
//功 能: 读取标定数据
//输入参数: 无
//返 回 值: 无
*************************************************/
void GetCaliParam(void)
{
//获取标定数据指针
unsigned char* sdata = (unsigned char*) &pHCaliParam;
//读取数据
ReadX5045(0x0000, sdata, sizeof(CALIPARAM));
pHCaliParam.Mode =MODE_PH_ATC;
pHCaliParam.pHOnlineLower =pHCaliParam.pHLower ;
pHCaliParam.pHOnlineUpper =pHCaliParam.pHUpper ;
pHCaliParam.OrpOnlineLower=pHCaliParam.pHLower ;
pHCaliParam.OrpOnlineUpper=pHCaliParam.pHUpper ;
}
/*************************************************
//函 数 名: GetSYSConfig()
//功 能: 读取系统参数
//输入参数: 无
//返 回 值: 无
************************************************
void GetSYSConfig(void)
{
//unsigned char *sdata = &SYSTEMCONFIG;
//
//ReadX5045(0x0100,sdata,sizeof(PRODUCESETING));
}*/
/*************************************************
//函 数 名: PutSYSConfig()
//功 能: 写入系统参数
//输入参数: 无
//返 回 值: 无
************************************************
void PutSYSConfig(void)
{
//unsigned char *sdata = &SYSTEMCONFIG;
//WriteX5045(0x0100,sdata,sizeof(PRODUCESETING));
}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -