基于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;
- }
- /* Initialization (SPI Mode0, 100kHz, Auto CS) */
- rt_err_t adxl355_init(void)
- {
- rt_err_t ret;
- if (adxl355_inited) return RT_EOK;
- // Attach SPI device
- ret = rt_hw_spi_device_attach(
- ADXL355_SPI_BUS_NAME,
- ADXL355_SPI_DEVICE_NAME,
- ADXL355_CS_GPIO_PORT,
- ADXL355_CS_GPIO_PIN
- );
- if (ret != RT_EOK)
- {
- rt_kprintf("[ADXL355] SPI device attach failed! Check SPI2 configuration\n");
- return ret;
- }
- // Find SPI device
- adxl355_spi = (struct rt_spi_device *)rt_device_find(ADXL355_SPI_DEVICE_NAME);
- if (!adxl355_spi)
- {
- rt_kprintf("[ADXL355] SPI device find failed!\n");
- return RT_ERROR;
- }
- // SPI Configuration (ADXL355 official: Mode0, 100kHz)
- struct rt_spi_configuration cfg = {
- .mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB,
- .data_width = 8,
- .max_hz = 5 * 1000 *1000,
- };
- rt_spi_configure(adxl355_spi, &cfg);
- // Soft reset ADXL355
- adxl355_write_reg(ADXL355_REG_RESET, 0x52);
- rt_thread_mdelay(100);
- // Read chip ID
- uint8_t devid = adxl355_read_reg(ADXL355_REG_DEVID_AD);
- uint8_t partid = adxl355_read_reg(ADXL355_REG_PARTID);
- rt_kprintf("[ADXL355] DEVID:0x%02X, PARTID:0x%02X\n", devid, partid);
- if (devid != 0xAD || partid != 0xED)
- {
- rt_kprintf("[ADXL355] Communication failed! Check wiring\n");
- return RT_ERROR;
- }
- // Configure sensor
- adxl355_write_reg(ADXL355_REG_RANGE, ADXL355_RANGE_8G);
- adxl355_write_reg(ADXL355_REG_POWER_CTL, ADXL355_MODE_MEASUREMENT);
- rt_thread_mdelay(50);
- adxl355_inited = 1;
- rt_kprintf("[ADXL355] Initialization succeeded!\n");
- return RT_EOK;
- }
- /* Test function */
- void adxl355_test(void)
- {
- accel_data_t accel;
- temp_data_t temp;
- if (adxl355_init() != RT_EOK)
- {
- rt_kprintf("[ADXL355] Init failed!\n");
- return;
- }
- while (1)
- {
- if (adxl355_data_ready())
- {
- adxl355_read_accel(&accel);
- adxl355_read_temperature(&temp);
- rt_kprintf("X:%.4f g | Y:%.4f g | Z:%.4f g | Temp:%.1f C\n",
- accel.x, accel.y, accel.z, temp.temp);
- }
- rt_thread_mdelay(200);
- }
- }
复制代码
adxl355.zip
(3.29 KB, 下载次数: 0)
|