社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
  • 干货
搜索
查看: 1779|回复: 32

[其他] 关于LSM6DSM传感器驱动,求助

  [复制链接]

80

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-10-9 20:03:27 | 显示全部楼层 |阅读模式
我司项目现在用的传感器是LSM6DSM,在MTK2523平台上使用,I2C已经调通可以读写寄存器,可以读到chip ID。现在的问题是读不到ACC+GYO三轴的数据,串口打印的都是0.使用的代码是论坛上下载的LSM6DSL_ver1.8中的ReadData.C。按照LSM6DSL_ver1.8中的ReadData.C去配置xl Output Data Rate和gyro Output Data Rate,Enable Acc Block Data Update都没配置成功,读寄存器的数据都是0.现我做了个试验,直接对CTRL1_XL赋值27 二进制:00011011。直接对CTRL2_G 赋值34二进制: 00100010,按照规格书所讲的是使能了这两个寄存器,应该可以输出数据,但是串口打印出来的数据却都是0。现在对于怎么调通这个驱动没有头绪了,没有方向修改,请求帮助,指点,感谢!附上我修改的代码
QQ图片20171009200304.png

icm30630.c

8.17 KB, 下载次数: 23

lsm6dsl_reg.c

150.4 KB, 下载次数: 14

lsm6dsl_reg.h

46.8 KB, 下载次数: 11



回复

使用道具 举报

595

TA的帖子

3

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-10-9 20:12:28 | 显示全部楼层
最近写的一份驱动,核心逻辑60行,其中大部分还是废话。

  1. #ifndef __LSM6DS3_H_INCLUDED__
  2. #define __LSM6DS3_H_INCLUDED__

  3. #include "i2c_bus.h"

  4. struct lsm6ds3_info_t
  5. {
  6.         struct i2c_bus_t *i2c_bus;
  7.         uint8_t i2c_addr;
  8.        
  9.         // private
  10.         uint8_t error;
  11.        
  12.         struct vsfsm_t xfer_sm;
  13.         struct vsfsm_pt_t xfer_pt;
  14. };

  15. void lsm6ds3_init(struct lsm6ds3_info_t *info);


  16. #endif // __LSM6DS3_H_INCLUDED__
复制代码

  1. #include "vsf.h"
  2. #include "usrapp.h"

  3. #define LSM6DS3_ACC_GYRO_FUNC_CFG_ACCESS    0X01
  4. #define LSM6DS3_ACC_GYRO_SENSOR_SYNC_TIME   0X04
  5. #define LSM6DS3_ACC_GYRO_FIFO_CTRL1   0X06
  6. #define LSM6DS3_ACC_GYRO_FIFO_CTRL2   0X07
  7. #define LSM6DS3_ACC_GYRO_FIFO_CTRL3   0X08
  8. #define LSM6DS3_ACC_GYRO_FIFO_CTRL4   0X09
  9. #define LSM6DS3_ACC_GYRO_FIFO_CTRL5   0X0A
  10. #define LSM6DS3_ACC_GYRO_ORIENT_CFG_G   0X0B
  11. #define LSM6DS3_ACC_GYRO_INT1_CTRL    0X0D
  12. #define LSM6DS3_ACC_GYRO_INT2_CTRL    0X0E
  13. #define LSM6DS3_ACC_GYRO_WHO_AM_I_REG   0X0F
  14. #define LSM6DS3_ACC_GYRO_CTRL1_XL   0X10
  15. #define LSM6DS3_ACC_GYRO_CTRL2_G    0X11
  16. #define LSM6DS3_ACC_GYRO_CTRL3_C    0X12
  17. #define LSM6DS3_ACC_GYRO_CTRL4_C    0X13
  18. #define LSM6DS3_ACC_GYRO_CTRL5_C    0X14
  19. #define LSM6DS3_ACC_GYRO_CTRL6_G    0X15
  20. #define LSM6DS3_ACC_GYRO_CTRL7_G    0X16
  21. #define LSM6DS3_ACC_GYRO_CTRL8_XL   0X17
  22. #define LSM6DS3_ACC_GYRO_CTRL9_XL   0X18
  23. #define LSM6DS3_ACC_GYRO_CTRL10_C   0X19
  24. #define LSM6DS3_ACC_GYRO_MASTER_CONFIG    0X1A
  25. #define LSM6DS3_ACC_GYRO_WAKE_UP_SRC    0X1B
  26. #define LSM6DS3_ACC_GYRO_TAP_SRC    0X1C
  27. #define LSM6DS3_ACC_GYRO_D6D_SRC    0X1D
  28. #define LSM6DS3_ACC_GYRO_STATUS_REG   0X1E
  29. #define LSM6DS3_ACC_GYRO_OUT_TEMP_L   0X20
  30. #define LSM6DS3_ACC_GYRO_OUT_TEMP_H   0X21
  31. #define LSM6DS3_ACC_GYRO_OUTX_L_G   0X22
  32. #define LSM6DS3_ACC_GYRO_OUTX_H_G   0X23
  33. #define LSM6DS3_ACC_GYRO_OUTY_L_G   0X24
  34. #define LSM6DS3_ACC_GYRO_OUTY_H_G   0X25
  35. #define LSM6DS3_ACC_GYRO_OUTZ_L_G   0X26
  36. #define LSM6DS3_ACC_GYRO_OUTZ_H_G   0X27
  37. #define LSM6DS3_ACC_GYRO_OUTX_L_XL    0X28
  38. #define LSM6DS3_ACC_GYRO_OUTX_H_XL    0X29
  39. #define LSM6DS3_ACC_GYRO_OUTY_L_XL    0X2A
  40. #define LSM6DS3_ACC_GYRO_OUTY_H_XL    0X2B
  41. #define LSM6DS3_ACC_GYRO_OUTZ_L_XL    0X2C
  42. #define LSM6DS3_ACC_GYRO_OUTZ_H_XL    0X2D
  43. #define LSM6DS3_ACC_GYRO_SENSORHUB1_REG   0X2E
  44. #define LSM6DS3_ACC_GYRO_SENSORHUB2_REG   0X2F
  45. #define LSM6DS3_ACC_GYRO_SENSORHUB3_REG   0X30
  46. #define LSM6DS3_ACC_GYRO_SENSORHUB4_REG   0X31
  47. #define LSM6DS3_ACC_GYRO_SENSORHUB5_REG   0X32
  48. #define LSM6DS3_ACC_GYRO_SENSORHUB6_REG   0X33
  49. #define LSM6DS3_ACC_GYRO_SENSORHUB7_REG   0X34
  50. #define LSM6DS3_ACC_GYRO_SENSORHUB8_REG   0X35
  51. #define LSM6DS3_ACC_GYRO_SENSORHUB9_REG   0X36
  52. #define LSM6DS3_ACC_GYRO_SENSORHUB10_REG    0X37
  53. #define LSM6DS3_ACC_GYRO_SENSORHUB11_REG    0X38
  54. #define LSM6DS3_ACC_GYRO_SENSORHUB12_REG    0X39
  55. #define LSM6DS3_ACC_GYRO_FIFO_STATUS1   0X3A
  56. #define LSM6DS3_ACC_GYRO_FIFO_STATUS2   0X3B
  57. #define LSM6DS3_ACC_GYRO_FIFO_STATUS3   0X3C
  58. #define LSM6DS3_ACC_GYRO_FIFO_STATUS4   0X3D
  59. #define LSM6DS3_ACC_GYRO_FIFO_DATA_OUT_L    0X3E
  60. #define LSM6DS3_ACC_GYRO_FIFO_DATA_OUT_H    0X3F
  61. #define LSM6DS3_ACC_GYRO_TIMESTAMP0_REG   0X40
  62. #define LSM6DS3_ACC_GYRO_TIMESTAMP1_REG   0X41
  63. #define LSM6DS3_ACC_GYRO_TIMESTAMP2_REG   0X42

  64. #define LSM6DS3_ACC_GYRO_TIMESTAMP_L    0X49
  65. #define LSM6DS3_ACC_GYRO_TIMESTAMP_H    0X4A

  66. #define LSM6DS3_ACC_GYRO_STEP_COUNTER_L   0X4B
  67. #define LSM6DS3_ACC_GYRO_STEP_COUNTER_H   0X4C

  68. #define LSM6DS3_ACC_GYRO_SENSORHUB13_REG    0X4D
  69. #define LSM6DS3_ACC_GYRO_SENSORHUB14_REG    0X4E
  70. #define LSM6DS3_ACC_GYRO_SENSORHUB15_REG    0X4F
  71. #define LSM6DS3_ACC_GYRO_SENSORHUB16_REG    0X50
  72. #define LSM6DS3_ACC_GYRO_SENSORHUB17_REG    0X51
  73. #define LSM6DS3_ACC_GYRO_SENSORHUB18_REG    0X52

  74. #define LSM6DS3_ACC_GYRO_FUNC_SRC   0X53
  75. #define LSM6DS3_ACC_GYRO_TAP_CFG1   0X58
  76. #define LSM6DS3_ACC_GYRO_TAP_THS_6D   0X59
  77. #define LSM6DS3_ACC_GYRO_INT_DUR2   0X5A
  78. #define LSM6DS3_ACC_GYRO_WAKE_UP_THS    0X5B
  79. #define LSM6DS3_ACC_GYRO_WAKE_UP_DUR    0X5C
  80. #define LSM6DS3_ACC_GYRO_FREE_FALL    0X5D
  81. #define LSM6DS3_ACC_GYRO_MD1_CFG    0X5E
  82. #define LSM6DS3_ACC_GYRO_MD2_CFG    0X5F

  83. #define VSFSM_EVT_LSM6DS3_XFER_DONE                (VSFSM_EVT_USER_LOCAL + 1)
  84. #define VSFSM_EVT_LSM6DS3_POLL                        (VSFSM_EVT_USER_LOCAL + 2)

  85. static void lsm6ds3_callback(void *param, int32_t err)
  86. {
  87.         struct lsm6ds3_info_t *info = param;
  88.        
  89.         if (err == 0)
  90.                 info->error = 0;
  91.         else
  92.                 info->error++;
  93.         vsfsm_post_evt_pending(&info->xfer_sm, VSFSM_EVT_LSM6DS3_XFER_DONE);
  94. }

  95. static vsf_err_t lsm6ds3_thread(struct vsfsm_pt_t *pt, vsfsm_evt_t evt)
  96. {
  97.         struct lsm6ds3_info_t *info = pt->user_data;
  98.         struct i2c_bus_t *i2c_bus = info->i2c_bus;

  99.         vsfsm_pt_begin(pt);       
  100.        
  101.         vsfsm_pt_delay(pt, 100);
  102.        
  103.         // IC probe
  104.         vsfhal_i2c_config_cb(i2c_bus->index, info, lsm6ds3_callback);
  105.         i2c_bus->msg[0].flag = VSFHAL_I2C_WRITE;
  106.         i2c_bus->msg[0].buf = i2c_bus->temp;
  107.         i2c_bus->msg[0].len = 2;
  108.         i2c_bus->temp[0] = LSM6DS3_ACC_GYRO_FUNC_CFG_ACCESS;
  109.         i2c_bus->temp[1] = 0x0;
  110.         do
  111.         {
  112.                 vsfhal_i2c_xfer(i2c_bus->index, info->i2c_addr, i2c_bus->msg, 1);
  113.                 vsfsm_pt_wfe(pt, VSFSM_EVT_LSM6DS3_XFER_DONE);
  114.         } while (info->error && (info->error < 3));
  115.        
  116.         if (info->error)
  117.                 return VSFERR_FAIL;
  118.        
  119.         // Enable BDU and IF_INC
  120.         i2c_bus->temp[0] = LSM6DS3_ACC_GYRO_CTRL3_C;
  121.         i2c_bus->temp[1] = 0x44;
  122.         vsfhal_i2c_xfer(i2c_bus->index, info->i2c_addr, i2c_bus->msg, 1);
  123.         vsfsm_pt_wfe(pt, VSFSM_EVT_LSM6DS3_XFER_DONE);
  124.        
  125.         // Disable FIFO
  126.         i2c_bus->temp[0] = LSM6DS3_ACC_GYRO_FIFO_CTRL5;
  127.         i2c_bus->temp[1] = 0x0;
  128.         vsfhal_i2c_xfer(i2c_bus->index, info->i2c_addr, i2c_bus->msg, 1);
  129.         vsfsm_pt_wfe(pt, VSFSM_EVT_LSM6DS3_XFER_DONE);
  130.        
  131.         // Set rate: 416Hz; FS_XL: +- 8G;
  132.         i2c_bus->temp[0] = LSM6DS3_ACC_GYRO_CTRL1_XL;
  133.         i2c_bus->temp[1] = (0x3 << 2) | (0x6 << 4);
  134.         vsfhal_i2c_xfer(i2c_bus->index, info->i2c_addr, i2c_bus->msg, 1);
  135.         vsfsm_pt_wfe(pt, VSFSM_EVT_LSM6DS3_XFER_DONE);
  136.        
  137.         // Set rate: 416Hz; FS_G: 2000;
  138.         i2c_bus->temp[0] = LSM6DS3_ACC_GYRO_CTRL2_G;
  139.         i2c_bus->temp[1] = (0x3 << 2) | (0x6 << 4);
  140.         vsfhal_i2c_xfer(i2c_bus->index, info->i2c_addr, i2c_bus->msg, 1);
  141.         vsfsm_pt_wfe(pt, VSFSM_EVT_LSM6DS3_XFER_DONE);
  142.        
  143.         // Read data
  144.         i2c_bus->msg[0].len = 1;
  145.         i2c_bus->temp[0] = LSM6DS3_ACC_GYRO_OUTX_L_G;
  146.         i2c_bus->msg[1].flag = VSFHAL_I2C_READ;
  147.         i2c_bus->msg[1].buf = i2c_bus->temp + 4;
  148.         i2c_bus->msg[1].len = 12;
  149.        
  150.         vsftimer_create(pt->sm, 4, -1, VSFSM_EVT_LSM6DS3_POLL);
  151.         do
  152.         {
  153.                 vsfsm_pt_wfe(pt, VSFSM_EVT_LSM6DS3_POLL);
  154.                 vsfhal_i2c_xfer(i2c_bus->index, info->i2c_addr, i2c_bus->msg, 2);
  155.                 vsfsm_pt_wfe(pt, VSFSM_EVT_LSM6DS3_XFER_DONE);
  156.                 gyro_acc_data_input(i2c_bus->msg[1].buf, 12);
  157.         } while (1);

  158.         vsfsm_pt_end(pt);       
  159.         return VSFERR_NONE;
  160. }


  161. void lsm6ds3_init(struct lsm6ds3_info_t *info)
  162. {
  163.         info->xfer_pt.thread = lsm6ds3_thread;
  164.         info->xfer_pt.user_data = info;
  165.         vsfsm_pt_init(&info->xfer_sm, &info->xfer_pt);
  166. }
复制代码
京微齐力HME-M7——单片机开发者的进阶之选


回复

使用道具 举报

80

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-10-10 09:36:18 | 显示全部楼层
大概看了下这份代码结构和我的代码差异较大啊


回复

使用道具 举报

6833

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2017-10-10 10:17:18 | 显示全部楼层
ID可以读取,说明通信是好的,那问题多半还在参数设置上了。如果有条件,可以抓取I2C的数据和波形看看,看有没有异常。

另外也可以试试micropython,用mpy调试传感器是最方便的。


回复

使用道具 举报

80

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-10-10 11:33:08 | 显示全部楼层
dcexpert 发表于 2017-10-10 10:17
ID可以读取,说明通信是好的,那问题多半还在参数设置上了。如果有条件,可以抓取I2C的数据和波形看看,看 ...

直接对CTRL1_XL和CTRL2_G赋值,I2C抓取的波形都是和我设置的数值是对应上的,没有异常。可能ST驱动代码需要改,但不知道怎么改才能通。


回复

使用道具 举报

5074

TA的帖子

9

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-10-10 13:15:44 | 显示全部楼层
读取WHO_AM_I(0x0F)得到的值是0x6A对吗?


在写好配置寄存器后把数据再读出来对比过没?

下边是SensorTile中配置LSM6DSM的函数你参考一下
  1. /**
  2. * [url=home.php?mod=space&uid=159083]@brief[/url] Initialize the LSM6DSM gyroscope sensor
  3. * @param handle the device handle
  4. * @retval COMPONENT_OK in case of success
  5. * @retval COMPONENT_ERROR in case of failure
  6. */
  7. static DrvStatusTypeDef LSM6DSM_G_Init( DrvContextTypeDef *handle )
  8. {

  9.   GYRO_Data_t *pData = ( GYRO_Data_t * )handle->pData;
  10.   LSM6DSM_G_Data_t *pComponentData = ( LSM6DSM_G_Data_t * )pData->pComponentData;
  11.   LSM6DSM_Combo_Data_t *comboData = pComponentData->comboData;
  12.   
  13.   if ( LSM6DSM_Check_WhoAmI( handle ) == COMPONENT_ERROR )
  14.   {
  15.     return COMPONENT_ERROR;
  16.   }
  17.   
  18.   /* Enable register address automatically incremented during a multiple byte
  19.      access with a serial interface. */
  20.   if ( LSM6DSM_ACC_GYRO_W_IF_Addr_Incr( (void *)handle, LSM6DSM_ACC_GYRO_IF_INC_ENABLED ) == MEMS_ERROR )
  21.   {
  22.     return COMPONENT_ERROR;
  23.   }
  24.   
  25.   /* Enable BDU */
  26.   if ( LSM6DSM_ACC_GYRO_W_BDU( (void *)handle, LSM6DSM_ACC_GYRO_BDU_BLOCK_UPDATE ) == MEMS_ERROR )
  27.   {
  28.     return COMPONENT_ERROR;
  29.   }
  30.   
  31.   /* FIFO mode selection */
  32.   if ( LSM6DSM_ACC_GYRO_W_FIFO_MODE( (void *)handle, LSM6DSM_ACC_GYRO_FIFO_MODE_BYPASS ) == MEMS_ERROR )
  33.   {
  34.     return COMPONENT_ERROR;
  35.   }
  36.   
  37.   /* Select default output data rate. */
  38.   pComponentData->Previous_ODR = 104.0f;
  39.   
  40.   /* Output data rate selection - power down */
  41.   if ( LSM6DSM_ACC_GYRO_W_ODR_G( (void *)handle, LSM6DSM_ACC_GYRO_ODR_G_POWER_DOWN ) == MEMS_ERROR )
  42.   {
  43.     return COMPONENT_ERROR;
  44.   }
  45.   
  46.   /* Full scale selection. */
  47.   if ( LSM6DSM_G_Set_FS( handle, FS_HIGH ) == COMPONENT_ERROR )
  48.   {
  49.     return COMPONENT_ERROR;
  50.   }

  51.   comboData->isGyroInitialized = 1;

  52.   handle->isInitialized = 1;
  53.   
  54.   return COMPONENT_OK;
  55. }
复制代码


读取函数

  1. /**
  2. * @brief Get the LSM6DSM gyroscope sensor axes
  3. * @param handle the device handle
  4. * @param angular_velocity pointer where the values of the axes are written
  5. * @retval COMPONENT_OK in case of success
  6. * @retval COMPONENT_ERROR in case of failure
  7. */
  8. static DrvStatusTypeDef LSM6DSM_G_Get_Axes( DrvContextTypeDef *handle, SensorAxes_t *angular_velocity )
  9. {

  10.   int16_t dataRaw[3];
  11.   float   sensitivity = 0;
  12.   
  13.   /* Read raw data from LSM6DSM output register. */
  14.   if ( LSM6DSM_G_Get_Axes_Raw( handle, dataRaw ) == COMPONENT_ERROR )
  15.   {
  16.     return COMPONENT_ERROR;
  17.   }
  18.   
  19.   /* Get LSM6DSM actual sensitivity. */
  20.   if ( LSM6DSM_G_Get_Sensitivity( handle, &sensitivity ) == COMPONENT_ERROR )
  21.   {
  22.     return COMPONENT_ERROR;
  23.   }
  24.   
  25.   /* Calculate the data. */
  26.   angular_velocity->AXIS_X = ( int32_t )( dataRaw[0] * sensitivity );
  27.   angular_velocity->AXIS_Y = ( int32_t )( dataRaw[1] * sensitivity );
  28.   angular_velocity->AXIS_Z = ( int32_t )( dataRaw[2] * sensitivity );
  29.   
  30.   return COMPONENT_OK;
  31. }
