75

帖子

0

TA的资源

一粒金砂(中级)

21
 
littleshrimp 发表于 2017-10-10 22:42
"我现在按照此段代码进行循坏,打印LSM6DSL_CTRL3_C的寄存器的值发现读出来的值是4而不是我要的1.因为PRO ...

你分析的是有道理的,我也是在想写是不是有问题,我到底有没有写入sw_reset为,到底有没有复位成功。我没看仔细,IF_INC这一位默认是1。我按照你的方法试着做下实验,看能不能写入成功。
 
 

回复

75

帖子

0

TA的资源

一粒金砂(中级)

22
 
littleshrimp 发表于 2017-10-10 22:42
"我现在按照此段代码进行循坏,打印LSM6DSL_CTRL3_C的寄存器的值发现读出来的值是4而不是我要的1.因为PRO ...

我按照你的方法实验了下,发现SW_RESET这个位就是写入不成功,但是写BDU这位却是写入成功,用的都是一样的写函数。所以就是没有复位,问题应该就是出在这里,没有复位成功。不知道什么原因sw_reset就是没写成功导致复位不了。@littleshrimp @yujie2510 @lb8820265

SW_RESET写入代码.png (19.52 KB, 下载次数: 1)

SW_RESET写驱动

SW_RESET写驱动

实验串口打印.png (94.7 KB, 下载次数: 0)

串口打印log

串口打印log

实验驱动代码.png (24.84 KB, 下载次数: 0)

驱动代码

驱动代码

bdu驱动代码.png (17.38 KB, 下载次数: 2)

bdu驱动代码.png

点评

如果BDU写1再读回来还是1的话证明你的I2C读写是正常的 SW_RESET位一搬没法通过回读判断是否操作成功,因为这个位是自动清0的 验证SW_RESET位是否写入成功的方法是: 1、向DBU写1, 2、读取BDU为1时证明写入成功  详情 回复 发表于 2017-10-11 12:14
 
 
 

回复

9717

帖子

24

TA的资源

版主

23
 
本帖最后由 littleshrimp 于 2017-10-11 12:16 编辑
xieyj 发表于 2017-10-11 11:23
我按照你的方法实验了下,发现SW_RESET这个位就是写入不成功,但是写BDU这位却是写入成功,用的都是一样 ...

如果BDU写1再读回来还是1的话证明你的I2C读写是正常的
SW_RESET位一搬没法通过回读判断是否操作成功,因为这个位是自动清0的
验证SW_RESET位是否写入成功的方法是:
1、向DBU写1,
2、读取BDU为1时证明写入成功
3、向SW_RESET写1
4、延时一段时间
5、读取DBU,如果为0证明复位成功


如果你的I2C读写操作成功就要看一下初始化配置了
参考SensorTile对LSM6DSM的操作
1、判断WHO AM I这一步你已经验证过了
2、往CTRL3_C的IF_INC位写1,,使能多字节操作时地址自增,上电默认为1
3、使能CTRL3_C的BDU,此位为1时数据不断更新数据寄存器,为0时只有数据寄存器被读取过以后才更新,这一步不是必需
4、设置FIFO_CTRL5 的FIFO_MODE为Bypass mode. FIFO disabled.,这一步比较关键,和你遇到的问题相关,会影响你读取数据是否正确
5、设置CTRL2_G的ODR_G,这一步也比较关键,和你遇到的问题相关,只有在选择非Power down模式才能正常工作(CTRL2_G是陀螺仪控制寄存器,只针对陀螺仪有效,加速度需要设置与加速度寄存器相关的寄存器)
6、设置CTRL2_G的FS_G,此处操作对你读不到数据没有影响
7、读取数据时读取寄存器OUTX_L_G,OUT?_?_G数据

点评

附件是主函数代码,看看有什么问题  详情 回复 发表于 2017-10-11 16:26
按照你说的方法设置,我在复位之前加了100us的延时,发现复位成功了,看图中的串口打印chip_rst3值是4说明已经复位成功了。前面的Read result5 Read result6赋值也是成功的。但是接下来的BDU赋值以及后面的ODR设置不  详情 回复 发表于 2017-10-11 16:23
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 
 

回复

46

帖子

0

TA的资源

一粒金砂(中级)

24
 
xieyj 发表于 2017-10-11 10:37
第二段是读取的波形,第一段是写的。

不对啊,第二段波形怎么看都是写的操作啊。
虽然第一第三波形,你的描述和文件名不一致,但从波形来看都是读操作。

点评

对的第二段是写的  详情 回复 发表于 2017-10-11 16:26
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(中级)

25
 
littleshrimp 发表于 2017-10-11 12:14
如果BDU写1再读回来还是1的话证明你的I2C读写是正常的
SW_RESET位一搬没法通过回读判断是否操作成功,因 ...

按照你说的方法设置,我在复位之前加了100us的延时,发现复位成功了,看图中的串口打印chip_rst3值是4说明已经复位成功了。前面的Read result5 Read result6赋值也是成功的。但是接下来的BDU赋值以及后面的ODR设置不知道什么原因一直赋值不成功。理论上按照上面的赋值CTRL1_XL寄存器的值应该是00011000=24 CTRL2_G寄存器的值应该是00101100=44.

串口3打印.png (74.19 KB, 下载次数: 0)

串口3打印.png

点评

分析了一下你的代码和测试结果,感觉问题还是出在I2C通信上(或者器件损坏?可能性不大) 你可以重点检查一下yujie2510[/backcolor]说的时序问题,确定通信正确如果有条件可以换个器件试试 另外你在测试时使用LOGI  详情 回复 发表于 2017-10-11 17:43
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(中级)

26
 
littleshrimp 发表于 2017-10-11 12:14
如果BDU写1再读回来还是1的话证明你的I2C读写是正常的
SW_RESET位一搬没法通过回读判断是否操作成功,因 ...

附件是主函数代码,看看有什么问题

icm30630.c

8.25 KB, 下载次数: 5

LSM6DSM主函数代码

 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(中级)

27
 
yujie2510 发表于 2017-10-11 12:36
不对啊,第二段波形怎么看都是写的操作啊。
虽然第一第三波形,你的描述和文件名不一致,但从波形来看都 ...

对的第二段是写的
 
 
 

回复

9717

帖子

24

TA的资源

版主

28
 
本帖最后由 littleshrimp 于 2017-10-11 17:47 编辑
xieyj 发表于 2017-10-11 16:23
按照你说的方法设置,我在复位之前加了100us的延时,发现复位成功了,看图中的串口打印chip_rst3值是4说 ...

分析了一下你的代码和测试结果,感觉问题还是出在I2C通信上(或者器件损坏?可能性不大)
你可以重点检查一下yujie2510说的时序问题,确定通信正确如果有条件可以换个器件试试
另外你在测试时使用LOGI输出提示字符写寄存地名称看起来更直观些,使用“chip_rst2”这样的代号对比起来比较麻烦

如果你确定已经把I2C的通信问题解决了可以试试下边的方法

1、使用简单I2C通信,向寄存器地址0x12写入0x01(CTRL3_C ->SW_RESET = 1)
     例如i2c_write_bytes(0x6b,0x12,0x01);器件地址(SLV_ADDRESS)为0x6b时(取决于pin1引脚的上下拉状态)
2、延时一段时间
3、读取全部寄存器数据,对比是否与数据手册声明的一致
4、向0x11写入0xac(CTRL2_G->ODR_G = 1010 = 6.66 kHz,FS_G = 11 =  2000dps)5、回读0x11地址,看数据是否为0xac
6、读取OUTX_L_G、OUTX_H_G等陀螺仪X\Y\Z轴数据看是否正确


  1.   lsm6dsl_block_data_update_set(&lsm6dsl_ctx, PROPERTY_ENABLE);
  2.         lsm6dsl_read_reg(&lsm6dsl_ctx, LSM6DSL_CTRL3_C, &buffer, 1);
  3.         LOGI("chip_rst1=%d\r\n",buffer);//0x68 01101000 //如果之前没对寄存器操作过,此处应该为0x44 01000100
  4.         lsm6dsl_read_reg(&lsm6dsl_ctx, LSM6DSL_FIFO_CTRL5, &buffer, 1);
  5.         LOGI("chip_rst2=%d\r\n",buffer);//0x00
  6.         hal_gpt_delay_us(100);
  7.         lsm6dsl_reset_set(&lsm6dsl_ctx, PROPERTY_ENABLE);
  8.         
  9.         //复位后最好加一段延时,等待复位完成再读取寄存器数据
  10.   lsm6dsl_read_reg(&lsm6dsl_ctx, LSM6DSL_CTRL3_C, &buffer, 1);
  11.         //hal_gpt_delay_us(100);
  12.         //hal_gpt_delay_ms(100);
  13.         LOGI("chip_rst3=%d\r\n",buffer);//0x04 //复位后CTRL3_C=0x04是正确的,前题是确定在执行lsm6dsl_read_reg(&lsm6dsl_ctx, LSM6DSL_CTRL3_C, &buffer, 1);前器件已经复位完成,最后在前边加一段延时
  14.         
  15.   do {
  16.     lsm6dsl_reset_get(&lsm6dsl_ctx, &rst);

  17.   } while (rst);
  18.         LOGI("chip_rst4=%x\r\n",rst);//0x00

  19.   //或者把读取CTRL3_C的操作放在这里

  20.         /*
  21.    *
  22.         Set xl Full Scale
  23.    */
  24.     hal_gpt_delay_us(100);
  25.    lsm6dsl_xl_full_scale_set(&lsm6dsl_ctx, FS_4g);
  26.         lsm6dsl_read_reg(&lsm6dsl_ctx, LSM6DSL_CTRL1_XL, &buffer, 1);
  27.         LOGI("Read result5:%d\n",buffer);//0x08 00001000 FS_XL=10(+-4g) //数据正确

  28.         /*
  29.    *  Set gyro Full Scale
  30.    */
  31.   lsm6dsl_gyro_full_scale_set(&lsm6dsl_ctx, FS_2000dps);//FS_2000dps = (xxxx)110(x)
  32.   lsm6dsl_read_reg(&lsm6dsl_ctx, LSM6DSL_CTRL2_G, &buffer, 1);
  33.         LOGI("Read result6:%d\n",buffer);//0x12 00010010  125Hz 125dps(这个地方是错的,读取和写入不一至)
  34.         
  35.         //以下读取数据都与写入不一至
  36.         /*
  37.    *  Enable Acc Block Data Update
  38.    */
  39.          
  40.          hal_gpt_delay_us(100);
  41.    lsm6dsl_block_data_update_set(&lsm6dsl_ctx, PROPERTY_ENABLE);
  42.          lsm6dsl_read_reg(&lsm6dsl_ctx, LSM6DSL_CTRL3_C, &buffer, 1);
  43.         LOGI("chip_rst7=%d\r\n",buffer);//0x00
  44.          
  45.         /*
  46.    * Set xl Output Data Rate
  47.    */
  48.          
  49.   lsm6dsl_xl_data_rate_set(&lsm6dsl_ctx, XL_12Hz5);
  50.         lsm6dsl_read_reg(&lsm6dsl_ctx, LSM6DSL_CTRL1_XL, &buffer, 1);
  51.         LOGI("Read result8:%d\n",buffer);//0x00
  52.         


  53.   /*
  54.    * Set gyro Output Data Rate
  55.    */
  56.   lsm6dsl_gyro_data_rate_set(&lsm6dsl_ctx, GY_26Hz);
  57.         lsm6dsl_read_reg(&lsm6dsl_ctx, LSM6DSL_CTRL2_G, &buffer, 1);
  58.         LOGI("Read result9:%d\n",buffer);//0x00
  59.   //lsm6dsl_gyro_data_rate_get(&lsm6dsl_ctx, testpp);
  60.         //LOGI("Read result4:%d\n",*testpp);
  61.   /*
  62.    * Read samples in polling mode (no int)
  63.    */
  64.         
复制代码


点评

按照你的方法我设置了下,现在读到数据了。只是不确定这数据是否对的。而且在我按照ST官方代码分段去设置GY的值,发现只要先设置了ODR就肯定写不进去FS,最后寄存器的值读到的是0.如果先设置FS的值,那ODR的值也设置  详情 回复 发表于 2017-10-12 15:29
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(中级)

29
 
littleshrimp 发表于 2017-10-11 17:43
分析了一下你的代码和测试结果,感觉问题还是出在I2C通信上(或者器件损坏?可能性不大)
你可以重点检 ...

按照你的方法我设置了下,现在读到数据了。只是不确定这数据是否对的。而且在我按照ST官方代码分段去设置GY的值,发现只要先设置了ODR就肯定写不进去FS,最后寄存器的值读到的是0.如果先设置FS的值,那ODR的值也设置不进去,最后读到寄存器的值也是0.所以我索性将8位数据直接写进寄存器后就可以读取数据了。不知道这个GY写进不去原因出在哪里。读取的数据如附件

串口打印log读出数据.png (92.07 KB, 下载次数: 0)

读到数据的log,看是否正确

读到数据的log,看是否正确

点评

你用的这个处理器应该没法在线调试吧?使用串口打印的方式分析起来比较麻烦 你可以试试我在6楼给你发的代码,这样应该能节省些时间 如果还使用现在这个代码,你可以试试在lsm6dsl_read_reg和lsm6dsl_write_reg函  详情 回复 发表于 2017-10-12 19:05
 
 
 

回复

9717

帖子

24

TA的资源

版主

30
 
xieyj 发表于 2017-10-12 15:29
按照你的方法我设置了下,现在读到数据了。只是不确定这数据是否对的。而且在我按照ST官方代码分段去设置 ...

你用的这个处理器应该没法在线调试吧?使用串口打印的方式分析起来比较麻烦
你可以试试我在6楼给你发的代码,这样应该能节省些时间

如果还使用现在这个代码,你可以试试在lsm6dsl_read_reg和lsm6dsl_write_reg函数里打印reg, data, len这三个变量看看结果

点评

我用的这个处理器可以仿真,单步调试的。只是我用的还不是很熟。现在读到的原始数据是正确的,没有问题。只是现在读到的只是两轴的数据,我现在需要改下代码读六轴数据。嗯,在参考你的代码。感谢帮助啊@littleshrim  详情 回复 发表于 2017-10-13 09:43
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(中级)

31
 
我用的这个处理器可以仿真,单步调试的。只是我用的还不是很熟。现在读到的原始数据是正确的,没有问题。只是现在读到的只是两轴的数据,我现在需要改下代码读六轴数据。嗯,在参考你的代码
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(中级)

32
 
littleshrimp 发表于 2017-10-12 19:05
你用的这个处理器应该没法在线调试吧?使用串口打印的方式分析起来比较麻烦
你可以试试我在6楼给你发的 ...

我用的这个处理器可以仿真,单步调试的。只是我用的还不是很熟。现在读到的原始数据是正确的,没有问题。只是现在读到的只是两轴的数据,我现在需要改下代码读六轴数据。嗯,在参考你的代码。感谢帮助啊@littleshrimp

点评

OK,有问题再交流  详情 回复 发表于 2017-10-13 12:09
 
 
 

回复

9717

帖子

24

TA的资源

版主

33
 
xieyj 发表于 2017-10-13 09:43
我用的这个处理器可以仿真,单步调试的。只是我用的还不是很熟。现在读到的原始数据是正确的,没有问题。 ...

OK,有问题再交流
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表