📄 twi1.c
字号:
/*
I2C总线/TWI操作模块
1、读取和写入函数
2、地址有效范围255
3、数据长度为单字节
4、函数采用查询方式
5、可直接嵌入到项目中使用
6、晶振频率:1M
7、总线速度:50K
AVR_AFA
*/
#include "iom16v.h"
extern unsigned char twi_write(unsigned char addr, unsigned char dd);
extern unsigned char twi_read(unsigned char addr, unsigned char *dd);
/*延时函数*/
void delay_ms(unsigned char i)
{
unsigned char a, b;
for (a = 1; a < i; a++) {
for (b = 1; b; b++) {
;
}
}
}
/*I2C总线主机模式错误处理*/
void error(unsigned char type)
{
switch (type & 0xF8)
{
case 0x20: /*址址写失败*/
/*stop 停止*/
TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
break;
case 0x30: /*数据写失败*/
/*stop 停止*/
TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
break;
case 0x38: /*仲裁失败*/
break;
case 0x48: /*址址读失败*/
/*stop 停止*/
TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
break;
}
}
/*I2C总线单字节写入*/
unsigned char twi_write(unsigned char addr, unsigned char dd)
{
TWBR = 2;
/*start 启动*/
TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)));
if ((TWSR & 0xF8) != 0x08)
{
error(TWSR);
return 0;
}
/*SLA_W 芯片地址*/
TWDR = 0xA0;
TWCR = (1 << TWINT) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)));
if ((TWSR & 0xF8) != 0x18)
{
error(TWSR);
return 0;
}
/*addr 操作地址*/
TWDR = addr;
TWCR = (1 << TWINT) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)));
if ((TWSR & 0xF8) != 0x28)
{
error(TWSR);
return 0;
}
/*dd 写入数据*/
TWDR = dd;
TWCR = (1 << TWINT) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)));
if ((TWSR & 0xF8) != 0x28)
{
error(TWSR);
return 0;
}
/*stop 停止*/
TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
return 1;
}
/*I2C总线单字节读取*/
unsigned char twi_read(unsigned char addr, unsigned char *dd)
{
TWBR = 2;
/*start 启动*/
TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while(!(TWCR&(1<<TWINT)));
if ((TWSR & 0xF8) != 0x08)
{
error(TWSR);
return 0;
}
/*SLA_W 芯片地址*/
TWDR = 0xA0;
TWCR = (1 << TWINT) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)));
if ((TWSR & 0xF8) != 0x18)
{
error(TWSR);
return 0;
}
/*addr 操作地址*/
TWDR = addr;
TWCR = (1 << TWINT) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)));
if ((TWSR & 0xF8) != 0x28)
{
error(TWSR);
return 0;
}
/*start 启动*/
TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)));
if ((TWSR & 0xF8) != 0x10)
{
error(TWSR);
return 0;
}
/*SLA_R 芯片地址*/
TWDR = 0xA1;
TWCR = (1 << TWINT) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)));
if ((TWSR & 0xF8) != 0x40)
{
error(TWSR);
return 0;
}
/*读取数据*/
TWCR = (1 << TWINT) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)));
if ((TWSR & 0xF8) != 0x58)
{
error(TWSR);
return 0;
}
*dd = TWDR;
/*stop 停止*/
TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN);
return 1;
}
/*主函数*/
void main(void)
{
unsigned char temp;
PORTA = 0xFF; /*打开上拉*/
DDRA = 0x00; /*方向输入*/
PORTB = 0xF0; /*电平设置*/
DDRB = 0xFF; /*方向输出*/
PORTC = 0xFF;
DDRC = 0x00;
PORTD = 0xFF;
DDRD = 0x00;
twi_read(0x08, &temp);
PORTB = ~temp;
temp ++;
twi_write(0x08, temp);
while (1)
{
;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -