📄 twi.h
字号:
/*********************************************************************************************************
** TWI 驱动程序头文件
** (c) Copyright 2006-2008, limaokui
** All Rights Reserved
**
** V1.0.0
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名:TWI.h
**创 建 人: 李茂奎
**最后修改日期: 2006年8月29日
**描 述: TWI驱动程序头文件
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 李茂奎
** 版 本: V1.00
** 日 期: 2006年8月29日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
** 修改人: 李茂奎
** 版 本:
** 日 期:
** 描 述:
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 李茂奎
** 日 期: 2006年8月29日
** 描 述:
**
**------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
#ifndef __twi_H__
#define __twi_H__
/***********************************************/
//TWI状态定义
/***********************************************/
#define TW_START 0x08
#define TW_REP_START 0x10
//MT 主方式传输
#define TW_MT_SLA_ACK 0x18
#define TW_MT_SLA_NACK 0x20
#define TW_MT_DATA_ACK 0x28
#define TW_MT_DATA_NACK 0x30
#define TW_MT_ARB_LOST 0x38
//MR 主方式接收
#define TW_MR_ARB_LOST 0x38
#define TW_MR_SLA_ACK 0x40
#define TW_MR_SLA_NACK 0x48
#define TW_MR_DATA_ACK 0x50
#define TW_MR_DATA_NACK 0x58
//ST 从机方式传输
#define TW_ST_SLA_ACK 0xA8
#define TW_ST_ARB_LOST_SLA_ACK 0xB0
#define TW_ST_DATA_ACK 0xB8
#define TW_ST_DATA_NACK 0xC0
#define TW_ST_LAST_DATA 0xC8
//SR 从机方式接收 ALL 广播
#define TW_SR_SLA_ACK 0x60
#define TW_SR_ARB_LOST_SLA_ACK 0x68
#define TW_SR_GCALL_ACK 0x70
#define TW_SR_ARB_LOST_GCALL_ACK 0x78
#define TW_SR_DATA_ACK 0x80
#define TW_SR_DATA_NACK 0x88
#define TW_SR_GCALL_DATA_ACK 0x90
#define TW_SR_GCALL_DATA_NACK 0x98
#define TW_SR_STOP 0xA0
// 其他状态码
#define TW_NO_INFO 0xF8
#define TW_BUS_ERROR 0x00
// defines and constants
#define TWCR_CMD_MASK 0x0F
#define TWSR_STATUS_MASK 0xF8
/***********************************************/
//常用TWI操作(从模式写和从模式读)
/***********************************************/
//TWSR--Twi_状态寄存器,检查TWI状态,应该将预分频位屏蔽(第三位是保留位)
#define Test_Twsr() (TWSR&0xf8)
//查询模式下等待中断发生
#define Twi_WaitForComplete() {while(!(TWCR&(1<<TWINT)));}
//清除中断标志位,使能TWI功能,开放TWI中断,在主控接收状态下对SDA线作应答
#define Twi_Ack() TWCR=TWCR&TWCR_CMD_MASK|(1<<TWEA)|(1<<TWINT)
//清除中断标志位,使能TWI功能,开放TWI中断,在主控接收状态下不对SDA线作应答
#define Twi_NoAcK() TWCR=TWCR&TWCR_CMD_MASK|(1<<TWINT)
//写入8位数据到数据寄存器中,同时清除中断标志位,使能TWI功能
#define Twi_SendByte(x) {TWDR=(x);TWCR=TWCR&TWCR_CMD_MASK|(1<<TWINT);}
//清除中断标志位,在总线上发出终止信号,激活TWI功能,
#define Twi_Stop() TWCR=TWCR&TWCR_CMD_MASK|(1<<TWINT)|(1<<TWEA)|(1<<TWSTO)
//清除中断标志位,在总线上发出起始信号,激活TWI功能,开放TWI中断 注意是否自动产生ACK (TWEA)
#define Twi_Start() TWCR=TWCR&TWCR_CMD_MASK|(1<<TWINT)|(1<<TWSTA)
//设置本机地址(从机方式)
#define Twi_SetLocalDeviceAddr(deviceAddr, genCallEn) TWAR=((deviceAddr)&0xFE)|((genCallEn)&0x01)
//功能描述:返回总线状态
#define Twi_GetState() Twi_State
/***********************************************/
//Twi_工程常量预定义
/***********************************************/
#define TWI_OK 0x00
#define TWI_ERROR_NODEV 0x01
#define TWI_DATA_READY 0x03 //缓冲区为数据准备好
#define TWI_DATA_SEND 0x02 //缓冲区为发送模式
#define TWI_DATA_RECEIVE 0x01 //缓冲区为接收模式
#define TWI_DATA_FREE 0x00 //缓冲区为空闲模式
#define TWI_FAIL_MAX 20 //重试次数最大值
#define TWI_SEND_DATA_BUFFER_SIZE 5 //最大255
#define TWI_RECEIVE_DATA_BUFFER_SIZE 5 //最大255
#define TWI_LOCAL_DATA_BUFFER_SIZE 5 //最大255
/***********************************************/
//TWI信号量常量表
/***********************************************/
typedef enum
{
TWI_IDLE = 0, TWI_BUSY = 1,
TWI_MASTER_TX = 2, TWI_MASTER_RX = 3,
TWI_SLAVE_TX = 4, TWI_SLAVE_RX = 5
} eTwi_StateType;
extern CirQueue Twi_LocalBuffer;
/*********************************************************************************************************
** 函数名称:Twi_Init
** 功能描述:TWI总线初始化
** 输 入:
** 输 出:
** 全局变量:
** 调用模块: Twi_SetBitrate()
** 说明:
** 注意:
** 日 期: 2006年8月29日
********************************************************************************************************/
extern void Twi_Init(void);
/*********************************************************************************************************
** 函数名称:Twi_MasterSend
** 功能描述:主发送
** 输 入: deviceAddr:从机地址
** length:数据长度
** * data:发送缓冲区指针
**
** 输 出: 是否发送成功
** 全局变量:
** 调用模块:
** 说明:
** 注意:
** 日 期: 2006年8月29日
********************************************************************************************************/
extern uint8 Twi_MasterSend(uint8 deviceAddr, uint8 length, uint8* data);
/*********************************************************************************************************
** 函数名称:Twi_MasterReceive
** 功能描述:主模式接收
** 输 入: deviceAddr:从机地址
** length:数据长度
** * data 缓冲区指针
**
** 输 出:
** 全局变量:
** 调用模块:
** 说明:
** 注意:
** 日 期: 2006年8月29日
********************************************************************************************************/
extern uint8 Twi_MasterReceive(uint8 deviceAddr, uint8 length, uint8* data);
/*********************************************************************************************************
** 函数名称:Twi_MasterSendNI
** 功能描述:主模式非中断发送
** 输 入: deviceAddr:从机地址
** length:数据长度
** * data 缓冲区指针
** 输 出:
** 全局变量:
** 调用模块:
** 说明:
** 注意:
** 日 期: 2006年8月29日
********************************************************************************************************/
extern uint8 Twi_MasterSendNI(uint8 deviceAddr, uint8 length, uint8* data);
/*********************************************************************************************************
** 函数名称:主模式非中断接收
** 功能描述:
** 输 入: deviceAddr:从机地址
** length:数据长度
** * data 缓冲区指针
** 输 出:
** 全局变量:
** 调用模块:
** 说明:
** 注意:
** 日 期: 2006年8月29日
********************************************************************************************************/
extern uint8 Twi_MasterReceiveNI(uint8 deviceAddr, uint8 length, uint8 *data);
/*********************************************************************************************************
** 函数名称:Twi_SetSlaveReceiveHandler
** 功能描述:设置从接收函数句柄(此函数在被选中为从接收时执行)
** 输 入: void (*Twi_SlaveRx_func)(uint8 receiveDataLength, uint8* recieveData) :处理函数句柄
** 输 出:
** 全局变量:
** 调用模块:
** 说明:
** 注意:
** 日 期: 2006年8月29日
********************************************************************************************************/
extern void Twi_SetSlaveReceiveHandler(void (*Twi_SlaveRx_func)(uint8 receiveDataLength, uint8* recieveData));
/*********************************************************************************************************
** 函数名称:设置从发送函数句柄(此函数在被选中为从发送时执行)
** 功能描述:
** 输 入:
** 输 出:
** 全局变量:
** 调用模块:
** 说明:
** 注意:
** 日 期: 2006年8月29日
********************************************************************************************************/
extern void Twi_SetSlaveTransmitHandler(uint8 (*Twi_SlaveTx_func)(uint8 transmitDataLengthMax, uint8* transmitData));
#endif
/*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -