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

📄 i2c.c

📁 本人用avr 单片机atmega128开发控制产品的源码。
💻 C
字号:
// this file debug finish.
// date:2004.2.2
#include<iom128v.h>
#include"TWI.H"
#include <control.h>
#include <lcd.h>
#include <macros.h>

extern  unsigned char rd_device_add;
extern  unsigned char wr_device_add;

//---------------------------------------------------------
// NAME:	delayus()
// ENTRY:	time, delay time constant, if time = 1, delay = 1.08us.
// RETURN:	void.
// MODIFY:	2004.2.2
//--------------------------------------------------------
void delayus(unsigned int time)
{     
	while (time)
		time--;
}	  

//---------------------------------------------------------
// NAME:	delayms()
// ENTRY:	time, delay time constant, if time = 1, delay = 1.08ms.
// RETURN:	void.
// MODIFY:	2004.2.2
//--------------------------------------------------------
void delayms(unsigned int  time)
{
	while(time)
	{		
		delayus(482);
		WDR();
		time--;
	}
}					

//---------------------------------------------------------
// NAME:	select_qam_add()
// ENTRY:	addr, qam chennal address number.
// RETURN:	void.
// MODIFY:	2004.2.2
//--------------------------------------------------------
void select_qam_add(unsigned char addr)
{
	switch(addr)
	{
	//qam address: 	01 or 05 
	case 1:	      
		rd_device_add = 0x11;
		wr_device_add = 0x10;
		break;
	//qam address:	02 or 06	
	case 2:		 	  	
		rd_device_add = 0x13;
		wr_device_add = 0x12;
		break;
	//qam address:	03 or 07 	
	case 3:	         	
		rd_device_add = 0x15;
		wr_device_add = 0x14;
		break;
	//qam address:	04 or 08	
	case 4:		 	 	
		rd_device_add = 0x17;
		wr_device_add = 0x16;
		break;			
	default:
		break; 
	}
}

//---------------------------------------------------------
// NAME:	select_chanl()
// ENTRY:	chanl, i2c bus chennal number.
//		add, qam chennal address number.
// RETURN:	void.
// MODIFY:	2004.2.2
//--------------------------------------------------------
void select_chanl(unsigned char chanl,unsigned char add)
{   
	DDRB |= 0x60;
	PORTB &= ~0x60;	
	delayms(10);
	switch(chanl)
	{
	//sen1
	case 1:	
		PORTB |= 0x40;			            
		rd_device_add = 0x5b;
		wr_device_add = 0x5a; 
		break;
	//sen2	
	case 2:
		PORTB |= 0x60;		
		rd_device_add = 0x5b;
		wr_device_add = 0x5a; 
		break;
	//qam1 	
	case 3:	           
		PORTB &= ~0x60;	
		select_qam_add(add);
		break;
	//qam2	
	case 4:			
		PORTB |= 0x20;		
		select_qam_add(add);
		break;
	default:
		break;
	}
	// set potrd = input, release  i2c bus 
	DDRD &= ~0x03;
	PORTD &= ~0x03;
	delayms(100);
	// set portd = output, install i2c bus
	DDRD |= 0x03;
	PORTD |= 0x03;
	delayms(20);
}

//---------------------------------------------------------
// NAME:	Start()
// ENTRY:	void.
// RETURN:	void.
// MODIFY:	2004.2.2
//--------------------------------------------------------
void Start(void)
{
	TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
}

//---------------------------------------------------------
// NAME:	Stop()
// ENTRY:	void.
// RETURN:	void.
// MODIFY:	2004.2.2
//--------------------------------------------------------
void Stop(void)
{
	TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN);
}	

//---------------------------------------------------------
// NAME:	TestAck()
// ENTRY:	void.
// RETURN:	return i2c ack status.
// MODIFY:	2004.2.2
//--------------------------------------------------------
unsigned char TestAck(void)
{
	return TWSR & 0xf8;
}	

//---------------------------------------------------------
// NAME:	SetAck()
// ENTRY:	void.
// RETURN:	void.
// MODIFY:	2004.2.2
//--------------------------------------------------------
void  SetAck(void)
{
	TWCR |= 1 << TWEA;
}	

//---------------------------------------------------------
// NAME:	SetNoAck()
// ENTRY:	void.
// RETURN:	void.
// MODIFY:	2004.2.2
//--------------------------------------------------------
void SetNoAck(void)
{
	TWCR &= ~(1 << TWEA);
}

//---------------------------------------------------------
// NAME:	Twi()
// ENTRY:	void.
// RETURN:	void.
// MODIFY:	2004.2.2
//--------------------------------------------------------
void Twi(void)
{
	TWCR = (1 << TWINT) | (1 << TWEN);
}	

//---------------------------------------------------------
// NAME:	Write8Bit()
// ENTRY:	x, write to i2c device data.
// RETURN:	void.
// MODIFY:	2004.2.2
//--------------------------------------------------------
void Write8Bit(unsigned char  x) 
{
	TWDR = x;
	TWCR = (1 << TWINT) | (1 << TWEN);
} 

//---------------------------------------------------------
// NAME:	Wait()
// ENTRY:	void
// RETURN:	if success return TRUE, otherwise return FALSE.
// MODIFY:	2004.2.2
//--------------------------------------------------------
unsigned char  Wait(void)
{ 
	unsigned char cout;
	cout = 0;
	while(!(TWCR & (1 << TWINT)))
	{
		cout++;
		delayms(5);
		WDR();
		if(cout > 3)  
		{
			Stop();
			return FALSE;
		}	
	}
	return TRUE;
}	 

