请问硬件上做什么处理好,软件上是不是要多读几次,然后做平滑处理呢!
qingbo ke:
我前几天也遇到过这样的问题,时序没错,但是有时候读出来数据不对,坐等高手解答
gang yang2:
回复 Cheng.W:
谢谢王工, 我最近一直在测试BQ3050的稳定性测试,把我数据读取后用上位机写到excel,经过一个星期的数据对比,发现数据还是会掉,所以我想请问一下,是不是只要按照EV2300的时序来进行读写就一定保证稳定了,软件上是否需要进行一定的处理呢!
gang yang2:
回复 Cheng.W:
假设我是bq3050的话,我是不是在发0x17之之后延迟2ms再去读?
gang yang2:
回复 gang yang2:
谢谢王工,我再试试!
gang yang2:
回复 gang yang2:
用示波器卡EV2300的波形,发现SCL周期是16us,也就是说iic的通讯速率是64khz左右,并没有规格书上所说的100khz, 而且ti读取一个电压数据差不多用了1ms,
gang yang2:
回复 gang yang2:
现在不会出现0XFFFF了,但是数据好像有错误,假设我电压数据,有时候读出来既不是ffff也不是正常的电压数据,是不是bq芯片数据没有更新啊!我现在把iic速率提高到64khz 了!
gang yang2:
回复 gang yang2:
请大家重视这个问题啊,如果是想用MCU做一些与电量计通讯的项目的话,这个问题肯定会遇到,大家有什么好的建议可以说出来啊
我这个以前读错的数据就是0xfff,现在读错的数据是其他莫名其妙的数据,所以我想这里面肯定有东西值得去研究!
gang yang2:
回复 gang yang2:
感谢ti,现在读取不会出错了,确实是我时序的问题,关键是读字节和写字节,一定要按照ti给的历程去操作, 关键的地方在于几个while
贴出关键的读字节和写字节
unsigned char MSP430_SWI2CMST_txByte(unsigned char data){ unsigned char bits, temp, ack; SCL_0; // SCL = 0 temp = data; // Initialize temp variable bits = 0x08; // Load I2C bit counter while (bits != 0x00) // Loop until all bits are shifted { if (temp & BIT7) // Test data bit SDA_1; // SDA = 1 else SDA_0; // SDA = 0 I2CDELAY; // Quick delay SCL_1; // SCL = 1 while ((PxIN & SCL) == 0); // Wait for any SCL clock stretching I2CDELAY; // Quick delay temp = (temp << 1); // Shift bits 1 place to the left SCL_0; // SCL = 0 bits = (bits – 1); // Loop until 8 bits are sent } I2CDELAY; SDA_1; // SDA = 1 SCL_1; // SCL = 1 while ((PxIN & SCL) == 0); // Wait for any SCL clock stretching I2CDELAY; // Quick delay ack = (PxIN & SDA); // Read ACK state from Slave SCL_0; // SCL = 0 if (ack) // Return ACK state to calling app return (1); else return (0);}
unsigned char MSP430_SWI2CMST_rxByte(char ack){ unsigned char bits, data = 0;
SDA_1; // SDA = 1 bits = 0x08; // Load I2C bit counter while (bits > 0) // Loop until all bits are read { SCL_1; // SCL = 1 while ((PxIN & SCL) == 0); // Wait for any SCL clock stretching I2CDELAY; // Quick delay data = (data << 1); // Shift bits 1 place to the left if (PxIN & SDA) // Check digital input data = (data + 1); // If input is high, store a '1' SCL_0; // SCL = 0 I2CDELAY; // Quick delay bits = (bits – 1); // Decrement I2C bit counter } if (ack) // Need to send ACK to Slave? SDA_0; // Yes, so pull SDA low else SDA_1; // No, so keep SDA high SCL_1; // SCL = 1 I2CDELAY; // Equivalent to sending N(ACK) SCL_0; // SCL = 0 SDA_1; // SDA = 1
return (data); // Return 8-bit data byte}
Cheng.W:
回复 gang yang2:
感谢您的贡献.