#include "iom16v.h"
/*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< 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; }
设计资源 培训 开发板 精华推荐
- LT8630EFE 12V、0.6A 降压转换器的典型应用电路
- 【训练营】智能养殖控制器321088G
- AD8112-EVALZ,AD8112 模拟交叉点开关评估板
- LTC3859AMPFE 高效率、三路 24V/1V/1.2V 同步降压/升压转换器的典型应用电路,采用 12V 输入电压
- 使用 ON Semiconductor 的 KA7805E 的参考设计
- 使用 Analog Devices 的 LT1375IN8 的参考设计
- 【实物已做】极简清爽USB HUB集线器_基于SL2.1A
- 【核心板】CH32F103C8T6核心板
- ADP2390-EVALZ,用于评估 ADP2390 的评估板,18V,12A,降压稳压器,可编程限流
- NCP1247USBPDGEVB,NCP1247 固定频率电流模式 PWM 控制器评估板