搜索
bottom↓
回复: 9

STM32IIC通信读数据时,前后发送两次写地址也可以读数据?

[复制链接]

出0入0汤圆

发表于 2021-5-13 16:21:06 | 显示全部楼层 |阅读模式
之前没怎么了解过IIC通信协议,直接网上搞的代码拿来用的,传感器HMC5983,地磁传感器
目前用的STM32的硬件IIC,之前也用过模拟IIC。目前的问题是,硬件IIC中读数据的时候,按照协议规定应该是先发一次从机写地址,再发一次从机读地址,不过当时没注意用的代码,现在看了一下我在读数据的时候发送的两次都是写地址,但是数据结果还是都可以读出来,后面又试了一下先发写地址再发读地址,最终的数据结果都是一样的。
但奇怪的是,用模拟IIC的时候,读数据时只能先发写地址再发读地址,两次都发写地址的话就白搭了。
求助大家,这是什么原因呢?硬件IIC为什么我读数据发两次写地址也可以读出来数据?!!!??
另外之所以最终不用模拟IIC的原因是因为实测模拟IIC的功耗会大,而现在用的硬件IIC也没出现什么问题。
源码图已附上,两张有红框的是硬件IIC,黄框的是模拟IIC。slaveaddress为0x3c,也就是从机写地址。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

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

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2021-5-13 16:22:09 | 显示全部楼层
另外,单片机是STM32L151的

出0入0汤圆

 楼主| 发表于 2021-5-13 18:24:28 | 显示全部楼层
有没有大神了解的呢

出0入93汤圆

发表于 2021-5-13 18:28:37 来自手机 | 显示全部楼层
还是先看看IIC协议吧,IIC的器件地址只有7位和10位两种,没有什么读和写之分。加上了读写位之后变成8位的已经不是器件地址了。所以你硬件用的是器件地址,软件模拟的不是器件地址,得右移一位才是。

出0入0汤圆

 楼主| 发表于 2021-5-13 18:40:06 | 显示全部楼层
takashiki 发表于 2021-5-13 18:28
还是先看看IIC协议吧,IIC的器件地址只有7位和10位两种,没有什么读和写之分。加上了读写位之后变成8位的已 ...

硬件和模拟传入的参数都是7位器件地址左移1位后再加读/写位的地址
默认7位器件地址是0x1E,所以定义的slaveaddress是左移一位后的写地址也就是0x3c了
难道这样传入读/写地址不对吗?或者传器件地址作为参数传入的话再对参数进行左移一位,和我直接传入写地址的道理不也是一样的吗。。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2021-5-13 18:41:19 | 显示全部楼层
takashiki 发表于 2021-5-13 18:28
还是先看看IIC协议吧,IIC的器件地址只有7位和10位两种,没有什么读和写之分。加上了读写位之后变成8位的已 ...

所以我硬件和软件模拟的传入参数都是直接传的读/写地址,这里没啥差别吧。。。

出0入93汤圆

发表于 2021-5-13 20:43:13 | 显示全部楼层
你自己都标出来了,明明白白的7位地址,你还左移,我都不知道该说什么好了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2021-5-13 22:06:42 | 显示全部楼层
takashiki 发表于 2021-5-13 20:43
你自己都标出来了,明明白白的7位地址,你还左移,我都不知道该说什么好了。
...

多谢提醒,不过函数写的是发送7位地址,但直接传入7位器件地址0x1E后没任何反应,读写都不行
看了一下这个库函数,里面是根据I2C_Direction这参数来判断是读还是写的
如果传的是I2C_Direction_Transmitter就是读的话,就把传入的地址与I2C_OAR1_ADD0运算,也就是0x0001或运算,相当于器件地址加1位读位1再发送地址,就是0X3D
如果传的是I2C_Direction_Receiver就是写的话就,把传入的地址与I2C_OAR1_ADD0运算,也就是0x0001与运算,相当于器件地址加1位写位0再发送地址,就是0X3C
所以这样来说的话传入的地址参数就不能直接是7位地址了吧,不然地址与I2C_OAR1_ADD0运算后没办法得到器件地址+读/写地址,因此只能是自己传入的器件地址就先左移一位后才可以吧?
所以才是我说的那种硬件IIC的话,读数据的时候前后两次传入的8位地址,都是写或者都是读或者读写个一次的时候都无所谓,主要是根据I2C_Direction参数来判断是设置为读位还是写位的?
求问是否是这样呢

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2021-5-13 22:21:11 | 显示全部楼层
yjl912 发表于 2021-5-13 22:06
多谢提醒,不过函数写的是发送7位地址,但直接传入7位器件地址0x1E后没任何反应,读写都不行
看了一下这 ...

说错了一下,I2C_Direction == I2C_Direction_Transmitter时候,传入的地址是和~(I2C_OAR1_ADD0)再与,也就是和0x1110与运算,将bit0位置0

出0入0汤圆

发表于 2021-5-14 09:25:04 | 显示全部楼层
先找个iic器件看看标准的流程吧。
iic这东西不难,但是不看协议不行。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-26 10:56

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

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