社区导航

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

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

  [复制链接]

27

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, 下载次数: 8

lsm6dsl_reg.c

150.4 KB, 下载次数: 7

lsm6dsl_reg.h

46.8 KB, 下载次数: 4


回复

使用道具 举报

522

TA的帖子

1

TA的资源

版主

Rank: 6Rank: 6

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

[C] 纯文本查看 复制代码
#ifndef __LSM6DS3_H_INCLUDED__
#define __LSM6DS3_H_INCLUDED__

#include "i2c_bus.h"

struct lsm6ds3_info_t
{
	struct i2c_bus_t *i2c_bus;
	uint8_t i2c_addr;
	
	// private
	uint8_t error;
	
	struct vsfsm_t xfer_sm;
	struct vsfsm_pt_t xfer_pt;
};

void lsm6ds3_init(struct lsm6ds3_info_t *info);


#endif // __LSM6DS3_H_INCLUDED__


[C] 纯文本查看 复制代码
#include "vsf.h"
#include "usrapp.h"

#define LSM6DS3_ACC_GYRO_FUNC_CFG_ACCESS    0X01
#define LSM6DS3_ACC_GYRO_SENSOR_SYNC_TIME   0X04
#define LSM6DS3_ACC_GYRO_FIFO_CTRL1   0X06
#define LSM6DS3_ACC_GYRO_FIFO_CTRL2   0X07
#define LSM6DS3_ACC_GYRO_FIFO_CTRL3   0X08
#define LSM6DS3_ACC_GYRO_FIFO_CTRL4   0X09
#define LSM6DS3_ACC_GYRO_FIFO_CTRL5   0X0A
#define LSM6DS3_ACC_GYRO_ORIENT_CFG_G   0X0B
#define LSM6DS3_ACC_GYRO_INT1_CTRL    0X0D
#define LSM6DS3_ACC_GYRO_INT2_CTRL    0X0E
#define LSM6DS3_ACC_GYRO_WHO_AM_I_REG   0X0F
#define LSM6DS3_ACC_GYRO_CTRL1_XL   0X10
#define LSM6DS3_ACC_GYRO_CTRL2_G    0X11
#define LSM6DS3_ACC_GYRO_CTRL3_C    0X12
#define LSM6DS3_ACC_GYRO_CTRL4_C    0X13
#define LSM6DS3_ACC_GYRO_CTRL5_C    0X14
#define LSM6DS3_ACC_GYRO_CTRL6_G    0X15
#define LSM6DS3_ACC_GYRO_CTRL7_G    0X16
#define LSM6DS3_ACC_GYRO_CTRL8_XL   0X17
#define LSM6DS3_ACC_GYRO_CTRL9_XL   0X18
#define LSM6DS3_ACC_GYRO_CTRL10_C   0X19
#define LSM6DS3_ACC_GYRO_MASTER_CONFIG    0X1A
#define LSM6DS3_ACC_GYRO_WAKE_UP_SRC    0X1B
#define LSM6DS3_ACC_GYRO_TAP_SRC    0X1C
#define LSM6DS3_ACC_GYRO_D6D_SRC    0X1D
#define LSM6DS3_ACC_GYRO_STATUS_REG   0X1E
#define LSM6DS3_ACC_GYRO_OUT_TEMP_L   0X20
#define LSM6DS3_ACC_GYRO_OUT_TEMP_H   0X21
#define LSM6DS3_ACC_GYRO_OUTX_L_G   0X22
#define LSM6DS3_ACC_GYRO_OUTX_H_G   0X23
#define LSM6DS3_ACC_GYRO_OUTY_L_G   0X24
#define LSM6DS3_ACC_GYRO_OUTY_H_G   0X25
#define LSM6DS3_ACC_GYRO_OUTZ_L_G   0X26
#define LSM6DS3_ACC_GYRO_OUTZ_H_G   0X27
#define LSM6DS3_ACC_GYRO_OUTX_L_XL    0X28
#define LSM6DS3_ACC_GYRO_OUTX_H_XL    0X29
#define LSM6DS3_ACC_GYRO_OUTY_L_XL    0X2A
#define LSM6DS3_ACC_GYRO_OUTY_H_XL    0X2B
#define LSM6DS3_ACC_GYRO_OUTZ_L_XL    0X2C
#define LSM6DS3_ACC_GYRO_OUTZ_H_XL    0X2D
#define LSM6DS3_ACC_GYRO_SENSORHUB1_REG   0X2E
#define LSM6DS3_ACC_GYRO_SENSORHUB2_REG   0X2F
#define LSM6DS3_ACC_GYRO_SENSORHUB3_REG   0X30
#define LSM6DS3_ACC_GYRO_SENSORHUB4_REG   0X31
#define LSM6DS3_ACC_GYRO_SENSORHUB5_REG   0X32
#define LSM6DS3_ACC_GYRO_SENSORHUB6_REG   0X33
#define LSM6DS3_ACC_GYRO_SENSORHUB7_REG   0X34
#define LSM6DS3_ACC_GYRO_SENSORHUB8_REG   0X35
#define LSM6DS3_ACC_GYRO_SENSORHUB9_REG   0X36
#define LSM6DS3_ACC_GYRO_SENSORHUB10_REG    0X37
#define LSM6DS3_ACC_GYRO_SENSORHUB11_REG    0X38
#define LSM6DS3_ACC_GYRO_SENSORHUB12_REG    0X39
#define LSM6DS3_ACC_GYRO_FIFO_STATUS1   0X3A
#define LSM6DS3_ACC_GYRO_FIFO_STATUS2   0X3B
#define LSM6DS3_ACC_GYRO_FIFO_STATUS3   0X3C
#define LSM6DS3_ACC_GYRO_FIFO_STATUS4   0X3D
#define LSM6DS3_ACC_GYRO_FIFO_DATA_OUT_L    0X3E
#define LSM6DS3_ACC_GYRO_FIFO_DATA_OUT_H    0X3F
#define LSM6DS3_ACC_GYRO_TIMESTAMP0_REG   0X40
#define LSM6DS3_ACC_GYRO_TIMESTAMP1_REG   0X41
#define LSM6DS3_ACC_GYRO_TIMESTAMP2_REG   0X42

#define LSM6DS3_ACC_GYRO_TIMESTAMP_L    0X49
#define LSM6DS3_ACC_GYRO_TIMESTAMP_H    0X4A

#define LSM6DS3_ACC_GYRO_STEP_COUNTER_L   0X4B
#define LSM6DS3_ACC_GYRO_STEP_COUNTER_H   0X4C

#define LSM6DS3_ACC_GYRO_SENSORHUB13_REG    0X4D
#define LSM6DS3_ACC_GYRO_SENSORHUB14_REG    0X4E
#define LSM6DS3_ACC_GYRO_SENSORHUB15_REG    0X4F
#define LSM6DS3_ACC_GYRO_SENSORHUB16_REG    0X50
#define LSM6DS3_ACC_GYRO_SENSORHUB17_REG    0X51
#define LSM6DS3_ACC_GYRO_SENSORHUB18_REG    0X52

#define LSM6DS3_ACC_GYRO_FUNC_SRC   0X53
#define LSM6DS3_ACC_GYRO_TAP_CFG1   0X58
#define LSM6DS3_ACC_GYRO_TAP_THS_6D   0X59
#define LSM6DS3_ACC_GYRO_INT_DUR2   0X5A
#define LSM6DS3_ACC_GYRO_WAKE_UP_THS    0X5B
#define LSM6DS3_ACC_GYRO_WAKE_UP_DUR    0X5C
#define LSM6DS3_ACC_GYRO_FREE_FALL    0X5D
#define LSM6DS3_ACC_GYRO_MD1_CFG    0X5E
#define LSM6DS3_ACC_GYRO_MD2_CFG    0X5F

#define VSFSM_EVT_LSM6DS3_XFER_DONE		(VSFSM_EVT_USER_LOCAL + 1)
#define VSFSM_EVT_LSM6DS3_POLL			(VSFSM_EVT_USER_LOCAL + 2)

static void lsm6ds3_callback(void *param, int32_t err)
{
	struct lsm6ds3_info_t *info = param;
	
	if (err == 0)
		info->error = 0;
	else
		info->error++;
	vsfsm_post_evt_pending(&info->xfer_sm, VSFSM_EVT_LSM6DS3_XFER_DONE);
}

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

	vsfsm_pt_begin(pt);	
	
	vsfsm_pt_delay(pt, 100);
	
	// IC probe
	vsfhal_i2c_config_cb(i2c_bus->index, info, lsm6ds3_callback);
	i2c_bus->msg[0].flag = VSFHAL_I2C_WRITE;
	i2c_bus->msg[0].buf = i2c_bus->temp;
	i2c_bus->msg[0].len = 2;
	i2c_bus->temp[0] = LSM6DS3_ACC_GYRO_FUNC_CFG_ACCESS;
	i2c_bus->temp[1] = 0x0;
	do
	{
		vsfhal_i2c_xfer(i2c_bus->index, info->i2c_addr, i2c_bus->msg, 1);
		vsfsm_pt_wfe(pt, VSFSM_EVT_LSM6DS3_XFER_DONE);
	} while (info->error && (info->error < 3));
	
	if (info->error)
		return VSFERR_FAIL;
	
	// Enable BDU and IF_INC
	i2c_bus->temp[0] = LSM6DS3_ACC_GYRO_CTRL3_C;
	i2c_bus->temp[1] = 0x44;
	vsfhal_i2c_xfer(i2c_bus->index, info->i2c_addr, i2c_bus->msg, 1);
	vsfsm_pt_wfe(pt, VSFSM_EVT_LSM6DS3_XFER_DONE);
	
	// Disable FIFO
	i2c_bus->temp[0] = LSM6DS3_ACC_GYRO_FIFO_CTRL5;
	i2c_bus->temp[1] = 0x0;
	vsfhal_i2c_xfer(i2c_bus->index, info->i2c_addr, i2c_bus->msg, 1);
	vsfsm_pt_wfe(pt, VSFSM_EVT_LSM6DS3_XFER_DONE);
	
	// Set rate: 416Hz; FS_XL: +- 8G; 
	i2c_bus->temp[0] = LSM6DS3_ACC_GYRO_CTRL1_XL;
	i2c_bus->temp[1] = (0x3 << 2) | (0x6 << 4);
	vsfhal_i2c_xfer(i2c_bus->index, info->i2c_addr, i2c_bus->msg, 1);
	vsfsm_pt_wfe(pt, VSFSM_EVT_LSM6DS3_XFER_DONE);
	
	// Set rate: 416Hz; FS_G: 2000; 
	i2c_bus->temp[0] = LSM6DS3_ACC_GYRO_CTRL2_G;
	i2c_bus->temp[1] = (0x3 << 2) | (0x6 << 4);
	vsfhal_i2c_xfer(i2c_bus->index, info->i2c_addr, i2c_bus->msg, 1);
	vsfsm_pt_wfe(pt, VSFSM_EVT_LSM6DS3_XFER_DONE);
	
	// Read data
	i2c_bus->msg[0].len = 1;
	i2c_bus->temp[0] = LSM6DS3_ACC_GYRO_OUTX_L_G;
	i2c_bus->msg[1].flag = VSFHAL_I2C_READ;
	i2c_bus->msg[1].buf = i2c_bus->temp + 4;
	i2c_bus->msg[1].len = 12;
	
	vsftimer_create(pt->sm, 4, -1, VSFSM_EVT_LSM6DS3_POLL);
	do
	{
		vsfsm_pt_wfe(pt, VSFSM_EVT_LSM6DS3_POLL);
		vsfhal_i2c_xfer(i2c_bus->index, info->i2c_addr, i2c_bus->msg, 2);
		vsfsm_pt_wfe(pt, VSFSM_EVT_LSM6DS3_XFER_DONE);
		gyro_acc_data_input(i2c_bus->msg[1].buf, 12);
	} while (1);

	vsfsm_pt_end(pt);	
	return VSFERR_NONE;
}


void lsm6ds3_init(struct lsm6ds3_info_t *info)
{
	info->xfer_pt.thread = lsm6ds3_thread;
	info->xfer_pt.user_data = info;
	vsfsm_pt_init(&info->xfer_sm, &info->xfer_pt);
}
LPC4370,秒天秒地秒空气

回复

使用道具 举报

27

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

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

回复

使用道具 举报

6178

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

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

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

回复

使用道具 举报

27

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驱动代码需要改,但不知道怎么改才能通。

回复

使用道具 举报

4323

TA的帖子

9

TA的资源

版主

Rank: 6Rank: 6

爱原创

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


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

下边是SensorTile中配置LSM6DSM的函数你参考一下
[C] 纯文本查看 复制代码
/**
 * [url=home.php?mod=space&uid=159083]@brief[/url] Initialize the LSM6DSM gyroscope sensor
 * @param handle the device handle
 * @retval COMPONENT_OK in case of success
 * @retval COMPONENT_ERROR in case of failure
 */