复制代码


在读取前执行LSM6DSM_G_Sensor_Enable函数

  1. /**
  2. * @brief Enable the LSM6DSM gyroscope sensor
  3. * @param handle the device handle
  4. * @retval COMPONENT_OK in case of success
  5. * @retval COMPONENT_ERROR in case of failure
  6. */
  7. static DrvStatusTypeDef LSM6DSM_G_Sensor_Enable( DrvContextTypeDef *handle )
  8. {
  9.   GYRO_Data_t *pData = ( GYRO_Data_t * )handle->pData;
  10.   LSM6DSM_G_Data_t *pComponentData = ( LSM6DSM_G_Data_t * )pData->pComponentData;
  11.   
  12.   /* Check if the component is already enabled */
  13.   if ( handle->isEnabled == 1 )
  14.   {
  15.     return COMPONENT_OK;
  16.   }
  17.   
  18.   /* Output data rate selection. */
  19.   if ( LSM6DSM_G_Set_ODR_Value_When_Enabled( handle, pComponentData->Previous_ODR ) == COMPONENT_ERROR )
  20.   {
  21.     return COMPONENT_ERROR;
  22.   }
  23.   
  24.   handle->isEnabled = 1;
  25.   
  26.   return COMPONENT_OK;
  27. }
复制代码


