找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 643|回复: 4
打印 上一主题 下一主题
收起左侧

关于mpu6050的应答信号,整不明白了

[复制链接]
跳转到指定楼层
楼主
其功能是51单片机向mpu写入一个字节,然后有mpu在串行数据线(SDA)给51一个应答信号;
根据文档的说明:如下:




我对应答信号的理解是:
51向mpu发送完8位数据,如果mpu应答,会在第9个时钟时,拉低数据线SDA.所以我的应答代码如下:
void Write_ACK()
{
     SCL=1;
     SDA=1;
     while(SDA);   //用while判断SDA有没有被拉低,
}


void Write_ACK()
{
     SCL=1;
     while(SCL);   //如果从设备忙,他会使SCL保持在低电平.用while判断mpu是不是在忙,
}


事实情况是这两种都不理想;第一个进入死循环,第二个没收到过反馈;



这是在网上找的51单片机与mpu6050通信代码的一段.
他是用PSW寄存器的进位标志位CY进行数据发出的,

他接收应答用的还是CY,返回CY后,并没有对CY做任何判断,

他是怎么判断有没有收到mpu的应答信号的?
还是CY有什么特性?(我在网上没找到相关知识);

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:844772 发表于 2023-3-2 08:31 | 只看该作者
你用while,就要加个延时自动退出的判断,否则容易死循环,你找的程序只是接收了应答,没判断,普通应用经常这么处理。
回复

使用道具 举报

板凳
ID:1045628 发表于 2023-3-2 11:55 | 只看该作者
一般模拟总线,时钟由主机控制,不可能像第二个去判断时钟,这个没啥意义;第一个程序,先是SCL拉高,然后再SDA拉高,好嘛,总线通信结束了
回复

使用道具 举报

地板
ID:152785 发表于 2023-3-2 15:18 | 只看该作者
rctty 发表于 2023-3-2 11:55
一般模拟总线,时钟由主机控制,不可能像第二个去判断时钟,这个没啥意义;第一个程序,先是SCL拉高,然后 ...

谢谢,受教了
回复

使用道具 举报

5#
ID:1045628 发表于 2023-3-2 17:07 | 只看该作者

关于第二个问题,CY单纯是一个变量吧,理论上来将,他的第214行应该是
if(I2C_RecvACK() == 0)
{
    //应答成功,继续执行其他
}
这样,不过这个估计是默认了应答能成功,简化掉了;
模拟总线一般用
while(--i);
这样的操作去等待,i 为 0 的时候就直接获取数据了,
至于i的值,应该和你翻转SCL的延时是一致的,保证时钟的准确性,虽然说IIC对时钟要求不高
用死循环硬等是不行的
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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