static DrvStatusTypeDef LSM6DSM_G_Init( DrvContextTypeDef *handle )
{

  GYRO_Data_t *pData = ( GYRO_Data_t * )handle->pData;
  LSM6DSM_G_Data_t *pComponentData = ( LSM6DSM_G_Data_t * )pData->pComponentData;
  LSM6DSM_Combo_Data_t *comboData = pComponentData->comboData;
  
  if ( LSM6DSM_Check_WhoAmI( handle ) == COMPONENT_ERROR )
  {
    return COMPONENT_ERROR;
  }
  
  /* Enable register address automatically incremented during a multiple byte
     access with a serial interface. */
  if ( LSM6DSM_ACC_GYRO_W_IF_Addr_Incr( (void *)handle, LSM6DSM_ACC_GYRO_IF_INC_ENABLED ) == MEMS_ERROR )
  {
    return COMPONENT_ERROR;
  }
  
  /* Enable BDU */
  if ( LSM6DSM_ACC_GYRO_W_BDU( (void *)handle, LSM6DSM_ACC_GYRO_BDU_BLOCK_UPDATE ) == MEMS_ERROR )
  {
    return COMPONENT_ERROR;
  }
  
  /* FIFO mode selection */
  if ( LSM6DSM_ACC_GYRO_W_FIFO_MODE( (void *)handle, LSM6DSM_ACC_GYRO_FIFO_MODE_BYPASS ) == MEMS_ERROR )
  {
    return COMPONENT_ERROR;
  }
  
  /* Select default output data rate. */
  pComponentData->Previous_ODR = 104.0f;
  
  /* Output data rate selection - power down */
  if ( LSM6DSM_ACC_GYRO_W_ODR_G( (void *)handle, LSM6DSM_ACC_GYRO_ODR_G_POWER_DOWN ) == MEMS_ERROR )
  {
    return COMPONENT_ERROR;
  }
  
  /* Full scale selection. */
  if ( LSM6DSM_G_Set_FS( handle, FS_HIGH ) == COMPONENT_ERROR )
  {
    return COMPONENT_ERROR;
  }

  comboData->isGyroInitialized = 1;

  handle->isInitialized = 1;
  
  return COMPONENT_OK;
}


读取函数
[C] 纯文本查看 复制代码
/**
 * @brief Get the LSM6DSM gyroscope sensor axes
 * @param handle the device handle
 * @param angular_velocity pointer where the values of the axes are written
 * @retval COMPONENT_OK in case of success
 * @retval COMPONENT_ERROR in case of failure
 */
static DrvStatusTypeDef LSM6DSM_G_Get_Axes( DrvContextTypeDef *handle, SensorAxes_t *angular_velocity )
{

  int16_t dataRaw[3];
  float   sensitivity = 0;
  
  /* Read raw data from LSM6DSM output register. */
  if ( LSM6DSM_G_Get_Axes_Raw( handle, dataRaw ) == COMPONENT_ERROR )
  {
    return COMPONENT_ERROR;
  }
  
  /* Get LSM6DSM actual sensitivity. */
  if ( LSM6DSM_G_Get_Sensitivity( handle, &sensitivity ) == COMPONENT_ERROR )
  {
    return COMPONENT_ERROR;
  }
  
  /* Calculate the data. */
  angular_velocity->AXIS_X = ( int32_t )( dataRaw[0] * sensitivity );
  angular_velocity->AXIS_Y = ( int32_t )( dataRaw[1] * sensitivity );
  angular_velocity->AXIS_Z = ( int32_t )( dataRaw[2] * sensitivity );
  
  return COMPONENT_OK;
}


在读取前执行LSM6DSM_G_Sensor_Enable函数
[C] 纯文本查看 复制代码
/**
 * @brief Enable the LSM6DSM gyroscope sensor
 * @param handle the device handle
 * @retval COMPONENT_OK in case of success
 * @retval COMPONENT_ERROR in case of failure
 */
static DrvStatusTypeDef LSM6DSM_G_Sensor_Enable( DrvContextTypeDef *handle )
{
  GYRO_Data_t *pData = ( GYRO_Data_t * )handle->pData;
  LSM6DSM_G_Data_t *pComponentData = ( LSM6DSM_G_Data_t * )pData->pComponentData;
  
  /* Check if the component is already enabled */
  if ( handle->isEnabled == 1 )
  {
    return COMPONENT_OK;
  }
  
  /* Output data rate selection. */
  if ( LSM6DSM_G_Set_ODR_Value_When_Enabled( handle, pComponentData->Previous_ODR ) == COMPONENT_ERROR )
  {
    return COMPONENT_ERROR;
  }
  
  handle->isEnabled = 1;
  
  return COMPONENT_OK;
}


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

点评

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

回复

使用道具 举报

27

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

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

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

回复

使用道具 举报

27

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。写进去的值和我读寄存器的值是不对的。应该是赋值没赋值对。

回复

使用道具 举报

27

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。写进去的值和我读寄存器的值是不对的。应该是赋值没赋值对。

回复

使用道具 举报

4323

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
虾扯蛋

回复

使用道具 举报

27

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

回复

使用道具 举报

4323

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
虾扯蛋

回复

使用道具 举报

4323

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
虾扯蛋

回复

使用道具 举报

441

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

回复

使用道具 举报

27

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

回复

使用道具 举报

27

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功能是正常的。

回复

使用道具 举报

27

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

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

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

点评

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

回复

使用道具 举报

27

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, 2017-10-20 05:52 , Processed in 0.563472 second(s), 16 queries , Redis On.

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