找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2|回复: 0
收起左侧

基于stm32l452+rt-thread 的adxl355驱动

[复制链接]
ID:1170629 发表于 2026-4-30 14:37 | 显示全部楼层 |阅读模式
基于stm32l452+rt-thread 的adxl355驱动,附件是源码

  1. #include "bsp_adxl355.h"


  2. static struct rt_spi_device *adxl355_spi = RT_NULL;
  3. static uint8_t adxl355_inited = 0;

  4. // Hardware Pin Configuration
  5. #define ADXL355_CS_GPIO_PORT    GPIOD
  6. #define ADXL355_CS_GPIO_PIN     GPIO_PIN_0

  7. /* SPI Read/Write with NULL pointer protection */
  8. static rt_err_t adxl355_write_reg(uint8_t reg, uint8_t val)
  9. {
  10.     if (!adxl355_spi) return RT_ERROR;
  11.     uint8_t tx_buf[2] = {(reg<<1) | 0x00, val};
  12.     return rt_spi_transfer(adxl355_spi, tx_buf, RT_NULL, 2);
  13. }

  14. static uint8_t adxl355_read_reg(uint8_t reg)
  15. {
  16.     if (!adxl355_spi) return 0xFF;
  17.     uint8_t tx_buf[2] = {(reg<<1) | 0x1, 0xFF};
  18.     uint8_t rx_buf[2] = {0};
  19.     rt_spi_transfer(adxl355_spi, tx_buf, rx_buf, 2);
  20.     return rx_buf[1];
  21. }

  22. /* Public Functions */
  23. rt_bool_t adxl355_data_ready(void)
  24. {
  25.     return (adxl355_read_reg(ADXL355_REG_STATUS) & ADXL355_STATUS_DATA_RDY) ? RT_TRUE : RT_FALSE;
  26. }

  27. void adxl355_read_accel(accel_data_t *data)
  28. {
  29.     uint8_t tx[10] = { (ADXL355_REG_XDATA3<<1) | 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
  30.     uint8_t rx[10] = {0};
  31.     int32_t x, y, z;

  32.     if (adxl355_data_ready() == RT_FALSE) {
  33.         rt_kprintf("adxl355 not ready\n");
  34.     }

  35.     rt_spi_transfer(adxl355_spi, tx, rx, 10);

  36.     // 合并数据:rx[1]是高8位,rx[2]是中8位,rx[3]是低4位(有效位)
  37.     x = ((int32_t)rx[1] << 12) | ((int32_t)rx[2] << 4) | (rx[3] >> 4);
  38.     y = ((int32_t)rx[4] << 12) | ((int32_t)rx[5] << 4) | (rx[6] >> 4);
  39.     z = ((int32_t)rx[7] << 12) | ((int32_t)rx[8] << 4) | (rx[9] >> 4);

  40.     // 符号扩展到 32 位
  41.     if (x & 0x80000) x |= 0xFFF00000;
  42.     if (y & 0x80000) y |= 0xFFF00000;
  43.     if (z & 0x80000) z |= 0xFFF00000;

  44.     data->x = (float)x * ADXL355_SCALE_8G;   // SCALE_8G = 8.0f / 524288.0f
  45.     data->y = (float)y * ADXL355_SCALE_8G;
  46.     data->z = (float)z * ADXL355_SCALE_8G;
  47. }

  48. void adxl355_read_temp(temp_data_t *data)
  49. {
  50.     uint8_t buf[3] = {0};  // 3字节:地址响应 + TEMP2 + TEMP1
  51.     int16_t temp_raw;

  52.     if (!adxl355_inited || !data) return;

  53.     // 发送寄存器地址(TEMP2,左移一位 + 读位),然后读取2字节数据
  54.     rt_spi_transfer(adxl355_spi, (uint8_t[]){(ADXL355_REG_TEMP2<<1) | 0x01}, buf, 3);
  55.     temp_raw = ((int16_t)buf[1] << 4) | (buf[2] >> 4);  // 12位有效数据
  56.     // 符号扩展(如果最高位为1)
  57.     if (temp_raw & 0x800) temp_raw |= 0xF000;

  58.     // 正确转换:25°C + 原始值 * 0.065 °C/LSB
  59.     data->temp = 25.0f + (float)temp_raw * 0.065f;
  60. }

  61. /* Initialization (SPI Mode0, 100kHz, Auto CS) */
  62. rt_err_t adxl355_init(void)
  63. {
  64.     rt_err_t ret;

  65.     if (adxl355_inited) return RT_EOK;

  66.     // Attach SPI device
  67.     ret = rt_hw_spi_device_attach(
  68.         ADXL355_SPI_BUS_NAME,
  69.         ADXL355_SPI_DEVICE_NAME,
  70.         ADXL355_CS_GPIO_PORT,
  71.         ADXL355_CS_GPIO_PIN
  72.     );
  73.     if (ret != RT_EOK)
  74.     {
  75.         rt_kprintf("[ADXL355] SPI device attach failed! Check SPI2 configuration\n");
  76.         return ret;
  77.     }

  78.     // Find SPI device
  79.     adxl355_spi = (struct rt_spi_device *)rt_device_find(ADXL355_SPI_DEVICE_NAME);
  80.     if (!adxl355_spi)
  81.     {
  82.         rt_kprintf("[ADXL355] SPI device find failed!\n");
  83.         return RT_ERROR;
  84.     }

  85.     // SPI Configuration (ADXL355 official: Mode0, 100kHz)
  86.     struct rt_spi_configuration cfg = {
  87.         .mode       = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB,
  88.         .data_width = 8,
  89.         .max_hz     = 5 * 1000 *1000,
  90.     };
  91.     rt_spi_configure(adxl355_spi, &cfg);

  92.     // Soft reset ADXL355
  93.     adxl355_write_reg(ADXL355_REG_RESET, 0x52);
  94.     rt_thread_mdelay(100);

  95.     // Read chip ID
  96.     uint8_t devid  = adxl355_read_reg(ADXL355_REG_DEVID_AD);
  97.     uint8_t partid = adxl355_read_reg(ADXL355_REG_PARTID);
  98.     rt_kprintf("[ADXL355] DEVID:0x%02X, PARTID:0x%02X\n", devid, partid);

  99.     if (devid != 0xAD || partid != 0xED)
  100.     {
  101.         rt_kprintf("[ADXL355] Communication failed! Check wiring\n");
  102.         return RT_ERROR;
  103.     }

  104.     // Configure sensor
  105.     adxl355_write_reg(ADXL355_REG_RANGE, ADXL355_RANGE_8G);
  106.     adxl355_write_reg(ADXL355_REG_POWER_CTL, ADXL355_MODE_MEASUREMENT);
  107.     rt_thread_mdelay(50);

  108.     adxl355_inited = 1;
  109.     rt_kprintf("[ADXL355] Initialization succeeded!\n");

  110.     return RT_EOK;
  111. }

  112. /* Test function */
  113. void adxl355_test(void)
  114. {
  115.     accel_data_t accel;
  116.     temp_data_t temp;

  117.     if (adxl355_init() != RT_EOK)
  118.     {
  119.         rt_kprintf("[ADXL355] Init failed!\n");
  120.         return;
  121.     }

  122.     while (1)
  123.     {
  124.         if (adxl355_data_ready())
  125.         {
  126.             adxl355_read_accel(&accel);
  127.             adxl355_read_temperature(&temp);
  128.             rt_kprintf("X:%.4f g | Y:%.4f g | Z:%.4f g | Temp:%.1f C\n",
  129.                        accel.x, accel.y, accel.z, temp.temp);
  130.         }
  131.         rt_thread_mdelay(200);
  132.     }
  133. }
复制代码

adxl355.zip (3.29 KB, 下载次数: 0)
回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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