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

📄 iic_drive._c

📁 hao da jia lai fen xiang
💻 _C
字号:
/******************************************************************************/
/*   用TWI口 读写IIC总线                                                      */
/*       MEGA16   8M                                                          */
/*       100K                                                                 */
/******************************************************************************/

#include "config.h"

#define TW_START        0X08
#define TW_SLA_ACK      0X18
#define TW_SLA_NO_ACK   0X20
#define TW_DATA_ACK     0X28
#define TW_DATA_NO_ACK  0X30


#define TW_STATE        (TWSR & 0XF8)

/******************************************************************************/
void IIC_init(void)
{
	TWCR= 0X00; //disable twi
	TWBR= 0x20; //set bit rate
	TWSR= 0x00; //set prescale
	TWAR= 0x00; //set slave address
	TWCR= 0x00; //enable twi
}
/******************************************************************************/
void IIC_START(void)
{
	TWCR = BIT(TWINT) | BIT(TWSTA) | BIT(TWEN);
	while(!(TWCR & BIT(TWINT));
}
/******************************************************************************/
void IIC_STOP(void)
{
	TWCR = BIT(TWINT) | BIT(TWSTO) | BIT(TWEN);
	while(!(TWCR & BIT(TWINT));
}
/******************************************************************************/
void IIC_send(unsigned char IIC_data)
{
	unsigned char IIC_state;
	TWDR  = IIC_data;
	TWCR  = BIT(TWINT) | BIT(TWEN);
	while(!(TWCR & TWINT));
}
/******************************************************************************/
unsigned char IIC_take(void)
{
	TWCR |= BIT(TWINT) | BIT(TWEN) | BIT(TWEA);
	while(!(TWCR & BIT(TWINT)));
	return (TWDR);
}
/******************************************************************************/
unsigned char IIC_read(unsigned char IIC_address,unsigned char *IIC_data,unsigned char n_byte)
{
	IIC_address |= 0x01;
	IIC_START();
	IIC_send(IIC_address);
	if(TW_STATE != TW_SLA_ACK)
	{
		IIC_STOP();
		return FALSE;
	}
	while(--n_byte)
	{
		*IIC_data++ = IIC_take();
		if(TW_STATE == TW_DATA_NO_ACK)
		{
			IIC_STOP();
			return FALSE;
		}
	}
	TWCR |= BIT(TWINT) | BIT(TWEN);
	while(!(TWCR & BIT(TWINT)));
	*IIC_data = TWDR;
	if(TW_STATE == TW_DATA_NO_ACK)
	{
		IIC_STOP();
		return FALSE;
	}
	IIC_STOP();
	return TRUE;
}
/******************************************************************************/
unsigned char IIC_write(unsigned char IIC_address,unsigned char *IIC_data,unsigned char n_byte)
{
	IIC_address &= 0xfe;
	IIC_START();
	IIC_send(IIC_address);
	if(TW_STATE != TW_SLA_ACK)
	{
		IIC_STOP();
		return FALSE;
	}
	while(n_byte--)
	{
		IIC_send(*IIC_data++);
		if(TW_STATE != TW_DATA_ACK)
		{
			IIC_STOP();
			return FALSE;
		}
	}
	IIC_STOP();
	return TRUE;
}

⌨️ 快捷键说明

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