芯片复制stm32l452+rt-thread 的adxl355驱动
芯片复制stm32l452+rt-thread 的adxl355驱动,附件是源码
- 芯片复制#include "bsp_adxl355.h"
- static struct rt_spi_device *adxl355_spi = RT_NULL;
- static uint8_t adxl355_inited = 0;
- // Hardware Pin Configuration
- #define ADXL355_CS_GPIO_PORT GPIOD
- #define ADXL355_CS_GPIO_PIN GPIO_PIN_0
- /* SPI Read/Write with NULL pointer protection */
- static rt_err_t adxl355_write_reg(uint8_t reg, uint8_t val)
- {
- if (!adxl355_spi) return RT_ERROR;
- uint8_t tx_buf[2] = {(reg<<1) | 0x00, val};
- return rt_spi_transfer(adxl355_spi, tx_buf, RT_NULL, 2);
- }
- static uint8_t adxl355_read_reg(uint8_t reg)
- {
- if (!adxl355_spi) return 0xFF;
- uint8_t tx_buf[2] = {(reg<<1) | 0x1, 0xFF};
- uint8_t rx_buf[2] = {0};
- rt_spi_transfer(adxl355_spi, tx_buf, rx_buf, 2);
- return rx_buf[1];
- }
- /* Public Functions */
- rt_bool_t adxl355_data_ready(void)
- {
- return (adxl355_read_reg(ADXL355_REG_STATUS) & ADXL355_STATUS_DATA_RDY) ? RT_TRUE : RT_FALSE;
- }
- void adxl355_read_accel(accel_data_t *data)
- {
- uint8_t tx[10] = { (ADXL355_REG_XDATA3<<1) | 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
- uint8_t rx[10] = {0};
- int32_t x, y, z;
- if (adxl355_data_ready() == RT_FALSE) {
- rt_kprintf("adxl355 not ready\n");
- }
- rt_spi_transfer(adxl355_spi, tx, rx, 10);
- // 合并数据:rx[1]是高8位,rx[2]是中8位,rx[3]是低4位(有效位)
- x = ((int32_t)rx[1] << 12) | ((int32_t)rx[2] << 4) | (rx[3] >> 4);
- y = ((int32_t)rx[4] << 12) | ((int32_t)rx[5] << 4) | (rx[6] >> 4);
- z = ((int32_t)rx[7] << 12) | ((int32_t)rx[8] << 4) | (rx[9] >> 4);
- // 符号扩展到 32 位
- if (x & 0x80000) x |= 0xFFF00000;
- if (y & 0x80000) y |= 0xFFF00000;
- if (z & 0x80000) z |= 0xFFF00000;
- data->x = (float)x * ADXL355_SCALE_8G; // SCALE_8G = 8.0f / 524288.0f
- data->y = (float)y * ADXL355_SCALE_8G;
- data->z = (float)z * ADXL355_SCALE_8G;
- }
- void adxl355_read_temp(temp_data_t *data)
- {
- uint8_t buf[3] = {0}; // 3字节:地址响应 + TEMP2 + TEMP1
- int16_t temp_raw;
- if (!adxl355_inited || !data) return;
- // 发送寄存器地址(TEMP2,左移一位 + 读位),然后读取2字节数据
- rt_spi_transfer(adxl355_spi, (uint8_t[]){(ADXL355_REG_TEMP2<<1) | 0x01}, buf, 3);
- temp_raw = ((int16_t)buf[1] << 4) | (buf[2] >> 4); // 12位有效数据
- // 符号扩展(如果最高位为1)
- if (temp_raw & 0x800) temp_raw |= 0xF000;
- // 正确转换:25°C + 原始值 * 0.065 °C/LSB
- data->temp = 25.0f + (float)temp_raw * 0.065f;
- }

芯片解密