52robot 发表于 2007-11-30 09:08:56

请教问题:关于TWI的问题,读16位(2个字节)的寄存器

关于TWI的问题,读16位(2个字节)的寄存器

以下是头文件

//MT 主方式传输MR 主方式接收
#define START 0x08
#define RE_START 0x10
#define MT_SLA_ACK 0x18
#define MT_SLA_NOACK 0x20
#define MT_DATA_ACK0x28
#define MT_DATA_NOACK 0x30
#define MR_SLA_ACK0x40
#define MR_SLA_NOACK 0x48
#define MR_DATA_ACK 0x50
#define MR_DATA_NOACK 0x58
//常用TWI操作(主模式写和主模式读)
#define Start()              (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))
#define Stop()             (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))
#define Wait()                     {while(!(TWCR&(1<<TWINT)));}
#define TestAck()           (TWSR&0xf8)
#define SetAck()          (TWCR|=(1<<TWEA))
#define SetNoAck()    (TWCR&=~(1<<TWEA))
#define Twi()                    (TWCR=(1<<TWINT)|(1<<TWEN))
#define Write8Bit(x){TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);}

以下是 TWI_Read函数
unsigned char i2c_Read(unsigned char RomAddress)
      {
           unsigned char tempH,tempL;
           Start();//I2C启动
           Wait();
           if (TestAck()!=START) return 0;//ACK          
           Write8Bit(wr_device_add);//写I2C从器件地址和写方式
           Wait();
           if (TestAck()!=MT_SLA_ACK) return 0;//ACK
           Write8Bit(RomAddress);//I2C器件的寄存器地址
           Wait();
           if (TestAck()!=MT_DATA_ACK) return 0;
           Start();//I2C重新启动
           Wait();
           if (TestAck()!=RE_START)return 0;
           Write8Bit(rd_device_add);//写I2C从器件地址和读方式
           Wait();
           if(TestAck()!=MR_SLA_ACK)return 0;//ACK
           Twi();//启动主I2C读方式
           Wait();
           if(TestAck()!=MR_DATA_NOACK) return 0;//ACK       
           tempH=TWDR;//读取I2C接收数据

           Wait();                                       ??????
           if(TestAck()!=MR_DATA_NOACK) return 0;//ACK           ??????高字节读出来后怎样操作才能读出低字节呢
           tempL=TWDR;//读取I2C接收数据                  ??????


       Stop();//I2C停止
           return tempH*256+tempL;

问题是读出来的tempH和tempL是一样的,都是那个寄存器的高字节,请大家帮忙解答,谢谢

machao 发表于 2007-11-30 19:38:54

twi中有16位的寄存器?

你的底层没有贴上,不知道TestAck()做什么.另外,你收到第一个字节后,还要回送ACK,这样从机才能送第2个字节.程序中看不出.

建议你买本我的书,参考16章,把I2C弄透.
页: [1]
查看完整版本: 请教问题:关于TWI的问题,读16位(2个字节)的寄存器