关于iic通讯中数据的稳定性问题!
目前我在做一个BMS系统,用到iic协议。主机和从机用iic通讯,主机发01,从机发电压高字节的数据,主机发02,从机发电压低字节数据,现在问题就有点奇怪,因为有时候通讯不是很稳定导致,读取到的数据是ff,有时候是高字节,有时候是低字节,我现在想让数据稳定一点,有什么好的办法没? 我们经理说加个隔离芯片,会不会好些!或者软件在做一些效验什么! 测试了2天,发现数据一共有50次错误,这肯定是不行的!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);
}
} 上面的代码是关键部分。我发命令后延迟一下再读,然后我在液晶上显示出来,我用逻辑分析仪看了,把8个数据读取完差不多花费2s钟,我液晶显示刷新时间就要大于2s 或者说我是不是可以这样,我发送命令的时间尽量长点,比如说我0.5s 发一次命令,并且取回一次数据,
然后就中断1s去 收集数据! 2s显示一次,那就是可以采集2次数据了! 那不然 一直频繁的发命令,的话,从机肯定会因为在做其他事情导致数据数据啊! 没人啊? 什么经理?滚蛋 Xujuango 发表于 2014-6-9 16:15
什么经理?滚蛋
你怎么骂人啊? 楼主单机?
你的IIC通信速率是多少?测过没? dhw5qq 发表于 2014-6-9 16:32
你怎么骂人啊?
你们经理说要隔离,显然是认为 干扰引起的。
以我的经验,你在测试阶段,应该是在公司,这时候哪来的干扰。现场去了,你的整个系统还不崩溃了? 如果是干扰,隔离用处不大,还不如用屏蔽线。 gliet_su 发表于 2014-6-9 22:37
如果是干扰,隔离用处不大,还不如用屏蔽线。
就是读取到的数据有时候是ff,不知道怎么解决! 想问下,你的从设备是硬件I2C还是软件I2C lyrics131415 发表于 2014-6-9 16:54
楼主单机?
你的IIC通信速率是多少?测过没?
差不多10KHZ吧,
funnybow 发表于 2014-6-10 09:29
想问下,你的从设备是硬件I2C还是软件I2C
从机是硬接口,主机是软件模拟的时序,差不多10khz的频率! dhw5qq 发表于 2014-6-10 09:49
从机是硬接口,主机是软件模拟的时序,差不多10khz的频率!
上拉电阻取的多少K? lyrics131415 发表于 2014-6-10 10:32
上拉电阻取的多少K?
10K。我主机是4.9v供电,我从机是3.3v供电!
是不是你这个太慢了,任何硬件的I2C应该至少100k的速率 一次完整的通信过程要快速点完成 funnybow 发表于 2014-6-10 10:47
一次完整的通信过程要快速点完成
那一次你指的是,我发出命令后要立即读取吗?
funnybow 发表于 2014-6-10 10:47
一次完整的通信过程要快速点完成
这个通讯我刚才是用分析仪看了下,发现16次数据和命令传输要3s,然后我的液晶刷新的时间是2s! 一次完整的通信就是重开始到结束啊 dhw5qq 发表于 2014-6-10 10:36
10K。我主机是4.9v供电,我从机是3.3v供电!
有加电平转换吗?信号上升下降沿什么情况(2边都看下)? dhw5qq 发表于 2014-6-10 10:36
10K。我主机是4.9v供电,我从机是3.3v供电!
不用两边都上拉,一边就可以了
如果在5V上拉,建议用3.3K
如果在3.3V上拉,建议用1.5K 为什么需要延时?延时并不会使数据更稳定,按照I2C时序,直接读写即可。
另外,在I2C初始化的时候,一定要记得加上防止总线锁死的处理。 kevin_me 发表于 2014-6-10 21:03
为什么需要延时?延时并不会使数据更稳定,按照I2C时序,直接读写即可。
另外,在I2C初始化的时候,一定要 ...
实际上延迟是有必要的,我试过 了,当你的延迟不够的时候,读取出来的数据就是ff,因为你的从器件根本就和你的单片机速率不能同步, dhw5qq 发表于 2014-6-16 07:58
实际上延迟是有必要的,我试过 了,当你的延迟不够的时候,读取出来的数据就是ff,因为你的从器件根本就 ...
解决没有?
我说的重点是防止I2C锁死,MCU上电之后将SCK作为IO口,输出9个周期的时钟脉冲。
给你看个文章《I2C死锁原因及解决方法》,CSDN上的,不一定是导致你通信问题的直接原因,但绝对有影响。
页:
[1]