LSM6DSM官方驱动
lsm6dsm.rar (33.65 KB, 下载次数: 17)

点评

CHIP ID读出来的数据是正确的是6A。写进去的值和我读寄存器的值是不对的。应该是赋值没赋值对。  详情 回复 发表于 2017-10-10 14:45
CHIP ID读出来的数据是正确的是6A。写进去的值和我读寄存器的值是不对的。应该是赋值没赋值对。  详情 回复 发表于 2017-10-10 14:45
虾扯蛋


回复

使用道具 举报

25

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-10-10 13:42:22 | 显示全部楼层
能读到正确的 Who_AM_I 寄存器值,只能说明I2C总线是通的,I2C单字节读取是正确的,但还不能确保写操作是正确的。建议初始化后,将CTRL1_XL 和CTRL2_G寄存器都读出来看看,确定赋值成功,再看输出寄存器。如果赋值不成功,就应该检查I2C信号是否有按照芯片要求输出了。
i2c.PNG


回复

使用道具 举报

80

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-10-10 14:43:34 | 显示全部楼层
yujie2510 发表于 2017-10-10 13:42
能读到正确的 Who_AM_I 寄存器值,只能说明I2C总线是通的,I2C单字节读取是正确的,但还不能确保写操作是正 ...

是初始化没成功,I2C赋值和我示波器抓出来的数据不对,串口打印的数据也不对。应该是没有赋值成功


回复

使用道具 举报

80

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-10-10 14:45:04 | 显示全部楼层
littleshrimp 发表于 2017-10-10 13:15
读取WHO_AM_I(0x0F)得到的值是0x6A对吗?


在写好配置寄存器后把数据再读出来对比过没?

下边是Sen ...

CHIP ID读出来的数据是正确的是6A。写进去的值和我读寄存器的值是不对的。应该是赋值没赋值对。


回复

使用道具 举报

80

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-10-10 14:45:17 | 显示全部楼层
littleshrimp 发表于 2017-10-10 13:15
读取WHO_AM_I(0x0F)得到的值是0x6A对吗?


在写好配置寄存器后把数据再读出来对比过没?

下边是Sen ...

CHIP ID读出来的数据是正确的是6A。写进去的值和我读寄存器的值是不对的。应该是赋值没赋值对。


回复

使用道具 举报

5074

TA的帖子

9

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-10-10 15:11:41 | 显示全部楼层
1、"直接对CTRL1_XL和CTRL2_G赋值,I2C抓取的波形都是和我设置的数值是对应上的,没有异常。"
2、"是初始化没成功,I2C赋值和我示波器抓出来的数据不对,串口打印的数据也不对。应该是没有赋值成功"

如果是第二种就要重点检查你的通信,波形不对是哪里不对,除了读取WHO AM I也可以试试读取其它初始值非零的寄存器,比如CTRL3_C,CTRL9_XL,看与数据手册是否一至(要在器件复位后读取)

点评

我现在按照此段代码进行循坏,打印LSM6DSL_CTRL3_C的寄存器的值发现读出来的值是4而不是我要的1.因为PROPERTY_ENABLE的值是1那么按照LSM6DSL_CTRL3_C寄存器理论上应该是00000001最后一位是rst.结果寄存器读出来的值  详情 回复 发表于 2017-10-10 18:50
虾扯蛋


回复

使用道具 举报

80

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-10-10 18:50:29 | 显示全部楼层
littleshrimp 发表于 2017-10-10 15:11
1、"直接对CTRL1_XL和CTRL2_G赋值,I2C抓取的波形都是和我设置的数值是对应上的,没有异常。"
2、"是初始 ...

我现在按照此段代码进行循坏,打印LSM6DSL_CTRL3_C的寄存器的值发现读出来的值是4而不是我要的1.因为PROPERTY_ENABLE的值是1那么按照LSM6DSL_CTRL3_C寄存器理论上应该是00000001最后一位是rst.结果寄存器读出来的值是4,很费解。

设置的RST代码

设置的RST代码

串口打印log

串口打印log

第二段波形

第二段波形

第一段波形

第一段波形

示波器分解后的数据

示波器分解后的数据

三个波形

三个波形

第三段波形

第三段波形

点评

"我现在按照此段代码进行循坏,打印LSM6DSL_CTRL3_C的寄存器的值发现读出来的值是4而不是我要的1.因为PROPERTY_ENABLE的值是1那么按照LSM6DSL_CTRL3_C寄存器理论上应该是00000001最后一位是rst.结果寄存器读出来的值  详情 回复 发表于 2017-10-10 22:42


回复

使用道具 举报

5074

TA的帖子

9

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-10-10 22:21:38 | 显示全部楼层
LSM6DSM的IO电压是1.62到3.6V
看你的CH2信号电平怎么才300mV左右呢?

点评

SDA的电平是衰减了10倍了,所以比较低。电平是2.8V  详情 回复 发表于 2017-10-11 10:33
虾扯蛋


回复

使用道具 举报

5074

TA的帖子

9

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-10-10 22:42:36 | 显示全部楼层
xieyj 发表于 2017-10-10 18:50
我现在按照此段代码进行循坏,打印LSM6DSL_CTRL3_C的寄存器的值发现读出来的值是4而不是我要的1.因为PROP ...

