|
求大神指教,以下是程序:
#define START 0x08
#define RE_START 0x10
#define MT_SLA_ACK 0x18
#define MT_SLA_NOACK 0x20
#define MT_DATA_ACK 0x28
#define MT_DATA_NOACK 0x30
#define MR_SLA_ACK 0x40
#define MR_SLA_NOACK 0x48
#define MR_DATA_ACK 0x50
#define MR_DATA_NOACK 0x58
#define RD_DEVICE_ADDR 0x0B //ADDR脚接地时的读地址
#define WD_DEVICE_ADDR 0x0A //ADDR脚接地时的写地址
//常用TWI操作(主模式写和读)
#define Start() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)) //启动I2C
#define Stop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)) //停止I2C
#define Wait() {while(!(TWCR&(1<<TWINT)));} //等待中断发生
#define TestAck() (TWSR&0xf8) //观察返回状态
#define SetAck (TWCR|=(1<<TWEA)) //做出ACK应答
#define SetNoAck (TWCR&=~(1<<TWEA)) //做出Not Ack应答
#define Twi() (TWCR=(1<<TWINT)|(1<<TWEN)) //启动I2C
#define Write8Bit(x) {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);} //写数据到TWDR
extern void init_devices(void);
int main(void)
{
int i,j;
init_devices();
Delay_ms(10);
while(1)
{
Start(); //I2C启动
Wait();
if(TestAck()!=START)
continue;
Write8Bit(0x14); //写I2C从器件地址和写方式
Wait();
PORTC&=~(1<<7); //控制7号灯亮,查询程序是否执行到这一步
if(TestAck()!=MT_SLA_ACK) //检测是否有应答
continue;
PORTC&=~(1<<6); //控制6号灯亮,查询程序是否执行到这一步
}
return (0);
}
void init_devices(void)
{
int_init();
LED_Init();
PWM8_init();
HC595_Init();
CLI(); //领导说不
timer0_init();//定时器中断配置
TIMSK = 0x02; //定时器中断小boss
SEI(); //领导同意
}
BMA220是一个三轴加速度计,将BMA220连在Atmega16的学习板上后,7灯亮,而6灯不亮,这是为什么啊??? |
阿莫论坛20周年了!感谢大家的支持与爱护!!
如果天空是黑暗的,那就摸黑生存;
如果发出声音是危险的,那就保持沉默;
如果自觉无力发光,那就蜷伏于牆角。
但是,不要习惯了黑暗就为黑暗辩护;
也不要为自己的苟且而得意;
不要嘲讽那些比自己更勇敢的人。
我们可以卑微如尘土,但不可扭曲如蛆虫。
|