//---------------------------------------------------------
// NAME:	i2c_Write()
// ENTRY:	Wdata, data of write i2c device
//		RomAddress, start address of write i2c device
//		chanl, channel No. of write i2c device
//		add, i2c device data address.
// RETURN:  	if success return TRUE, otherwise return FALSE or OUTTIME_ERROR.
// MODIFY:	2004.2.2
//--------------------------------------------------------
unsigned char i2c_Write(unsigned char Wdata, unsigned char RomAddress, unsigned char chanl, unsigned char add) 
{
	select_chanl(chanl,add);
	// i2c start
	Start();
	if(Wait())
		return OUTTIME_ERROR;
	if(TestAck() != START)
	{
		Stop();
		return FALSE;
	}	
	// write i2c device slave address & write method	
	Write8Bit(wr_device_add);			 
	if(Wait())
		return OUTTIME_ERROR;
	if(TestAck() != MT_SLA_ACK) 
	{
		Stop();
		return FALSE;
	}	
	// write i2c device data address	
	Write8Bit(RomAddress);		   
	if(Wait())
		return OUTTIME_ERROR;
	if(TestAck() != MT_DATA_ACK)
	{
		Stop();
		return FALSE;
	}	
	// write i2c device data	
	Write8Bit(Wdata);
	if(Wait())
		return OUTTIME_ERROR;
	if(TestAck() != MT_DATA_ACK)
	{
		Stop();
		return FALSE;
	}	
	// i2c stop		
	Stop();									   
	delayms(10);							
	return TRUE;
}

//---------------------------------------------------------
// NAME:	i2c_Read()
// ENTRY:	Rdata, data of read i2c device.
//		RomAddress, start address of read i2c device.
//		chanl, channel No. of read i2c device.
//		add, i2c device data address.
// RETURN:  	if success return TRUE, otherwise return FALSE or OUTTIME_ERROR.
// MODIFY:	2004.2.2
//--------------------------------------------------------
unsigned char i2c_Read(unsigned char *Rdata, unsigned char RomAddress, unsigned char chanl, unsigned char add) 
{	
	select_chanl(chanl,add);
	//i2c start 
	Start();	
	if(Wait())
		return OUTTIME_ERROR;
	if(TestAck() != START) 
	{
		Stop();
		return FALSE;
	}		
	// write i2c device slave address & write mothed	   
	Write8Bit(wr_device_add);
	if(Wait())
		return OUTTIME_ERROR; 
	if(TestAck() != MT_SLA_ACK)
	{
		Stop();
		return FALSE;
	}	
	// write i2c device data address	
	Write8Bit(RomAddress);
	if(Wait())
		return OUTTIME_ERROR;
	if(TestAck() != MT_DATA_ACK)
	{
		Stop();
		return FALSE;
	}	
	// i2c restart	
	Start();
	if(Wait())
		return OUTTIME_ERROR;
	if(TestAck() != RE_START)
	{
		Stop();
		return FALSE;
	}	
	// write i2c device slave address & read mothed	
	Write8Bit(rd_device_add);
	if(Wait())
		return OUTTIME_ERROR;
	if(TestAck() != MR_SLA_ACK)
	{
		Stop();
		return FALSE;
	}	
	// start  i2c read mothed	
	Twi();
	if(Wait())
		return OUTTIME_ERROR;
	if(TestAck() != MR_DATA_NOACK)
	{
		Stop();
		return FALSE;
	}	
	// read i2c data		
	*Rdata = TWDR;
	// i2c stop
	Stop();
	return TRUE;
}

//---------------------------------------------------------
// NAME:	i2c_Write_mbyte()
// ENTRY:	*pdata, data pointer of write i2c device
//		RomAddress, start address of write i2c device
//		bynum, byte numbers of write i2c device 
//		chanl, channel No. of write i2c device
//		add, i2c device data address.
// RETURN:  	if success return TRUE, otherwise return FALSE or OUTTIME_ERROR.
// MODIFY:	2004.2.2
//--------------------------------------------------------
unsigned char i2c_Write_mbyte(unsigned char *pdata, unsigned char RomAddress, unsigned char bynum, unsigned char chanl, unsigned char add) 
{
	unsigned char i;
	select_chanl(chanl, add);
	// i2c start
	Start();										 
	if(Wait())
		return OUTTIME_ERROR;
	if(TestAck() != START)	
	{
		Stop();
		return FALSE;
	}	
	//write devide address
	Write8Bit(wr_device_add);			 
	if(Wait())
		return OUTTIME_ERROR;
	if(TestAck() != MT_SLA_ACK) 
	{
		Stop();
		return FALSE;
	}	
	// data start address of write i2c device
	Write8Bit(RomAddress);		  
	if(Wait())
		return OUTTIME_ERROR;
	if(TestAck() != MT_DATA_ACK)	
	{
		Stop();
		return FALSE;
	}	
	for(i = 0; i < bynum; i++)
	{
		//write data to i2c device
		Write8Bit(*(pdata + i));						
		if(Wait())
			return OUTTIME_ERROR;
		if(TestAck() != MT_DATA_ACK)
		{
			Stop();
			return FALSE;
		}		
	}
	// i2c stop
	Stop();									   
	delayms(10);							
	return TRUE;
}

⌨️ 快捷键说明

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