dhw5qq 发表于 2014-6-9 13:32:39

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

目前我在做一个BMS系统,用到iic协议。主机和从机用iic通讯,主机发01,从机发电压高字节的数据,主机发02,从机发电压低字节数据,现在问题就有点奇怪,因为有时候通讯不是很稳定导致,读取到的数据是ff,有时候是高字节,有时候是低字节,我现在想让数据稳定一点,有什么好的办法没?

dhw5qq 发表于 2014-6-9 13:33:57

我们经理说加个隔离芯片,会不会好些!或者软件在做一些效验什么!

dhw5qq 发表于 2014-6-9 13:34:47

测试了2天,发现数据一共有50次错误,这肯定是不行的!

dhw5qq 发表于 2014-6-9 13:35:33


void Read_data(void)
{u8 i;                   
                for(i=1;i<=16;i++)
                  {
                        delay_ms(300);                                          //158ms
                        write_gasgauge(i);                                                       
                                delay_ms(200);                                                //95ms
                          iic_buf=read_gasgauge();                                               
                  }                                                                                    
          
}

void show(void)
{   

             buffer=(iic_buf<<8)|iic_buf;               buffer/=10;buffer-=273;        //温度               
               buffer=(iic_buf<<8)|iic_buf;               //电压               
               buffer=(iic_buf<<8)|iic_buf;                //容量               
               buffer=(iic_buf<<8)|iic_buf;                //单节电压
              buffer=(iic_buf<<8)|iic_buf;        //循环                                        
               buffer=(iic_buf<<8)|iic_buf;        //FCC
               buffer=(iic_buf<<8)|iic_buf;        //充电电流                                                    
               current=(iic_buf<<8)|iic_buf;               //电流
               
               
               if(Task0_flag)               
               {
                  Task0_flag=0;                                       
               show_tempurature(1,2,buffer);               
               show_voltage(1,1,buffer);       
               Show_Num(1,0,buffer);       
               show_current(1,3,current);       
               show_voltage(5,2,buffer);
               show_fcc(5,1,buffer);
               show_fcc(5,0,buffer);
               show_cycle_1(5,3,buffer);       
               }               
}

dhw5qq 发表于 2014-6-9 13:37:28

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

dhw5qq 发表于 2014-6-9 15:45:18

或者说我是不是可以这样,我发送命令的时间尽量长点,比如说我0.5s 发一次命令,并且取回一次数据,

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

dhw5qq 发表于 2014-6-9 15:46:12

那不然 一直频繁的发命令,的话,从机肯定会因为在做其他事情导致数据数据啊!

dhw5qq 发表于 2014-6-9 15:49:38

没人啊?

Xujuango 发表于 2014-6-9 16:15:36

什么经理?滚蛋

dhw5qq 发表于 2014-6-9 16:32:49

Xujuango 发表于 2014-6-9 16:15
什么经理?滚蛋

你怎么骂人啊?         

lyrics131415 发表于 2014-6-9 16:54:07

楼主单机?
你的IIC通信速率是多少?测过没?

Xujuango 发表于 2014-6-9 17:59:36

dhw5qq 发表于 2014-6-9 16:32
你怎么骂人啊?

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

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

gliet_su 发表于 2014-6-9 22:37:51

如果是干扰,隔离用处不大,还不如用屏蔽线。

dhw5qq 发表于 2014-6-10 09:02:55

gliet_su 发表于 2014-6-9 22:37
如果是干扰,隔离用处不大,还不如用屏蔽线。

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

funnybow 发表于 2014-6-10 09:29:16

想问下,你的从设备是硬件I2C还是软件I2C

dhw5qq 发表于 2014-6-10 09:48:03

lyrics131415 发表于 2014-6-9 16:54
楼主单机?
你的IIC通信速率是多少?测过没?

差不多10KHZ吧,

dhw5qq 发表于 2014-6-10 09:49:46

funnybow 发表于 2014-6-10 09:29
想问下,你的从设备是硬件I2C还是软件I2C

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

lyrics131415 发表于 2014-6-10 10:32:11

dhw5qq 发表于 2014-6-10 09:49
从机是硬接口,主机是软件模拟的时序,差不多10khz的频率!

上拉电阻取的多少K?

dhw5qq 发表于 2014-6-10 10:36:01

lyrics131415 发表于 2014-6-10 10:32
上拉电阻取的多少K?

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

funnybow 发表于 2014-6-10 10:42:32

是不是你这个太慢了,任何硬件的I2C应该至少100k的速率

funnybow 发表于 2014-6-10 10:47:42

一次完整的通信过程要快速点完成

dhw5qq 发表于 2014-6-10 10:54:21

funnybow 发表于 2014-6-10 10:47
一次完整的通信过程要快速点完成

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

dhw5qq 发表于 2014-6-10 11:02:18

funnybow 发表于 2014-6-10 10:47
一次完整的通信过程要快速点完成

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

funnybow 发表于 2014-6-10 11:04:22

一次完整的通信就是重开始到结束啊

liufabing 发表于 2014-6-10 11:11:15

dhw5qq 发表于 2014-6-10 10:36
10K。我主机是4.9v供电,我从机是3.3v供电!

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

gliet_su 发表于 2014-6-10 20:34:56

dhw5qq 发表于 2014-6-10 10:36
10K。我主机是4.9v供电,我从机是3.3v供电!

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

kevin_me 发表于 2014-6-10 21:03:41

为什么需要延时?延时并不会使数据更稳定,按照I2C时序,直接读写即可。
另外,在I2C初始化的时候,一定要记得加上防止总线锁死的处理。

dhw5qq 发表于 2014-6-16 07:58:14

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

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

kevin_me 发表于 2014-6-17 09:01:37

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

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

给你看个文章《I2C死锁原因及解决方法》,CSDN上的,不一定是导致你通信问题的直接原因,但绝对有影响。
页: [1]
查看完整版本: 关于iic通讯中数据的稳定性问题!