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

📄 i2c.c

📁 简单的在ATMEGA64上移植ucosII
💻 C
字号:
#define _I2C_C_
#include <include.h>
// 发送STOP信号
void TwiStop(void)
{
	TWCR = ((1 << TWINT) | (1 << TWSTO) | (1 << TWEN));
}
//---------------------
void TwiStart(void)
{
	TWCR = ((1 << TWINT) | (1 << TWSTA) | (1 << TWEN));
	while((TWCR	& (1 <<	TWINT))	== 0)
	{
		;
	}
}
//-------------------------------
uint8 TwiWriteByte(uint8 addr, uint8 data)
{
	TwiStart();									// 发送开始信号
	if((TWSR & 0xf8) ==	0x08)					// 确认状态
	{
		TWDR = addr;							// 发送地址
		//TWCR = (1 << TWINT)	| (1 << TWEN);		// 启动发送
		TWCR = (1 << TWINT) | (1 << TWEN);
		while((TWCR	& (1 <<	TWINT))	== 0)		// 等待发送成功
		{	
			;
		}
		
		if((TWSR & 0xf8) ==	0x18)				// 确认状态
		{
			TWDR = data;						// 发送数据
			//TWCR = (1 << TWINT)	| (1 << TWEN);	// 启动发送
			TWCR = (1 << TWINT) | (1 << TWEN);
			while((TWCR	& (1 <<	TWINT))	== 0)	// 等待发送成功
			{	
				;
			}	  
		}
		else
		{
			return 0;	 
		} 
		
		if((TWSR & 0xf8) ==	0x28)				// 确认状态
		{
			TwiStop();							// 发送停止信号
			return 1;	
		} 
		else
		{
			return 0;	 
		}	  
	} 
	return 0;
//	else
//	(
//		return 0;
//	)
}
//-------------------------------------------------------
uint8 TwiWriteStr(uint8	addr, uint8	*data, uint8 len)   // 地址指针自动加1
{
	uint8 i	= 0;
	if(len != 0)
	{
		TwiStart();									// 发送开始信号
		if((TWSR & 0xf8) ==	0x08)					// 确认状态
		{
			TWDR = addr;							// 发送地址
			//TWCR = (1 << TWINT)	| (1 << TWEN);		// 启动发送	
			TWCR = (1 << TWINT) | (1 << TWEN);
			while((TWCR	& (1 <<	TWINT))	== 0)		// 等待发送成功
			{	
				;
			}
			if((TWSR & 0xf8) ==	0x18)				// 确认状态
			{
				TWDR = *data++;						// 发送数据
				//TWCR = (1 << TWINT)	| (1 << TWEN);	// 启动发送	
				TWCR = (1 << TWINT) | (1 << TWEN);  
				while((TWCR	& (1 <<	TWINT))	== 0)	// 等待发送成功
				{	
					;
				}  
			}
			else
			{
				return 0;	 
			} 
			
			for(i =	len-1; i > 0; i--)
			{
				if((TWSR & 0xf8) ==	0x28)				// 确认状态
				{
					TWDR = *data++;						// 继续发送数据
					//TWCR = (1 << TWINT)	| (1 << TWEN);	
					TWCR = (1 << TWINT) | (1 << TWEN);
					while((TWCR	& (1 <<	TWINT))	== 0)
					{	
						;
					}	 
				}
				else
				{
					return 0;	 
				} 
			}		
		
			if((TWSR & 0xf8) ==	0x28)				// 确认状态
			{
				TwiStop();							// 发送停止信号	
				return 1;	
			} 
			else
			{
				return 0;	 
			}	  
		} 
		//else
		//(
			return 0;
		//)
	}
	return 0;
}
//---------------------------------
uint8 TwiReadStr(uint8 addr, uint8 *data, uint8	len)    // 地址指针自动加1
{
	uint8 i	= 0;
	if(len != 0)
	{
		TwiStart();									// 发送开始信号
		if((TWSR & 0xf8) ==	0x08)					// 确认状态
		{
			TWDR = addr;							// 发送地址
			TWCR = (1 << TWINT)	| (1 <<	TWEN);	   // 启动发送 
			while((TWCR	& (1 <<	TWINT))	== 0)		// 等待发送成功
			{	
				;
			}
			if((TWSR & 0xf8) ==	0x40)				// 确认状态
			{
				for(i =	len-1; i > 0; i--)
				{
					TWCR = (1 << TWINT)	| (1 <<	TWEA) |	(1 << TWEN); //	启动发送 返回 ACK  
					while((TWCR	& (1 <<	TWINT))	== 0)	// 等待发送成功
					{	
						;
					}
					
					if((TWSR & 0xf8) ==	0x50)				// 确认状态
					{
						*data++	= TWDR;						// 继续接收数据	   
					}
					else
					{
						return 0;	 
					} 
				}  
			}
			else
			{
				return 0;	 
			} 
			//TWCR = (1 << TWINT)	| (1 << TWEN);		// 返回	NOT	ACK
			TWCR = (1 << TWINT) | (1 << TWEN);
			if((TWSR & 0xf8) ==	0x58)				// 确认状态
			{
				TwiStop();							// 发送停止信号	
				return 1;	
			} 
			else
			{
				return 0;	 
			}	  
		} 
		//else
		//(
			return 0;
		//)
	} 
	return 0;
}
/*/----------------------------------
void RtcInit()
{
	TWBR=73;
}
//----------------------------------
uint8 RtcWrite(uint8 addr, uint8 *buf, uint8 len)
{
	uint8 DS1307_ADDR =	addr;
	uint8 *data	= buf;
	uint8 lenn = len;
	uint8 temp;
	temp = TwiWriteStr(DS1307_ADDR,	data, lenn);
	return temp;
}
//----------------------------------
uint8 RtcRead(uint8 addr,	uint8	*buf,uint8 len)
{
	uint8	i;
	RtcWrite(addr,0,0);
		delay_ms(10);
		TwiStART();
		TwiWriteByte(DS1307_ADDR|RTC_READ);
		  for(i=0;i<len-1;i++)
		   {
			TwiReadByte(buf+i,TWI_ACK);
		   }
		   TwiReadByte(buf+i,TWI_NACK);
		   TwiStop();
		   return 0;
}
//----------------------------------
uint8	RtcUpdate(uint8_t direction)
{
	uint8	i;
		   if(direction)
			i=RtcRead(0, TimeBuf,7);
		else
				i=RtcWrite(0, TimeBuf,7);
		return i;
  }
//----------------------------------
uint8	RtcReadRam(uint8_t addr, uint8_t *buf,uint8_t len)
{
	   addr+=8;
		   return RtcRead(addr,	buf,len);
}
//----------------------------------
uint8	RtcWriteRam(uint8_t	addr, uint8_t *buf,uint8_t len)
{
	   addr+=8;
		   return RtcWrite(addr, buf,len);
}
//-----------------------------------
uint8	BinToBcd(uint8_t bin)
{
   uint8 i;
	bin&=0x7f;
		bin%=100;
		i=bin/10;
		i<<=4;
		i|=bin%10;
		return i;
}
//-----------------------------------
uint8	BcdToBin(uint8_t bcd)
{
   uint8 i;
		i=bcd&0x0f;
		i+=(bcd>>4)*10;
		return i;
}
//---------------------------
void RtcBinToBcd()
{
	uint8	i;
	TimeBinBuf[0]&=0X7F;
		TimeBinBuf[1]&=0X7F;
		TimeBinBuf[2]&=0X3F;
		TimeBinBuf[3]&=0X07;
		TimeBinBuf[4]&=0X3F;
		TimeBinBuf[5]&=0X1F;
		TimeBinBuf[6]&=0XFF;
		  for(i=0;i<7;i++) TimeBuf[i]=BinToBcd(TimeBinBuf[i]);
}
//----------------------------
void RtcBcdToBin()
  {
	 uint8 i;
  
	for(i=0;i<7;i++) TimeBinBuf[i]=BcdToBin(TimeBuf[i]);
  }
//----??????
void ReadSysTime()
	 {
		  RtcUpdate(RTC_READ);
		  RtcBcdToBin();
		  SysTimeBuf[0]=TimeBinBuf[6];//?
		  SysTimeBuf[1]=TimeBinBuf[5];//?
		  SysTimeBuf[2]=TimeBinBuf[4];//?
		  SysTimeBuf[3]=TimeBinBuf[2];//?
		  SysTimeBuf[4]=TimeBinBuf[1];//?
		 }
*/

⌨️ 快捷键说明

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