📄 iic.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 + -