搜索
bottom↓
回复: 1

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

[复制链接]

出0入0汤圆

发表于 2007-11-30 09:08:56 | 显示全部楼层 |阅读模式
关于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_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
//常用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是一样的,都是那个寄存器的高字节,请大家帮忙解答,谢谢

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2007-11-30 19:38:54 | 显示全部楼层
twi中有16位的寄存器?

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

建议你买本我的书,参考16章,把I2C弄透.
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-18 15:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表