单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 230|回复: 10
收起左侧

关于用51单片机模拟IIC总线通信(主机给从机发信号,从机无应答时应该终止发送数据)

[复制链接]
blossom99 发表于 2018-9-3 19:51 | 显示全部楼层 |阅读模式
最近认真的学习了IIC总线通信,并看了郭天祥老师的书和视频讲解。
但是我有一点疑问:在IIC总线协议里规定当主机给从机发信号,从机无应答时应该终止发送数据,但是郭老师的例程里并没有这一内容,在其他的IIC通信例程中也没有看到类似内容。这是说明这个部分不重要吗?如果要实现是不是需要用到goto语句?


回复

使用道具 举报

人中狼 发表于 2018-9-3 22:36 | 显示全部楼层
这部分应该都有的,这里的从机应答应该不是应答相应的数据,而是在协议里主机发送一个字节数据后,从机都会返回一个应答的位,只有一个BIT,注意看协议

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

马帅 发表于 2018-9-4 00:27 来自手机 | 显示全部楼层
低电平应答ACK,高电平NACK

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

 楼主| blossom99 发表于 2018-9-4 01:30 | 显示全部楼层
你们都没有理解我的意思。我是说,主机给从机发数据,从机没有给主机应答,即没有在SCK高电平时把SDA拉低(1bit)时,主机应该中断传输才对。但是我看的所有例程里(包括不少12864LCD例程)都没有相关语句,大多只是后面加了一个时钟,都不管SDA是什么,只为了能够顺利进行数据传输。还有AT24C02中读完一节数据应该先非应答,再停止之类的小细节……可能是我抠的太仔细了……

评分

参与人数 1黑币 +40 收起 理由
admin + 40 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

 楼主| blossom99 发表于 2018-9-4 01:31 | 显示全部楼层
人中狼 发表于 2018-9-3 22:36
这部分应该都有的,这里的从机应答应该不是应答相应的数据,而是在协议里主机发送一个字节数据后,从机都会 ...

看楼下我的解释
回复

使用道具 举报

 楼主| blossom99 发表于 2018-9-4 01:32 | 显示全部楼层
马帅 发表于 2018-9-4 00:27
低电平应答ACK,高电平NACK

看楼下我的解释
回复

使用道具 举报

726434632 发表于 2018-9-4 08:31 | 显示全部楼层
可以不去理从机、主机自己模拟一个应答位就好了。
类似这种
即应答信号由主机自己模拟、不理会从机。只要芯片没有坏、不影响使用。
void iic_slave_NOACK()//默认非应答信号
{
        SDA=1;
        _nop_();
        SCL=1;
        _nop_();
        SCL=0;       
        _nop_();
}

void MSA300_WriteBytes(unsigned char RegAddr,unsigned char Data)
{
            I2C_Start();//主机准备好了
        I2C_Write(G_SlaveAddr_W);//主机要给从机发数据,知会从机一下
        iic_Ack();//主机当从机默认知道了
        I2C_Write(RegAddr);//主机告诉从机要操纵的地址
        iic_Ack();//主机当从机默认知道了
        I2C_Write(Data);//主机告诉从机要修改的地址中内容
        iic_Ack();//主机当从机默认知道了
        I2C_Stop();//主机挂断了电话
}
回复

使用道具 举报

726434632 发表于 2018-9-4 08:37 | 显示全部楼层
blossom99 发表于 2018-9-4 01:30
你们都没有理解我的意思。我是说,主机给从机发数据,从机没有给主机应答,即没有在SCK高电平时把SDA拉低( ...

从机如果没有给主机应答、即说明从机坏了或者时序不对。读出来的数据肯定是不对的。所以一般简单用途都不去理会从机是否应答。如果要去理会从机应答那就while等待从机应答、然后加个超时机制,规定时间内while没有检测到从机应答、就return 错误标志,如果成功发送就return 成功标志。主程序里判断是错误标志就输出错误信息即可,比如“通信错误、请更换芯片”

评分

参与人数 1黑币 +5 收起 理由
blossom99 + 5 很给力!

查看全部评分

回复

使用道具 举报

人中狼 发表于 2018-9-4 10:19 | 显示全部楼层
最好可以贴上你所看的例程,或许有的例程为了方便并没有去检测应答,我也是看例程学的IIC,里面就有对从机应答的检测和处理。多看一些例程,现在都用C语言写程序,所以有的例程不需要局限在51,也可以看看如STM32中相关操作的例程
回复

使用道具 举报

zyaq123 发表于 2018-9-4 11:41 | 显示全部楼层
你可以加延时判断啊。定时过后如果没有收到应答,则退出此次发送
回复

使用道具 举报

zyaq123 发表于 2018-9-4 11:43 | 显示全部楼层
从机无应答,可能总线有问题哦,你可以在主机上加延时判断。尽可能少用while,或者while中做一个技术,不然很容易卡机
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|单片机论坛

Powered by 单片机教程网

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