📄 twi_8563._h
字号:
/*******************************************
* PCF8563的I2C(TWI)操作函数 *
* 文 件 名:TWI_8563.h *
* 函数功能:利用CPU的硬件TWI接口操作 *
* 设 计:铜河 *
* 修改日期:2007年04月09日 *
* 版 本:V1.0 *
* 主控芯片:Mega16 *
*******************************************/
#include <iom16v.h>
#include <macros.h>
//宏定义
//状态寄存器TWSR各种状态定义
//主模式启动状态
#define START 0x08 //启动总线
#define RESTART 0x10 //重新启动总线
//主发送模式各种状态
#define MT_SLA_ACK 0x18 //SLA_W写地址已发送,收到应答位
#define MT_SLA_NACK 0x20 //SLA_W写地址已发送,收到非应答位
#define MT_DATA_ACK 0x28 //写入数据已发送,收到应答位
#define MT_DATA_NACK 0x30 //写入数据已发送,收到应答位
#define MT_ARB_LOST 0x38 //SLA_W或数据仲裁失败
//主接收模式各种状态
#define MR_ARB_LOST 0x38 //
#define MR_SLA_ACK 0x40 //SLA_R已发送,收到应答位
#define MR_SLA_NACK 0x48 //SLA_R已发送,收到非应答位
#define MR_DATA_ACK 0x50 //接收到数据,应答位已返回
#define MR_DATA_NACK 0x58 //接收到数据,非应答位已返回
#define SLA_W 0xA2 //PCF8563写从地址
#define SLA_R 0xA3 //PCF8563读从地址
#define start() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))
#define stop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))
#define waitack() {while(!(TWCR&(1<<TWINT)));}
#define chkack() (TWSR&0xf8) //check ack
#define sendack() (TWCR|=(1<<TWEA))
#define sendnack() (TWCR&=~(1<<TWEA))
#define sendbyte(x) {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);}
#define rcvnckbyte() (TWCR=(1<<TWINT)|(1<<TWEN))
#define rcvackbyte() (TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWEA))
/* I2C Config */
#define I2C_ERR 0
#define I2C_CRR 1
//简化宏定义
#define uchar unsigned char
#define uint unsigned int
//TWI初始化
void Twi_Init(void)
{
TWBR=14;
TWSR=0;
}
//写入时间函数
void write_tim(uchar a)
{
sendbyte(a); //发送
waitack(); //等待写完成
if(chkack()!=MT_SLA_ACK)I2C_ERR; //检查是否正确写入
// else return I2C_CRR;
}
//读出时间函数
uchar read_tim(void)
{
rcvackbyte(); //接收一字节并返回应答
waitack(); //等待接收完成
if(chkack()!=MR_DATA_ACK)I2C_ERR; //检查是否接收成功
// return I2C_ERR;
// else
return(TWDR); //读出时钟数据
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -