为什么Atmega16通过IIC协议给BMA220发送从机地址后无应答
求大神指教,以下是程序:#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_ADDR0x0B //ADDR脚接地时的读地址
#define WD_DEVICE_ADDR0x0A //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灯不亮,这是为什么啊??? 已经解决了,谢谢大家。之前之所以没有接收到数据,还是因为IIC底层程序不对,后来又重写了一个底层一调用就接收到数据了!下面是我用的IIC底层程序,希望可以和大家多多交流 楼主,能否指点下,为什么BMA220的ID我读不到呢?
SLAVE的地址是不是0x16?? tomy 发表于 2017-5-7 09:05
楼主,能否指点下,为什么BMA220的ID我读不到呢?
SLAVE的地址是不是0x16??
写从机地址是0X14,已经测试了可以读回ID.
页:
[1]