芯片解密|单片机解密|IC解密|芯片破解|芯片复制| PCB抄板|软件开发

飞芯科技-芯片解密|单片机解密|IC解密|芯片破解|芯片复制| PCB抄板|软件开发

芯片复制stm32l452+rt-thread 的adxl355驱动

芯片复制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. }



联系方式

地址:石家庄市新华区民族路77号华强广场D座2009
电话:0311-88816616/87087811
手机:13315190088
传真:0311-67901001
联系人:张工
网址:www.feixindz.com
邮箱:feixindz@163.com
微信:xinpianjiemi
QQ:527263666/568069805

在线客服
热线电话

企业微信