ADXL357 软件设计(一)

前面的帖子介绍了本次用到的四个模块,这一帖开始首先介绍ADXL357的软件设计部分。

可以通过如上图得出,模块的引脚与单片机模块之间的连线方式,在P1接口中VDDIO和VDD同时接入3.3V电源。通过其内部的LDO进行1.8V电压的供给。因此在P2中的两个1.8V即可悬空。
该模块可以通过IIC/SPI进行通信,需要使用到的引脚是1、2、3、4号引脚。在STBY中,通过引脚功能图可以得知,此引脚可以接地或保持打开状态。

通过该芯片的SPI相关数据,首先SPI的频率在10MHZ以下,电压等数据可以通过计算得出。
(2)软件部分
在官网有在github提供相关驱动程序

这里以一段伪代码的形式进行展现

int adxl355_init(struct adxl355_dev **device,
		 struct adxl355_init_param init_param)
{
	struct adxl355_dev *dev;
	int ret;
	uint8_t reg_value;

	switch (init_param.dev_type) {
	case ID_ADXL355:
	case ID_ADXL357:
	case ID_ADXL359:
		break;
	default:
		return -EINVAL;
	}

	dev = (struct adxl355_dev *)no_os_calloc(1, sizeof(*dev));

	if (!dev)
		return -ENOMEM;

	dev->comm_type = init_param.comm_type;

	if (dev->comm_type == ADXL355_SPI_COMM) {
		ret = no_os_spi_init(&dev->com_desc.spi_desc, &(init_param.comm_init.spi_init));
		if (ret)
			goto error_dev;
	} else {
		ret = no_os_i2c_init(&dev->com_desc.i2c_desc, &init_param.comm_init.i2c_init);
		if (ret)
			goto error_dev;
	}

	dev->dev_type = init_param.dev_type;

	ret = adxl355_read_device_data(dev, ADXL355_ADDR(ADXL355_DEVID_AD),
				       GET_ADXL355_TRANSF_LEN(ADXL355_DEVID_AD), &reg_value);
	if (ret || (reg_value != GET_ADXL355_RESET_VAL(ADXL355_DEVID_AD)))
		goto error_com;

	ret = adxl355_read_device_data(dev, ADXL355_ADDR(ADXL355_DEVID_MST),
				       GET_ADXL355_TRANSF_LEN(ADXL355_DEVID_MST), &reg_value);
	if (ret || (reg_value != GET_ADXL355_RESET_VAL(ADXL355_DEVID_MST)))
		goto error_com;

	ret = adxl355_read_device_data(dev, ADXL355_ADDR(ADXL355_PARTID),
				       GET_ADXL355_TRANSF_LEN(ADXL355_PARTID), &reg_value);

	if (ret || reg_value != adxl355_part_id[dev->dev_type])
		goto error_com;

	// Get shadow register values
	ret = adxl355_read_device_data(dev,
				       ADXL355_ADDR(ADXL355_SHADOW_REGISTER_BASE_ADDR),
				       GET_ADXL355_TRANSF_LEN(ADXL355_SHADOW_REGISTER_BASE_ADDR),
				       &shadow_reg_val[0]);
	if (ret)
		goto error_com;

	// Default range is set
	dev->range = GET_ADXL355_RESET_VAL(ADXL355_RANGE) & ADXL355_RANGE_FIELD_MSK;

	// Default value for FIFO SAMPLES
	dev->fifo_samples = GET_ADXL355_RESET_VAL(ADXL355_FIFO_SAMPLES);

	// Default value for POWER_CTL
	dev->op_mode = GET_ADXL355_RESET_VAL(ADXL355_POWER_CTL);

	// Default activity count value
	dev->act_cnt = GET_ADXL355_RESET_VAL(ADXL355_ACT_CNT);

	*device = dev;

	return ret;
error_com:
	if (dev->comm_type == ADXL355_SPI_COMM)
		no_os_spi_remove(dev->com_desc.spi_desc);
	else
		no_os_i2c_remove(dev->com_desc.i2c_desc);
	no_os_free(dev);
	return -1;
error_dev:
	no_os_free(dev);
	return ret;
}

一、初始化 SPI 和 ADXL355 参数
struct adxl355_dev *adxl355;
• 定义一个指向 ADXL355 设备对象的指针。
struct no_os_spi_init_param sip
设置 SPI 初始化参数:
o max_speed_hz = 10MHz:SPI 通信最大速率。
o MSB_FIRST:最高位先传输。
o SPI 模式 0(CPOL=0, CPHA=0)。
struct adxl355_init_param init_data_adxl355
封装 SPI 初始化参数到 ADXL355 初始化结构中,表明通信类型是 SPI。


二、初始化传感器并设置参数
ret = adxl355_init(&adxl355, init_data_adxl355);
• 初始化 ADXL355 加速度计。
ret = adxl355_soft_reset(adxl355);
• 执行软件复位。
ret = adxl355_set_odr_lpf(adxl355, ADXL355_ODR_4000HZ);
• 设置输出数据速率 (ODR) 和低通滤波器频率为 4000Hz。
ret = adxl355_set_op_mode(adxl355, ADXL355_MEAS_TEMP_ON_DRDY_OFF);
• 设置操作模式:
o 打开测量模式(Measurement Mode)。
o 打开温度测量(TEMP ON)。
o 关闭 Data Ready 中断(DRDY OFF)。
________________________________________三、读取单次加速度数据
ret = adxl355_get_xyz(adxl355, &x, &y, &z);
• 获取 X/Y/Z 三轴方向上的加速度数据(单位可能是 g 的小数格式,结构体 frac_repr 表示分数值)。


四、读取 FIFO 批量加速度数据
uint8_t fifo_entries = 0;
ret = adxl355_get_fifo_data(adxl355, &fifo_entries, &x[0], &y[0], &z[0]);
• 从 FIFO 中读取多个加速度数据样本(最多 32 个)。
• fifo_entries 是返回的实际数据点个数。


五、读取温度数据
struct adxl355_frac_repr temp;
ret = adxl355_get_temp(adxl355, &temp);
• 读取ADXL355 内部传感器的温度数据。


通过此流程图形式完成软件部分的读取加速度。