搜索
bottom↓
回复: 28

关于iic通讯中数据的稳定性问题!

[复制链接]

出0入0汤圆

发表于 2014-6-9 13:32:39 | 显示全部楼层 |阅读模式
目前我在做一个BMS系统,用到iic协议。主机和从机用iic通讯,主机发01,从机发电压高字节的数据,主机发02,从机发电压低字节数据,现在问题就有点奇怪,因为有时候通讯不是很稳定导致,读取到的数据是ff,有时候是高字节,有时候是低字节,我现在想让数据稳定一点,有什么好的办法没?

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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2014-6-9 13:33:57 | 显示全部楼层
我们经理说加个隔离芯片,会不会好些!或者软件在做一些效验什么!

出0入0汤圆

 楼主| 发表于 2014-6-9 13:34:47 | 显示全部楼层
测试了2天,发现数据一共有50次错误,这肯定是不行的!

出0入0汤圆

 楼主| 发表于 2014-6-9 13:35:33 | 显示全部楼层

  1. void Read_data(void)
  2. {  u8 i;                     
  3.                 for(i=1;i<=16;i++)
  4.                   {
  5.                         delay_ms(300);                                            //158ms
  6.                         write_gasgauge(i);                                                       
  7.                                 delay_ms(200);                                                //95ms
  8.                             iic_buf[i]=read_gasgauge();                                               
  9.                   }                                                                                      
  10.           
  11. }

  12. void show(void)
  13. {   

  14.              buffer[0]=(iic_buf[1]<<8)|iic_buf[2];                 buffer[0]/=10;buffer[0]-=273;        //温度               
  15.                  buffer[1]=(iic_buf[3]<<8)|iic_buf[4];                 //电压                 
  16.                  buffer[2]=(iic_buf[5]<<8)|iic_buf[6];                //容量               
  17.                  buffer[3]=(iic_buf[9]<<8)|iic_buf[10];                //单节电压
  18.                   buffer[4]=(iic_buf[15]<<8)|iic_buf[16];        //循环                                          
  19.                  buffer[5]=(iic_buf[11]<<8)|iic_buf[12];        //FCC
  20.                  buffer[6]=(iic_buf[13]<<8)|iic_buf[14];        //充电电流                                                          
  21.                  current=(iic_buf[7]<<8)|iic_buf[8];                 //电流
  22.                  
  23.                  
  24.                  if(Task0_flag)                 
  25.                  {
  26.                     Task0_flag=0;                                         
  27.                  show_tempurature(1,2,buffer[0]);               
  28.                  show_voltage(1,1,buffer[1]);         
  29.                  Show_Num(1,0,buffer[2]);       
  30.                  show_current(1,3,current);       
  31.                  show_voltage(5,2,buffer[3]);  
  32.                  show_fcc(5,1,buffer[5]);
  33.                  show_fcc(5,0,buffer[6]);  
  34.                  show_cycle_1(5,3,buffer[4]);         
  35.                  }               
  36. }
复制代码

出0入0汤圆

 楼主| 发表于 2014-6-9 13:37:28 | 显示全部楼层
上面的代码是关键部分。我发命令后延迟一下再读,然后我在液晶上显示出来,我用逻辑分析仪看了,把8个数据读取完差不多花费2s钟,我液晶显示刷新时间就要大于2s

出0入0汤圆

 楼主| 发表于 2014-6-9 15:45:18 | 显示全部楼层
或者说我是不是可以这样,我发送命令的时间尽量长点,比如说我0.5s 发一次命令,并且取回一次数据,

然后就中断1s去 收集数据! 2s显示一次,那就是可以采集2次数据了!

出0入0汤圆

 楼主| 发表于 2014-6-9 15:46:12 | 显示全部楼层
那不然 一直频繁的发命令,的话,从机肯定会因为在做其他事情导致数据数据啊!

出0入0汤圆

 楼主| 发表于 2014-6-9 15:49:38 | 显示全部楼层
没人啊?  

出0入4汤圆

发表于 2014-6-9 16:15:36 | 显示全部楼层
什么经理?滚蛋

出0入0汤圆

 楼主| 发表于 2014-6-9 16:32:49 | 显示全部楼层
Xujuango 发表于 2014-6-9 16:15
什么经理?滚蛋

你怎么骂人啊?           

出0入0汤圆

发表于 2014-6-9 16:54:07 | 显示全部楼层
楼主单机?
你的IIC通信速率是多少?测过没?

出0入4汤圆

发表于 2014-6-9 17:59:36 | 显示全部楼层
dhw5qq 发表于 2014-6-9 16:32
你怎么骂人啊?

你们经理说要隔离,显然是认为 干扰引起的。

以我的经验,你在测试阶段,应该是在公司,这时候哪来的干扰。现场去了,你的整个系统还不崩溃了?

出0入0汤圆

发表于 2014-6-9 22:37:51 | 显示全部楼层
如果是干扰,隔离用处不大,还不如用屏蔽线。

出0入0汤圆

 楼主| 发表于 2014-6-10 09:02:55 | 显示全部楼层
gliet_su 发表于 2014-6-9 22:37
如果是干扰,隔离用处不大,还不如用屏蔽线。

就是读取到的数据有时候是ff,  不知道怎么解决!

出0入0汤圆

发表于 2014-6-10 09:29:16 来自手机 | 显示全部楼层
想问下,你的从设备是硬件I2C还是软件I2C

出0入0汤圆

 楼主| 发表于 2014-6-10 09:48:03 | 显示全部楼层
lyrics131415 发表于 2014-6-9 16:54
楼主单机?
你的IIC通信速率是多少?测过没?

差不多10KHZ吧,

本帖子中包含更多资源

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

x

出0入0汤圆

 楼主| 发表于 2014-6-10 09:49:46 | 显示全部楼层
funnybow 发表于 2014-6-10 09:29
想问下,你的从设备是硬件I2C还是软件I2C

从机是硬接口,主机是软件模拟的时序,差不多10khz的频率!

出0入0汤圆

发表于 2014-6-10 10:32:11 | 显示全部楼层
dhw5qq 发表于 2014-6-10 09:49
从机是硬接口,主机是软件模拟的时序,差不多10khz的频率!

上拉电阻取的多少K?

出0入0汤圆

 楼主| 发表于 2014-6-10 10:36:01 | 显示全部楼层
lyrics131415 发表于 2014-6-10 10:32
上拉电阻取的多少K?

10K。我主机是4.9v供电,我从机是3.3v供电!

出0入0汤圆

发表于 2014-6-10 10:42:32 来自手机 | 显示全部楼层
是不是你这个太慢了,任何硬件的I2C应该至少100k的速率

出0入0汤圆

发表于 2014-6-10 10:47:42 来自手机 | 显示全部楼层
一次完整的通信过程要快速点完成

出0入0汤圆

 楼主| 发表于 2014-6-10 10:54:21 | 显示全部楼层
funnybow 发表于 2014-6-10 10:47
一次完整的通信过程要快速点完成

那一次你指的是,我发出命令后要立即读取吗?

出0入0汤圆

 楼主| 发表于 2014-6-10 11:02:18 | 显示全部楼层
funnybow 发表于 2014-6-10 10:47
一次完整的通信过程要快速点完成

这个通讯我刚才是用分析仪看了下,发现16次数据和命令传输要3s,然后我的液晶刷新的时间是2s!

出0入0汤圆

发表于 2014-6-10 11:04:22 来自手机 | 显示全部楼层
一次完整的通信就是重开始到结束啊

出0入0汤圆

发表于 2014-6-10 11:11:15 | 显示全部楼层
dhw5qq 发表于 2014-6-10 10:36
10K。我主机是4.9v供电,我从机是3.3v供电!

有加电平转换吗?信号上升下降沿什么情况(2边都看下)?

出0入0汤圆

发表于 2014-6-10 20:34:56 | 显示全部楼层
dhw5qq 发表于 2014-6-10 10:36
10K。我主机是4.9v供电,我从机是3.3v供电!

不用两边都上拉,一边就可以了
如果在5V上拉,建议用3.3K
如果在3.3V上拉,建议用1.5K

出5入42汤圆

发表于 2014-6-10 21:03:41 | 显示全部楼层
为什么需要延时?延时并不会使数据更稳定,按照I2C时序,直接读写即可。
另外,在I2C初始化的时候,一定要记得加上防止总线锁死的处理。

出0入0汤圆

 楼主| 发表于 2014-6-16 07:58:14 | 显示全部楼层
kevin_me 发表于 2014-6-10 21:03
为什么需要延时?延时并不会使数据更稳定,按照I2C时序,直接读写即可。
另外,在I2C初始化的时候,一定要 ...

实际上延迟是有必要的,我试过 了,当你的延迟不够的时候,读取出来的数据就是ff,因为你的从器件根本就和你的单片机速率不能同步,

出5入42汤圆

发表于 2014-6-17 09:01:37 | 显示全部楼层
dhw5qq 发表于 2014-6-16 07:58
实际上延迟是有必要的,我试过 了,当你的延迟不够的时候,读取出来的数据就是ff,因为你的从器件根本就 ...

解决没有?
我说的重点是防止I2C锁死,MCU上电之后将SCK作为IO口,输出9个周期的时钟脉冲。

给你看个文章《I2C死锁原因及解决方法》,CSDN上的,不一定是导致你通信问题的直接原因,但绝对有影响。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-8-26 15:11

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

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