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

📄 twi.h

📁 avr 单片机twi源程序 功能:实现TWI主从机通讯.
💻 H
字号:
#ifndef __TWI_H__
#define __TWI_H__

#ifndef F_CPU
#define F_CPU 7372800  //晶振,注意有可能CONFIG.H里面已经定义的情况
#endif

#define TWI_MOD 1

//twi.h里面有定义,现附上中文描述

//主机发送状态码
#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 引起的总线错误


// 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


//-----------4个I2总线公用函数, 可供其它I2总线器件的程序调用--------------
extern void  i2c_start(void);	    //总线上起动开始条件
extern uint8 i2c_write(uint8 a);	//把一个字节数据输入器件, 返回TWI状态
extern uint8 i2c_read(void);		//i2c读
extern void  i2c_stop(void);		//总线上起动停止条件 
//------------------------------------------------------------------------

//发送给指定从机一个数据
//addr为从机地址,data数据
extern void i2c_maste_transt(uint8 addr, uint8 data);

//从从机地址读取一个数,输入地址,输出读到的数
extern uint8 i2c_maste_read(uint8 addr);

//初始化为主机
extern void twi_master_init(void);

//初始化为从机,输入ADD,从机地址
extern void twi_slave_init(uint8 add);
#endif

⌨️ 快捷键说明

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