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

📄 twi.h

📁 iic for avr very good
💻 H
字号:
//ICC-AVR application builder : 2007-1-9 15:50:41
// Target : M8
// Crystal: 8.0000Mhz
#ifndef _TWI_H
#define _TWI_H
#define uchar unsigned char


//
//TWI_操作状态
#define TW_BUSY				0
#define TW_OK				1
#define TW_FAIL				2
//TWI_读写命令状态
#define OP_BUSY				0
#define OP_RUN				1


//TWI读写操作公共步骤
#define ST_FAIL				0	//出错状态
#define ST_START			1	//START状态检查
#define ST_SLAW				2	//SLAW状态检查
#define ST_WADDR			3	//ADDR状态检查
//TWI读操作步骤
#define ST_RESTART			4	//RESTART状态检查
#define ST_SLAR				5	//SLAR状态检查
#define ST_RDATA			6	//读取数据状态检查,循环n字节
//TWI写操作步骤
#define ST_WDATA			7	//写数据状态检查,循环n字节

#define FAIL_MAX			20	//重试次数最大值

//主机发送状态码
#define TW_START			    0x08	//START已发送
#define TW_REP_START			0x10	//重复START已发送
#define TW_MT_SLA_ACK			0x18	//SLA+W 已发送收到ACK
#define TW_MT_SLA_NACK			0x20	//SLA+W 已发送接收到NOT ACK
#define TW_MT_DATA_ACK			0x28	//数据已发送接收到ACK
#define TW_MT_DATA_NACK			0x30	//数据已发送接收到NOT ACK
#define TW_MT_ARB_LOST			0x38	//SLA+W 或数据的仲裁失败

//主机接收状态码
//#define TW_START			    0x08	//START已发送
//#define TW_REP_START			0x10	//重复START已发送
#define TW_MR_ARB_LOST			0x38	//SLA+R 或NOT ACK 的仲裁失败
#define TW_MR_SLA_ACK			0x40	//SLA+R 已发送接收到ACK
#define TW_MR_SLA_NACK			0x48	//SLA+R 已发送接收到NOT ACK
#define TW_MR_DATA_ACK			0x50	//接收到数据ACK 已返回
#define TW_MR_DATA_NACK			0x58	//接收到数据NOT ACK已返回

//从机接收状态码
#define TW_SR_SLA_ACK			0x60	//自己的SLA+W 已经被接收ACK已返回
#define TW_SR_ARB_LOST_SLA_ACK	0x68	//SLA+R/W 作为主机的仲裁失败;自己的SLA+W 已经被接收ACK 已返回
#define TW_SR_GCALL_ACK			0x70	//接收到广播地址ACK 已返回
#define TW_SR_ARB_LOST_GCALL_ACK 0x78	//SLA+R/W 作为主机的仲裁失败;接收到广播地址ACK已返回
#define TW_SR_DATA_ACK			0x80	//以前以自己的SLA+W被寻址;数据已经被接收ACK已返回
#define TW_SR_DATA_NACK			0x88	//以前以自己的SLA+W被寻址;数据已经被接收NOT ACK已返回
#define TW_SR_GCALL_DATA_ACK	0x90	//以前以广播方式被寻址;数据已经被接收ACK已返回
#define TW_SR_GCALL_DATA_NACK	0x98	//以前以广播方式被寻址;数据已经被接收NOT ACK已返回
#define TW_SR_STOP				0xA0	//在以从机工作时接收到STOP或重复START
 
//从发送状态码
#define TW_ST_SLA_ACK			0xA8	//自己的SLA+R 已经被接收ACK 已返回
#define TW_ST_ARB_LOST_SLA_ACK	0xB0	//SLA+R/W 作为主机的仲裁失败;自己的SLA+R 已经被接收ACK 已返回
#define TW_ST_DATA_ACK			0xB8	//TWDR 里数据已经发送接收到ACK
#define TW_ST_DATA_NACK			0xC0	//TWDR 里数据已经发送接收到NOT ACK
#define TW_ST_LAST_DATA			0xC8	//TWDR 的一字节数据已经发送(TWAE = “0”);接收到ACK
 
 
//其它状态码
#define TW_NO_INFO				0xF8	//没有相关的状态信息;TWINT = “0”
#define TW_BUS_ERROR			0x00	//由于非法的START 或STOP 引起的总线错误

//
#define TW_READ  0X01
#define TW_WRITE 0X00
#define TW_ACT				(1<<TWINT)|(1<<TWEN)|(1<<TWIE)
//TWCR只能IN/OUT,直接赋值比逻辑运算(|= &=)更节省空间


//


#endif


struct str_TWI									//TWI数据结构
{
    volatile unsigned char	STATUS;				//TWI_操作状态
    unsigned char	SLA;						//从设备的器件地址
                                                // unsigned int	ADDR;//从设备的数据地址
    unsigned char	*pBUF;						//数据缓冲区指针
    unsigned char	DATALEN;					//数据长度
    unsigned char	STATE;						//TWI读写操作步骤
    unsigned char	FAILCNT;					//失败重试次数
};

extern struct str_TWI  strTWI;							//TWI的数据结构变量

//定义全局变量
extern unsigned char ORGDATA[8];	                 //原始数据
extern unsigned char CMPDATA[8];	                 //比较数据
extern void twi_init(void);

extern unsigned char TWI_RW(unsigned char sla_rw,unsigned char *ptr,unsigned char len);


⌨️ 快捷键说明

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