|
前两天看到有坛友问LIS3DH驱动例程,刚好手上有这个芯片,它支持SPI和I2C接口,分享的例程属于入门例程,欢迎大神指正。
SYD8810的内核是Cortex-M0,支持IO任意配置,下面是LIS3DH的SPI和I2C接口原理图,
两个例程使用MDK5编译。SPI驱动部分例程如下,
- #include "SPI_LIS3DH.h"
- #include "spi.h"
- /*
- 寄存器配置数组
- 第一个数数据为寄存器地址 第二个数据为寄存器数据
- */
- const uint8_t lis3dh_init_data[] =
- {
- 0x20, 0x4F, // CTRL_REG1 Normal / low power mode (50 Hz) low power mode Z、X、Y axis enable
- 0x21, 0x00, // CTRL_REG2 失能所有高通滤波
- 0x22, 0x80, // CTRL_REG3 只是使能了CLICK interrupt on INT1
- 0x23, 0x20, // CTRL_REG4 [5:4] 00: +/- 2G; 01: +/- 4G; √10: +/- 8G; 11: +/- 16G 选择了8G
- 0x24, 0x00, // CTRL_REG5 失能FIFO等功能
- 0x25, 0x80, // CTRL_REG6 使能I2_CLICKen
- 0x38, 0x10, // CLICK_CFG, only enable single click interrupt Z
- 0x3A, 0x1A, // CLICK_THS
- 0x3B, 0x04, // TIME_LIMIT
- 0x3C, 0x03, // TIME_LATENCY
- 0x3D, 0x20, // TIME_WINDOW
- };
- /*
- lis3dh写寄存器函数
- 参数: uint8_t addr 寄存器地址
- uint8_t value 寄存器数据
- 注意ID地址不作为传入参数 已经在全部变量定义好了
- */
- void lis3dh_write_reg(uint8_t addr, uint8_t value)
- {
- SPI_SendData(addr, value);
- }
- /*
- lis3dh读寄存器函数
- 参数: uint8_t addr 寄存器地址
- uint8_t value 读到的内容
- 注意ID地址不作为传入参数 已经在全部变量定义好了
- */
- void lis3dh_read_reg(uint8_t addr, uint8_t *p_value)
- {
- SPI_ReceiveData(addr, p_value);
- }
- /*
- lis3dh初始化函数
- 这里配置了寄存器
- */
- uint8_t lis3dh_init(void)
- {
- uint8_t i,st;
- spi_init(GSensor_SPI);
- // lis3dh register initialization
- for(i=0; i<(sizeof(lis3dh_init_data)); i+=2)
- lis3dh_write_reg(lis3dh_init_data[i], lis3dh_init_data[i+1]);
- lis3dh_read_reg(LIS3DH_WHO_AM_I_REG, &st);
- if(st == 0x33) return st;
- return 0;
- }
- /*
- lis3dh获取加速度传感器三个轴的数据函数
- 传入参数:uint16_t *p_x X轴数据存储指针
- uint16_t *p_y y轴数据存储指针
- uint16_t *p_z z轴数据存储指针
- */
- void lis3dh_get_accelerometer_data(int16_t *p_x, int16_t *p_y, int16_t *p_z)
- {
- uint8_t st;
- uint8_t val[2];
- lis3dh_read_reg(LIS3DH_STATUS_REG, &st); //07
- if((st & 0x04) != 0x00)
- {
- lis3dh_read_reg(LIS3DH_X_DATA_REG, &val[0]); //28
- lis3dh_read_reg(LIS3DH_X_DATA_REG+1, &val[1]);
- *p_x = val[0] | (val[1] << 8);
- lis3dh_read_reg(LIS3DH_Y_DATA_REG, &val[0]); //2A
- lis3dh_read_reg(LIS3DH_Y_DATA_REG+1, &val[1]);
- *p_y = val[0] | (val[1] << 8);
- lis3dh_read_reg(LIS3DH_Z_DATA_REG, &val[0]); //2c
- lis3dh_read_reg(LIS3DH_Z_DATA_REG+1, &val[1]);
- *p_z = val[0] | (val[1] << 8);
- }
- }
- /*
- 使传感器开始工作函数
- 如果没有调用该函数,传感器返回的结果不正常
- */
- void lis3dh_strat_accelerometer()
- {
- lis3dh_write_reg(0x20, ( LIS3DH_REG0x20_VAL| 0x07 ));
- }
- /*
- 使传感器结束工作函数
- 调用了该函数后,传感器返回的结果将不正常
- */
- void lis3dh_stop_accelerometer()
- {
- lis3dh_write_reg(0x20, LIS3DH_REG0x20_VAL);
- }
复制代码 串口打印读取的SPI数据
I2C驱动部分例程如下,
- #include "lis3dh.h"
- #include "i2c.h"
- #include "gpio.h"
- /*
- 寄存器配置数组
- 第一个数数据为寄存器地址 第二个数据为寄存器数据
- */
- const uint8_t lis3dh_init_data[] =
- {
- 0x20, 0x4F, // CTRL_REG1 Normal / low power mode (50 Hz) low power mode Z、X、Y axis enable
- 0x21, 0x00, // CTRL_REG2 失能所有高通滤波
- 0x22, 0x80, // CTRL_REG3 只是使能了CLICK interrupt on INT1
- 0x23, 0x20, // CTRL_REG4 [5:4] 00: +/- 2G; 01: +/- 4G; 10: +/- 8G; 11: +/- 16G 选择了8G
- 0x24, 0x00, // CTRL_REG5 失能FIFO等功能
- 0x25, 0x80, // CTRL_REG6 使能I2_CLICKen
- 0x38, 0x10, // CLICK_CFG, only enable single click interrupt Z
- 0x3A, 0x1A, // CLICK_THS
- 0x3B, 0x04, // TIME_LIMIT
- 0x3C, 0x03, // TIME_LATENCY
- 0x3D, 0x20, // TIME_WINDOW
- };
- /*
- lis3dh写寄存器函数
- 参数: uint8_t addr 寄存器地址
- uint8_t value 寄存器数据
- 注意ID地址不作为传入参数 已经在全部变量定义好了
- */
- void lis3dh_write_reg(uint8_t addr, uint8_t value)
- {
- i2c_0_write(LIS3DH_ID, I2C_1_BYTE_ADDRESS, addr, &value, 0x01);
- }
- /*
- lis3dh读寄存器函数
- 参数: uint8_t addr 寄存器地址
- uint8_t value 读到的内容
- 注意ID地址不作为传入参数 已经在全部变量定义好了
- */
- void lis3dh_read_reg(uint8_t addr, uint8_t *p_value)
- {
- i2c_0_read(LIS3DH_ID, I2C_1_BYTE_ADDRESS, addr, p_value, 0x01);
- }
- /*
- lis3dh初始化函数
- 这里配置了寄存器
- */
- void lis3dh_init(void)
- {
- uint8_t i;
- // lis3dh register initialization
- for(i=0; i<(sizeof(lis3dh_init_data)); i+=2)
- lis3dh_write_reg(lis3dh_init_data[i], lis3dh_init_data[i+1]);
- }
- /*
- lis3dh获取加速度传感器三个轴的数据函数
- 传入参数:uint16_t *p_x X轴数据存储指针
- uint16_t *p_y y轴数据存储指针
- uint16_t *p_z z轴数据存储指针
- */
- void lis3dh_get_accelerometer_data(int16_t *p_x, int16_t *p_y, int16_t *p_z)
- {
- uint8_t st;
- uint8_t val[2];
- lis3dh_read_reg(LIS3DH_STATUS_REG, &st); //07
- if((st & 0x04) != 0x00)
- {
- lis3dh_read_reg(LIS3DH_X_DATA_REG, &val[0]); //28
- lis3dh_read_reg(LIS3DH_X_DATA_REG+1, &val[1]);
- *p_x = val[0] | (val[1] << 8);
- lis3dh_read_reg(LIS3DH_Y_DATA_REG, &val[0]); //2A
- lis3dh_read_reg(LIS3DH_Y_DATA_REG+1, &val[1]);
- *p_y = val[0] | (val[1] << 8);
- lis3dh_read_reg(LIS3DH_Z_DATA_REG, &val[0]); //2c
- lis3dh_read_reg(LIS3DH_Z_DATA_REG+1, &val[1]);
- *p_z = val[0] | (val[1] << 8);
- }
- }
- /*
- 使传感器开始工作函数
- 如果没有调用该函数,传感器返回的结果不正常
- */
- void lis3dh_strat_accelerometer()
- {
- lis3dh_write_reg(0x20, ( LIS3DH_REG0x20_VAL| 0x07 ));
- }
- /*
- 使传感器结束工作函数
- 调用了该函数后,传感器返回的结果将不正常
- */
- void lis3dh_stop_accelerometer()
- {
- lis3dh_write_reg(0x20, LIS3DH_REG0x20_VAL);
- }
复制代码
串口打印读取的I2C数据
下面是两个例程
由于今天上传流量用完了,明天继续上传STM8的SPI驱动例程。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
阿莫论坛才是最爱国的,关心国家的经济、社会的发展、担心国家被别国牵连卷入战争、知道珍惜来之不易的和平发展,知道师夷之长,关注世界的先进文化与技术,也探讨中国文化的博大精深,也懂得警惕民粹主义的祸国殃民等等等等,无不是爱国忧民的表现。(坛友:tianxian)
|