"我现在按照此段代码进行循坏,打印LSM6DSL_CTRL3_C的寄存器的值发现读出来的值是4而不是我要的1.因为PROPERTY_ENABLE的值是1那么按照LSM6DSL_CTRL3_C寄存器理论上应该是00000001最后一位是rst.结果寄存器读出来的值是4,很费解。"
CTRL3_C复位后的数据应该是0b00000100(0x04)
因为如果你对CTRL3_C的SW_RESET位写入成功,器件会执行复位操作,复位后你之前所有对寄存器的写入都不存在
也就是说SW_RESET位你永远读取不到1(除非你在器件复位前把此位数据读回)

从这个数据看你的I2C读取肯定是成功的,不过还是不能保证你的写入已经成功了
你可以试试修改CTRL3_C的其它位(不要写SW_RESET位),比如BDU,然后再读取一下,看看是否写入成功
QQ图片20171010223035.png

点评

我按照你的方法实验了下,发现SW_RESET这个位就是写入不成功,但是写BDU这位却是写入成功,用的都是一样的写函数。所以就是没有复位,问题应该就是出在这里,没有复位成功。不知道什么原因sw_reset就是没写成功导致  详情 回复 发表于 2017-10-11 11:23
你分析的是有道理的,我也是在想写是不是有问题,我到底有没有写入sw_reset为,到底有没有复位成功。我没看仔细,IF_INC这一位默认是1。我按照你的方法试着做下实验,看能不能写入成功。  详情 回复 发表于 2017-10-11 10:42
你分析的是有道理的,我也是在想写是不是有问题,我到底有没有写入sw_reset为,到底有没有复位成功。我没看仔细,IF_INC这一位默认是1。我按照你的方法试着做下实验,看能不能写入成功。  详情 回复 发表于 2017-10-11 10:42
虾扯蛋


回复

使用道具 举报

483

TA的帖子

21

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-10-10 23:37:47 | 显示全部楼层
楼上的说法很有可能,IIC的写入不一定正确,不知楼主IIC是用的IO口模拟的还是硬件的?如果是硬件的那IIC的配置和例程里面的配置一样吗?

点评

我用的是硬IIC,而且是轮询方式不是中断方式。IIC配置是根据MTK平台的列程来做的。是没有问题的,外围的TP用的是同一组IIC,TP功能是正常的。  详情 回复 发表于 2017-10-11 10:36
QQ:252669569


回复

使用道具 举报

25

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-10-11 09:30:07 | 显示全部楼层
第二阶段的写操作好像也多写了一个0x00字节吧,SDA的电压也是个问题。

点评

第二段是读取的波形,第一段是写的。  详情 回复 发表于 2017-10-11 10:37


回复

使用道具 举报

80

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-10-11 10:33:12 | 显示全部楼层
littleshrimp 发表于 2017-10-10 22:21
LSM6DSM的IO电压是1.62到3.6V
看你的CH2信号电平怎么才300mV左右呢?

SDA的电平是衰减了10倍了,所以比较低。电平是2.8V


回复

使用道具 举报

80

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-10-11 10:36:42 | 显示全部楼层
lb8820265 发表于 2017-10-10 23:37
楼上的说法很有可能,IIC的写入不一定正确,不知楼主IIC是用的IO口模拟的还是硬件的?如果是硬件的那IIC的 ...

我用的是硬IIC,而且是轮询方式不是中断方式。IIC配置是根据MTK平台的列程来做的。是没有问题的,外围的TP用的是同一组IIC,TP功能是正常的。


回复

使用道具 举报

80

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-10-11 10:37:27 | 显示全部楼层
yujie2510 发表于 2017-10-11 09:30
第二阶段的写操作好像也多写了一个0x00字节吧,SDA的电压也是个问题。

第二段是读取的波形,第一段是写的。

点评

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


回复

使用道具 举报

80

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

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

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


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2018-7-20 07:12 , Processed in 0.537848 second(s), 17 queries , Gzip On, Redis On.

快速回复 返回顶部 返回列表