搜索
bottom↓
回复: 4

马潮老师书中的TWI程序问题疑惑

[复制链接]

出0入0汤圆

发表于 2012-11-5 18:21:28 | 显示全部楼层 |阅读模式
发现马老师书的TWI部分程序疑惑问题,比如在demo_16_4.c中
unsigned char I2C_write(unsigned char c)    //向总线写一字节,并返回有无应答
{
    unsigned char ack=1;
    TWDR = c;
    TWCR = (1<<TWINT)|(1<<TWEN);
    while (!(TWCR & (1<<TWINT))){};
    if((TWSR & 0xF8) != TW_MT_SLA_ACK)   
        ack = 0;
    return ack;  
}

  if((TWSR & 0xF8) != TW_MT_SLA_ACK)     // 这里是写地址或数据的函数,应该是判断TW_MT_DATA_ACK或TW_MT_DATA_NACK啊
请高手也分析一下,当然, 程序可以工作,比如对AT24C256读写一般是没问题的.

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

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

出0入0汤圆

发表于 2012-11-9 00:08:15 | 显示全部楼层
请参看表16-2中TWSR的值,当TWSR为0x18(即TW_MT_SLA_ACK) 时,表示数据已经发出并收到了从机的ACK信号。由于是用的I2C硬件接口,从机的ACK信号是I2C硬件电路自动检测的,并反映在TWSR寄存器中,程序只要判断TWSR的值就可以了。

出0入0汤圆

 楼主| 发表于 2012-11-9 13:25:59 | 显示全部楼层
谢谢马老师!
书上说0x18的意思是:
SLA+W has been transmitted;
ACK has been received

出0入0汤圆

 楼主| 发表于 2012-11-24 11:51:12 | 显示全部楼层
顶起,不知是不是这样

出0入0汤圆

发表于 2012-11-28 18:40:32 | 显示全部楼层
你可以仔细看书,p472的图16-6是最完整的过程。
在我的例子里,发送写地址和发送数据,都使用了检验TWSR==0x18,其实发送写地址和发送数据的操作方式相同的,只是TWSR不同。在我的代码中,进行了简化,在上层操作中并不判断ACK的标志是否对,所以可以正常使用。在一般系统中通常是这样使用的,没问题。

如果是要求非常高系统,I2C总线上有多个从器件,那么需要增加I2C_write_data()低层,同I2C_write()相同,只是判断TWSR==0X28。前一个写数据,后一个写地址。但上层使用这个函数后,就需要判断ACK,如果不对,出错处理。显然这样非常完整规范的代码编写更为复杂。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-3-29 13:32

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

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