📄 iic_drive._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 + -