你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

使用LSM6DS3TR-C的FIFO,读取数据出错

[复制链接]
Twelve 提问时间:2022-5-20 15:14 / 已解决
    使用LSM6DS3TR-CFIFO,先获取了FIFOWaterM标志,该标志置位之后再去获取当前存在FIFO缓存的数据长度,再去读取FIFO中对应长度的数据,会出现读取数据出错的现象;


配置为:
    accel full scale: 8g
    gyro full scale: 2000dps
    accel odr: 104Hz
    gyro odr: 104Hz
    fifo: gyro、accel、ds3 and ds4 no decimation
    fifo odr: 104Hz
    fifo threshold level: 24 * 80
    fifo mode: Continuous mode (110)

以下测试数据均在设备不移动的前提下;


正常数据如下:

normal

normal


错误数据如下:

abnormal

abnormal


相关代码如下:

core

core

收藏 评论9 发布时间:2022-5-20 15:14

举报

9个回答
Twelve 最优答案 回答时间:2022-6-8 09:43:00
[size=14.6667px]

  • Read water mark
  • Disable fifo stop on threshold
  • Read fifo length L.
  • Read first date pattern
  • If (pattern == 0 )  go to G
  • If (pattern!=0) , read data from pattern number to 8 (maximum pattern number in you configure -three sensor), EX, first pattern is 3 , you should read data bytes of  (8-3+1)*2 ,and discard all these fifo data.   Re-caculate the number of date left in fifo , L_left ,             U16 (L_left/8)
  • Read fifo data u16(L or L_left/8)
  • Enable stop on fifo threshold

废鱼 回答时间:2022-5-26 08:25:20
Twelve 发表于 2022-5-24 17:43
这个波形不是很好抓,因为fifo读取的数据比较大,而且这个问题并不是必现,错误的数据偶尔会出现,随机性 ...

我在用LDS3的时候,就犯过一个错误,因为I2C驱动写的不好,导致读取标志位时,多读取了两个字节的加速度值寄存器,比如X寄存器。发生的问题就是加速度的值会有一定几率是不对的。修改I2C驱动后,解决该问题。
废鱼 回答时间:2022-5-21 09:02:15
改成一次性把所有数据都读取出来试试。然再进行数据内容判断和处理。
Twelve 回答时间:2022-5-23 09:46:18
废鱼 发表于 2022-5-21 09:02
改成一次性把所有数据都读取出来试试。然再进行数据内容判断和处理。

这就是一次性从sensor中把所有数据读出来的结果,对读出的数据做处理判断过滤是可以,但治标不治本,还是希望能找到问题的根因;thx
废鱼 回答时间:2022-5-24 13:39:17
Twelve 发表于 2022-5-23 09:46
这就是一次性从sensor中把所有数据读出来的结果,对读出的数据做处理判断过滤是可以,但治标不治本,还是 ...

用示波器看一下读取I2C的过程,一定要注意不要把数据寄存器读取。一旦发生数据寄存器读取后,在下次数据转换完成前,这里面的数据是错误的。
Twelve 回答时间:2022-5-24 17:43:06
废鱼 发表于 2022-5-24 13:39
用示波器看一下读取I2C的过程,一定要注意不要把数据寄存器读取。一旦发生数据寄存器读取后,在下次数据 ...

这个波形不是很好抓,因为fifo读取的数据比较大,而且这个问题并不是必现,错误的数据偶尔会出现,随机性比较高,波形不好抓到刚好出错的时候;这边条件限制,手头也没有逻辑分析仪;
你说的一定要注意不要把数据寄存器读取指的是什么,不好意思,这里没理解;
读fifo数据前,我会先去去waterM这个标志,这个标志被置位的话,证明imu的fifo数据准备好了(或者换句话说满了),然后我再去读当前能读取的数据有多少个字节,然后再按这个字节数长度去读FIFO的;
st_yujie2510 回答时间:2022-5-26 09:30:06
读取FIFO数据的时候,要以6的整数倍读取?如果对数据的实时性要求不是特别高,可以试着保证读完FIFO后,FIFO里还有数据:比如FIFO长度为11时,只读6个字节;如果FIFO长度为12时,也只读6个字节;如果FIFO为13时,读12个字节。
Twelve 回答时间:2022-5-26 10:21:15
st_yujie2510 发表于 2022-5-26 09:30
读取FIFO数据的时候,要以6的整数倍读取?如果对数据的实时性要求不是特别高,可以试着保证读完FIFO后,FIF ...

有的,我设置的threshold是24*80=1920byte,每次读取前先判断了watermark标志位,该标志置位之后就获取data的长度,每次打印出来都是1920个byte,24byte对齐的;
Twelve 回答时间:2022-5-26 10:24:26
废鱼 发表于 2022-5-26 08:25
我在用LDS3的时候,就犯过一个错误,因为I2C驱动写的不好,导致读取标志位时,多读取了两个字节的加速度 ...

按目前的分析来看,我觉得你说的这个可能性比较大了,但是我们用的i2c驱动是linux的驱动,理论上应该是不会有问题,这个i2c驱动code的review你有什么建议吗?
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版