历史上的今天
今天是:2024年10月15日(星期二)
2019年10月15日 | AVR单片机I2C总线程序
2019-10-15 来源:eefocus
#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; }
史海拾趣
|
在F107上,个人打算使用OTG下host模式完成U盘的读写操作 目前有几个问题想请教大家: 1. STM32仅仅提供了OTG操作的库函数,关于OTG的上层协议没有任何的涉及对吧?提供的demo还是bin格式的; 2. 如果我打算完成host通信,是否存在两条路: ...… 查看全部问答> |
|
DIY步进电机的初步任务规划 将任务划分为如下部分,每个部分如下: 1.电源部分把我们用的市电~220V变为LM3S811所需要的电压和步进电机所欲要的电压,这个模块要求不高可以一个人完成。 2.按键和显示部分难度也不大,显示可 ...… 查看全部问答> |
|
有人用zic2410或其模块吗?本人创建了一个QQ群:222013663验证码:zic123 有人用zic2410或其模块吗?本人创建了一个QQ群:222013663验证码:zic123,欢迎大家加入。 [ 本帖最后由 cnsxgh 于 2012-3-19 17:52 编辑 ]… 查看全部问答> |




