前面的帖子介绍了本次用到的四个模块,这一帖开始首先介绍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), ®_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), ®_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), ®_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 内部传感器的温度数据。
通过此流程图形式完成软件部分的读取加速度。


