📄 x1228.c
字号:
/**************************************** ***********************************************
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: X1228.C
**创 建 人:
**最后修改日期:
**描 述: X1228库函数程序
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "config.h"
#define X1228_CCR 0xde //11011110B X1228时钟寄存器从地址
#define X1228_ROM 0xae
extern uint8 bp;
#define SDAOut_1 IO0DIR = IO0DIR | 0x00000008; IO0SET = IO0SET | 0x00000008 //SDA置1 P0.3
#define SDAOut_0 IO0DIR = IO0DIR | 0x00000008; IO0CLR = IO0CLR | 0x00000008 //SDA清0
#define SCLOut_1 IO0DIR = IO0DIR | 0x00000004; IO0SET = IO0SET | 0x00000004 //SCL置1 P0.2
#define SCLOut_0 IO0DIR = IO0DIR | 0x00000004; IO0CLR = IO0CLR | 0x00000004 //SCL清0
#define SDAIn IO0DIR = IO0DIR & 0xfffffff7 //Set SDA input mode
/*********************************************************************************************************
** 函数名称: NOP
** 功能描述: 延时程序
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
** 日 期:
** 注: 仅限于本文件使用
*********************************************************************************************************/
void NOP(uint32 dly)
{ uint32 i; ;
for(; dly>0; dly--);
if(bp == 0)
{
for(i=2000;i>0;i--);
}
}
/*********************************************************************************************************
** 函数名称: X1228_Start
** 功能描述: X1228 I2C起始条件
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
** 日 期:
*********************************************************************************************************/
void X1228_Start(void)
{
SDAOut_1;
NOP(20);
SCLOut_1;
NOP(20);
SDAOut_0;
NOP(20);
SCLOut_0;
NOP(20);
}
/*********************************************************************************************************
** 函数名称: X1228_Stop
** 功能描述: X1228 I2C结束条件
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
** 日 期:
*********************************************************************************************************/
void X1228_Stop(void)
{
SCLOut_0;
NOP(10);
SDAOut_0;
NOP(10);
SCLOut_1;
NOP(10);
SDAOut_1;
NOP(10);
}
/*********************************************************************************************************
** 函数名称: X1228_SAck
** 功能描述: X1228 I2C发送ACK信号
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
** 日 期:
*********************************************************************************************************/
void X1228_SAck(void)
{
SDAOut_0;
NOP(10);
SCLOut_1;
NOP(10);
SCLOut_0;
NOP(10);
}
/*********************************************************************************************************
** 函数名称: X1228_SNAck
** 功能描述: X1228 I2C发送NACK信号
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
** 日 期:
*********************************************************************************************************/
void X1228_SNAck(void)
{
SDAOut_1;
NOP(10);
SCLOut_1;
NOP(10);
SCLOut_0;
NOP(10);
}
/*********************************************************************************************************
** 函数名称: X1228_SendByte
** 功能描述: X1228 I2C发送字节
** 输 入: 发送字节数据
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
** 日 期:
*********************************************************************************************************/
uint8 X1228_SendByte(uint8 ch)
{uint8 i=8;
uint8 j=8;
while (i--)
{
if (ch & 0x80)
{
SDAOut_1;
}
else
{
SDAOut_0;
} //SDA=(bit)(ch&0x80);
ch<<=1;
NOP(15);
SCLOut_1;
NOP(20);
SCLOut_0;
NOP(15);
}
SDAOut_1;
SDAIn;
NOP(10);
SCLOut_1;
for (i=0;i<8;i++)
{
NOP(15);
j = IO0PIN & 0x00000008;
if (j == 0)
{
SCLOut_0;
return 1;
}
}
SCLOut_0;
return 0;
}
/*********************************************************************************************************
** 函数名称: X1228_RcvByte
** 功能描述: X1228 I2C接收字节
** 输 入: 无
** 输 出: 接收字节数据
** 全局变量: 无
** 调用模块: 无
** 日 期:
*********************************************************************************************************/
uint8 X1228_RcvByte(void)
{
uint8 i = 8;
uint8 j = 0;
uint8 rcv_data=0;
SDAIn;
while (i--)
{
rcv_data <<= 1;
SCLOut_0;
NOP(20);
SCLOut_1;
NOP(20);
j = IO0PIN & 0x00000008;
if (j == 0x00000008)
{
rcv_data|=1;
}
}
SCLOut_0;
return rcv_data;
}
/*********************************************************************************************************
** 函数名称: X1228_SendStr16
** 功能描述: X1228 I2C发送多字节
* 入口参数: sla 器件地址
* suba 16位器件子地址
* s 数据发送缓冲区指针
* no 写数据个数
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
** 日 期:
*********************************************************************************************************/
uint8 X1228_SendStr16(uint8 sla,uint16 suba,uint8 *s,uint8 no)
{uint8 i;
X1228_Start(); //启动开始条件
if(X1228_SendByte(sla) == 0) return 0; //发送从地址
if(X1228_SendByte(suba/256) == 0) return 0; //发送从地址高位
if(X1228_SendByte(suba%256) == 0) return 0; //发送从地址低位
for (i = 0;i<no;i++,s++)
{
if(X1228_SendByte(*s)==0) return 0; //发送数据
}
X1228_Stop(); //发结束信号
return 1;
}
/*********************************************************************************************************
** 函数名称: X1228_RcvStr16
** 功能描述: X1228 I2C接收多字节
* 入口参数: sla 器件地址
* suba 16位器件子地址
* s 数据接收缓冲区指针
* no 读数据个数
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
** 日 期:
*********************************************************************************************************/
uint8 X1228_RcvStr16(uint8 sla,uint16 suba,uint8 *s,uint8 no)
{uint8 i;
i = (no==0)||(no>32);
if(i == 1)
{
return 0;
}
X1228_Start(); //启动开始条件
if(X1228_SendByte(sla)==0) return 0; //发送从地址
if(X1228_SendByte(suba/256)==0) return 0; //发送从地址高位
if(X1228_SendByte(suba%256)==0) return 0; //发送从地址低位
X1228_Start(); //重复启动开始条件
if(X1228_SendByte(sla+1)==0) return 0; //发送读命令
for (i=0;i<no;i++,s++)
{
*s=X1228_RcvByte(); //接收字节数据
if (i!=no-1) X1228_SAck(); //除最后一个字节外,其他都要从MASTER发应答。
}
X1228_SNAck(); //发送非应答信号
X1228_Stop(); //发结束信号
return 1;
}
/*********************************************************************************************************
** 函数名称: X1228_CCRWR
** 功能描述: X1228 CCR写操作
** 输 入: SubAdd : CCR数据写入寄存器地址
** *data_buf: 要发送数据的起始地址
** num : 发送个数
** 输 出: 无
** 全局变量: 无
** 调用模块: ISendStr16
** 日 期:
*********************************************************************************************************/
void X1228_CCRWR(uint16 SubAdd,uint8 *data_buf,uint8 num)
{uint8 wel=2,rwel=6;
X1228_SendStr16(X1228_CCR,0x003f,&wel,1);
NOP(1000);
X1228_SendStr16(X1228_CCR,0x003f,&rwel,1); //建立写条件
NOP(1000);
X1228_SendStr16(X1228_CCR,SubAdd,data_buf,num);
}
/*********************************************************************************************************
** 函数名称: X1228_CCRRD
** 功能描述: X1228 CCR读操作
** 输 入: SubAdd : CCR数据读入寄存器地址
** *data_buf: 要接收数据的起始地址
** num : 接收个数
** 输 出: 无
** 全局变量: 无
** 调用模块: IRcvStr16
** 日 期:
*********************************************************************************************************/
void X1228_CCRRD(uint16 SubAdd,uint8 *data_buf,uint8 num)
{
X1228_RcvStr16(X1228_CCR,SubAdd,data_buf,num);
}
/*********************************************************************************************************
** 函数名称: X1228_WP
** 功能描述: X1228写保护操作--关看门狗、开/关EEPROM写保护、1Hz输出
** 输 入: WP_en: 0不写保护、1写保护
** 输 出: 无
** 全局变量: 无
** 调用模块: X1228_CCRRD
** 日 期:
*********************************************************************************************************/
void X1228_WP(uint8 WP_en)
{
uint8 dat[1]={0x18}; //#00011000B--BP2/BP1/BP0/WD1/WD0 关写保护关看门狗
uint8 wel=2,rwel=6;
X1228_SendStr16(X1228_CCR,0x003f,&wel,1);
NOP(1000);
X1228_SendStr16(X1228_CCR,0x003f,&rwel,1); //建立写条件
NOP(2000);
if(WP_en != 0)
{
dat[0]=0x78; //#01111000B--BP2/BP1/BP0/WD1/WD0 开写保护关看门狗
}
X1228_SendStr16(X1228_CCR,0x0010,dat,1);
}
/*********************************************************************************************************
** 函数名称: X1228_TIMEWR
** 功能描述: X1228写日期、时间
** 输 入: *date_time: 日期/时间数组缓冲区首地址
** 输 出: 无
** 全局变量: 无
** 调用模块: ISendStr16
** 日 期:
*********************************************************************************************************/
void X1228_TIMEWR(uint8 *time_buf)
{
X1228_CCRWR(0x0030,time_buf,7);
}
/*********************************************************************************************************
** 函数名称: X1228_TIMERD
** 功能描述: X1228读日期、时间
** 输 入: *date_time: 日期/时间数组缓冲区首地址
** 输 出: 无
** 全局变量: 无
** 调用模块: ISendStr16
** 日 期:
*********************************************************************************************************/
void X1228_TIMERD(uint8 *time_buf)
{
X1228_CCRRD(0x0030,time_buf,8);
}
/*********************************************************************************************************
** 函数名称: X1228_ROMWR
** 功能描述: X1228 EEPROM写操作
** 输 入: SubAdd : 数据写入存储器地址
** *data_buf: 要发送数据的起始地址
** num : 发送个数
** 输 出: 无
** 全局变量: 无
** 调用模块: ISendStr16
** 日 期:
*********************************************************************************************************/
void X1228_ROMWR(uint16 SubAdd,uint8 *data_buf,uint8 num)
{
X1228_WP(0); //关闭写保护
X1228_SendStr16(X1228_ROM,SubAdd,data_buf,num);
}
/*********************************************************************************************************
** 函数名称: X1228_ROMRD
** 功能描述: X1228 ROM读操作
** 输 入: SubAdd : ROM数据读入寄存器地址
** *data_buf: 要接收数据的起始地址
** num : 接收个数
** 输 出: 无
** 全局变量: 无
** 调用模块: IRcvStr16
** 日 期:
*********************************************************************************************************/
void X1228_ROMRD(uint16 SubAdd,uint8 *data_buf,uint8 num)
{
X1228_RcvStr16(X1228_ROM,SubAdd,data_buf,num);
}
/*********************************************************************************************************
** 函数名称: X1228_ini
** 功能描述: X1228日期、时间初始化、关写保护看门狗
** 输 入: *date_time: 日期/时间数组缓冲区首地址
** 输 出: 无
** 全局变量: 无
** 调用模块: ISendStr16
** 日 期:
*********************************************************************************************************/
void X1228_ini(uint8 *time_buf)
{
X1228_CCRWR(0x0030,time_buf,8);
X1228_WP(0); //关闭写保护
}
/*********************************************************************************************************
** 函数名称: X1228_start
** 功能描述: X1228时钟启动
** 输 入: *date_time: 日期/时间数组缓冲区首地址
** 输 出: 无
** 全局变量: 无
** 调用模块: ISendStr16
** 日 期:
*********************************************************************************************************/
void X1228_start(void)
{
uint8 tmp=0x20;
X1228_CCRWR(0x0037,&tmp,1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -