⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iic.c

📁 PCF8563的驱动程序
💻 C
字号:
/******************************************************************************/
/**
/** 模 块 名: -------------------IIC.C--------------------------------------
/**            -----------------PCF8583实时时钟模块-------------------------*/
/** 功能描述: 
/**
/** 创 建 人: huangtiexiong   	日期:2006-11-28   */
/** 修 改 人:                 	日期:2006-11-28   */ 
/** 其他说明: 
/******************************************************************************/

#include "Includes.h"			//文件包含

/*************************************************
    模块级变量申明                 
*************************************************/

//…………模块级变量申明在这
static void 	IIC_Start(void);
static void 	IIC_Stop(void);
static void 	IIC_TxByte(int8u tx_byte);
static int8u 	IIC_RxByte(void);
static bool 	IIC_WaitAck(void);
static void 	IIC_SendAck(void);
static void 	IIC_SendNoAck(void);

/*************************************************
    子函数定义                  
*************************************************/

/*******************************************************************************
*** 函 数 名: static void IIC_Start(void)
*** 功能描述: 
*** 全局变量: NO !
*** 输		入: NO !
*** 输		出: NO !
*** 创 建 人:huangtiexiong			  日期:2006-11-28
*** 修 改 人:										日期:2006-11-28
*** 函数说明: Start IIC.
/******************************************************************************/
static void IIC_Start(void)
{
	EA = 0;			//关中断;
	SDA = 1;		//初始化总线;
	SCL = 1;		
	NOP();
	SDA = 0;		//启动总线;
	NOP();
	SCL = 0;		//准备数据发送,启动IIC之后传输线全部置0;
	}
/*******************************************************************************
*** 函 数 名: static void 	IIC_TxByte(int8u tx_byte)
*** 功能描述: 发送一个字节;
*** 全局变量: NO !
*** 输		入: tx_byte
*** 输		出: NO !
*** 创 建 人:huangtiexiong			  日期:2006-11-28
*** 修 改 人:										日期:2006-11-28
*** 函数说明: 操作完成后保证SCL为0;
/******************************************************************************/
static void 	IIC_TxByte(int8u tx_byte)
{//SDA:0; SCL:0.
	int8u i;
	for(i=0;i<8;i++)
	{
		if(tx_byte & 0x80)
			SDA = 1;					//因为Start函数中以把SCL拉低,数据直接发送;
		else 
			SDA = 0;
		tx_byte <<= 1;			//因为发送顺序:由Msb——>Lsb;
		SCL = 1;		
		NOP();		//延时;
		SCL = 0;		
		}
	}
/*******************************************************************************
*** 函 数 名: static bool 	IIC_WaitAck(void)
*** 功能描述: 发送一个字节;
*** 全局变量: NO !
*** 输		入: tx_byte
*** 输		出: NO !
*** 创 建 人:huangtiexiong			  日期:2006-11-28
*** 修 改 人:										日期:2006-11-28
*** 函数说明: 操作完成后保证SCL为0;
/******************************************************************************/
static bool 	IIC_WaitAck(void)
{//SDA:U; SCL:0.
	int8u waitTime = 0xff;		//设置Ack信号超时数;
	SDA = 1;		//将数据线拉高;
	SCL = 1;		//启动Ack脉冲;
	NOP();
	while(SDA)
	{
		waitTime--;
		if(!waitTime)
			{
				SCL = 0;		//SCL=0;
				IIC_Stop();
				return FALSE;
				}
		}
	SCL = 0;		//操作完成后确认SCL为0,此时SDA=0;
	return TRUE;	
	}
/*******************************************************************************
*** 函 数 名: static int8u 	IIC_RxByte(void)
*** 功能描述: 接收一个字节;
*** 全局变量: NO !
*** 输		入: NO !
*** 输		出: 接收字节:tmp
*** 创 建 人:huangtiexiong			  日期:2006-11-28
*** 修 改 人:										日期:2006-11-28
*** 函数说明: 操作完成后保证SCL为0;
/******************************************************************************/
static int8u 	IIC_RxByte(void)
{//SDA:0; SCL:0;
	int8u tmp = 0;
	int8u i;
	for(i=0;i<8;i++)
	{
		SCL = 0;
		SDA = 1;		//向I/O口写1后准备读入;
		NOP();
		SCL = 1;
		NOP();
		tmp <<= 1;
		if(SDA)
			{
				tmp |= 0x01;
				}
		}
	SCL = 0;		//SCL=0;
	return tmp;	
	}
/*******************************************************************************
*** 函 数 名: static void 	IIC_SendAck(void)
*** 功能描述: 发送应答信号;
*** 全局变量: NO !
*** 输		入: NO !
*** 输		出: NO !
*** 创 建 人:huangtiexiong			  日期:2006-11-28
*** 修 改 人:										日期:2006-11-28
*** 函数说明: 操作完成后保证SCL为0;
/******************************************************************************/
static void 	IIC_SendAck(void)
{
	SDA = 0;
	NOP();
	SCL = 1;
	NOP();
	SCL = 0;
	}
/*******************************************************************************
*** 函 数 名: static void 	IIC_SendNoAck(void)
*** 功能描述: 发送非应答信号;
*** 全局变量: NO !
*** 输		入: NO !
*** 输		出: NO !
*** 创 建 人:huangtiexiong			  日期:2006-11-28
*** 修 改 人:										日期:2006-11-28
*** 函数说明: 操作完成后保证SCL为0;
/******************************************************************************/
static void 	IIC_SendNoAck(void)
{
	SDA = 1;
	NOP();
	SCL = 1;
	NOP();
	SCL = 0;
	}
/*******************************************************************************
*** 函 数 名: static void 	IIC_Stop(void)
*** 功能描述: 终止IIC传输;
*** 全局变量: NO !
*** 输		入: NO !
*** 输		出: NO !
*** 创 建 人:huangtiexiong			  日期:2006-11-28
*** 修 改 人:										日期:2006-11-28
*** 函数说明: 操作完成后保证SCL为1,同时打开中断;
/******************************************************************************/
static void IIC_Stop(void)
{
	SDA = 0;		//to stop IIC;
	SCL = 0;
	NOP();
	SCL = 1;
	NOP();
	SDA = 1;		//IIC Stoped !! 结束IIC之后传输线全部置1;
	EA = 1;			//Set EA.
	}
/*******************************************************************************
*** 函 数 名: extern void PCF8583_ReadDat(int8u addrInter,int8u num,int8u *buff)
*** 功能描述: 对PCF8583读;
*** 全局变量: NO !
*** 输		入: addrInter:内部寻址;num:数据长度;buff:数据缓存;
*** 输		出: buff数据缓存;
*** 创 建 人:huangtiexiong			  日期:2006-11-28
*** 修 改 人:										日期:2006-11-28
*** 函数说明: IIC Start至Stop间传输的字节数不限;
							PCF8583内部寄存器地址附自增功能;
/******************************************************************************/
extern void PCF8583_ReadDat(int8u addrInter,int8u num,int8u *buff)
{
	int8u i;
	IIC_Start();			//启动IIC Bus;
	IIC_TxByte(0xa0);	//PCF8583设备寻址;命令:写;
	IIC_WaitAck();		//等待Ack信号;
	IIC_TxByte(addrInter);	//发送内部寄存器地址;
	IIC_WaitAck();					//等待Ack信号;
	
	IIC_Start();			//参考PCF读Read Mode时序;
	IIC_TxByte(0xa1);	//PCF8583设备寻址,命令:读;
	IIC_WaitAck();
	
	for(i=0;i<num-1;i++)
	{
		buff[i] = IIC_RxByte();	//读一个字节;
		IIC_SendAck();					//发送应答信号;
		}
	buff[num-1]	= IIC_RxByte();
	IIC_SendNoAck();					//最后一个字节发送非应答信号;
	IIC_Stop();		//终止本次传输,IIC Bus空闲;
	}
/*******************************************************************************
*** 函 数 名: extern void PCF8583_WriteDat(int8u addrInter,int8u num,int8u *buff)
*** 功能描述: 对PCF8583写;
*** 全局变量: NO !
*** 输		入: addrInter:内部寻址;num:数据长度;buff:数据缓存;
*** 输		出: NO !
*** 创 建 人:huangtiexiong			  日期:2006-11-28
*** 修 改 人:										日期:2006-11-28
*** 函数说明: IIC Start至Stop间传输的字节数不限;
							PCF8583内部寄存器地址附自增功能;
/******************************************************************************/
extern void PCF8583_WriteDat(int8u addrInter,int8u num,int8u *buff)
{
	int8u i;
	
	IIC_Start();
	IIC_TxByte(0xa0);
	IIC_WaitAck();
	
	IIC_TxByte(addrInter);
	IIC_WaitAck();
	
	for(i=0;i<num;i++)
	{
		IIC_TxByte(buff[i]);
		IIC_WaitAck();
		}
	
	IIC_Stop();
	}
/*******************************************************************************
*** 函 数 名: extern void PCF8583_WriteByte(int8u addrInter,int8u val)
*** 功能描述: 对PCF8583写一个字节;
*** 全局变量: NO !
*** 输		入: addrInter:内部寻址;val:待写字节数据;
*** 输		出: NO !
*** 创 建 人:huangtiexiong			  日期:2006-11-28
*** 修 改 人:										日期:2006-11-28
*** 函数说明: 参照PCF8583读时序;
/******************************************************************************/
extern void PCF8583_WriteByte(int8u addrInter,int8u val)
{
	IIC_Start();
	
	IIC_TxByte(0xa0);
	IIC_WaitAck();
	
	IIC_TxByte(addrInter);
	IIC_WaitAck();
	IIC_TxByte(val);
	IIC_WaitAck();
  
	IIC_Stop();
	}

extern void PCF8583_Init(void)
{
	PCF8583_WriteByte(0x00,0x00);		//Control reg. Alarm disabled。
}

/*******************************************************************************
****                              End Of File
*******************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -