搜索
bottom↓
回复: 3

【分享】SYD8810 SPI和I2C驱动LIS3DH demo例程(附送STM8驱动例程)

[复制链接]

出0入102汤圆

发表于 2020-8-25 12:42:53 | 显示全部楼层 |阅读模式
前两天看到有坛友问LIS3DH驱动例程,刚好手上有这个芯片,它支持SPI和I2C接口,分享的例程属于入门例程,欢迎大神指正。
SYD8810的内核是Cortex-M0,支持IO任意配置,下面是LIS3DH的SPI和I2C接口原理图,


两个例程使用MDK5编译。SPI驱动部分例程如下,

  1. #include "SPI_LIS3DH.h"
  2. #include "spi.h"

  3. /*
  4. 寄存器配置数组
  5. 第一个数数据为寄存器地址 第二个数据为寄存器数据
  6. */
  7. const uint8_t lis3dh_init_data[] =
  8. {
  9.         0x20, 0x4F, // CTRL_REG1  Normal / low power mode (50 Hz)  low power mode Z、X、Y axis enable
  10.         0x21, 0x00, // CTRL_REG2  失能所有高通滤波
  11.         0x22, 0x80, // CTRL_REG3  只是使能了CLICK interrupt on INT1
  12.         0x23, 0x20, // CTRL_REG4  [5:4] 00: +/- 2G; 01: +/- 4G; √10: +/- 8G; 11: +/- 16G 选择了8G   
  13.         0x24, 0x00, // CTRL_REG5   失能FIFO等功能
  14.         0x25, 0x80, // CTRL_REG6   使能I2_CLICKen  
  15.         0x38, 0x10, // CLICK_CFG, only enable single click interrupt  Z
  16.         0x3A, 0x1A, // CLICK_THS
  17.         0x3B, 0x04, // TIME_LIMIT
  18.         0x3C, 0x03, // TIME_LATENCY
  19.         0x3D, 0x20, // TIME_WINDOW
  20. };



  21. /*
  22. lis3dh写寄存器函数
  23. 参数: uint8_t addr  寄存器地址
  24.                          uint8_t value 寄存器数据
  25. 注意ID地址不作为传入参数 已经在全部变量定义好了
  26. */
  27. void lis3dh_write_reg(uint8_t addr, uint8_t value)
  28. {        
  29.         SPI_SendData(addr, value);        
  30. }
  31. /*
  32. lis3dh读寄存器函数
  33. 参数: uint8_t addr  寄存器地址
  34.                          uint8_t value 读到的内容
  35. 注意ID地址不作为传入参数 已经在全部变量定义好了
  36. */
  37. void lis3dh_read_reg(uint8_t addr, uint8_t *p_value)
  38. {
  39.         SPI_ReceiveData(addr, p_value);
  40. }
  41. /*
  42. lis3dh初始化函数
  43. 这里配置了寄存器
  44. */
  45. uint8_t lis3dh_init(void)
  46. {
  47.         uint8_t i,st;
  48.         spi_init(GSensor_SPI);
  49.         // lis3dh register initialization
  50.         for(i=0; i<(sizeof(lis3dh_init_data)); i+=2)
  51.                 lis3dh_write_reg(lis3dh_init_data[i], lis3dh_init_data[i+1]);
  52.         lis3dh_read_reg(LIS3DH_WHO_AM_I_REG, &st);
  53.         if(st == 0x33) return st;
  54.         return 0;
  55. }
  56. /*
  57. lis3dh获取加速度传感器三个轴的数据函数
  58. 传入参数:uint16_t *p_x X轴数据存储指针
  59.                                         uint16_t *p_y y轴数据存储指针
  60.                                         uint16_t *p_z z轴数据存储指针
  61. */
  62. void lis3dh_get_accelerometer_data(int16_t *p_x, int16_t *p_y, int16_t *p_z)
  63. {
  64.         uint8_t st;
  65.         uint8_t val[2];
  66.         lis3dh_read_reg(LIS3DH_STATUS_REG, &st);   //07
  67.         if((st & 0x04) != 0x00)
  68.         {
  69.                 lis3dh_read_reg(LIS3DH_X_DATA_REG, &val[0]);   //28
  70.                 lis3dh_read_reg(LIS3DH_X_DATA_REG+1, &val[1]);
  71.                 *p_x = val[0] | (val[1] << 8);
  72.                 lis3dh_read_reg(LIS3DH_Y_DATA_REG, &val[0]);   //2A
  73.                 lis3dh_read_reg(LIS3DH_Y_DATA_REG+1, &val[1]);
  74.                 *p_y = val[0] | (val[1] << 8);
  75.                 lis3dh_read_reg(LIS3DH_Z_DATA_REG, &val[0]);    //2c
  76.                 lis3dh_read_reg(LIS3DH_Z_DATA_REG+1, &val[1]);
  77.                 *p_z = val[0] | (val[1] << 8);
  78.         }
  79. }
  80. /*
  81. 使传感器开始工作函数
  82. 如果没有调用该函数,传感器返回的结果不正常
  83. */
  84. void lis3dh_strat_accelerometer()
  85. {
  86.         lis3dh_write_reg(0x20, ( LIS3DH_REG0x20_VAL| 0x07 ));
  87. }
  88. /*
  89. 使传感器结束工作函数
  90. 调用了该函数后,传感器返回的结果将不正常
  91. */
  92. void lis3dh_stop_accelerometer()
  93. {
  94.         lis3dh_write_reg(0x20, LIS3DH_REG0x20_VAL);
  95. }


复制代码
串口打印读取的SPI数据




I2C驱动部分例程如下,

  1. #include "lis3dh.h"
  2. #include "i2c.h"
  3. #include "gpio.h"

  4. /*
  5. 寄存器配置数组
  6. 第一个数数据为寄存器地址 第二个数据为寄存器数据
  7. */
  8. const uint8_t lis3dh_init_data[] =
  9. {
  10.         0x20, 0x4F, // CTRL_REG1  Normal / low power mode (50 Hz)  low power mode Z、X、Y axis enable
  11.         0x21, 0x00, // CTRL_REG2  失能所有高通滤波
  12.         0x22, 0x80, // CTRL_REG3  只是使能了CLICK interrupt on INT1
  13.         0x23, 0x20, // CTRL_REG4  [5:4] 00: +/- 2G; 01: +/- 4G; 10: +/- 8G; 11: +/- 16G 选择了8G   
  14.         0x24, 0x00, // CTRL_REG5   失能FIFO等功能
  15.         0x25, 0x80, // CTRL_REG6   使能I2_CLICKen  
  16.         0x38, 0x10, // CLICK_CFG, only enable single click interrupt  Z
  17.         0x3A, 0x1A, // CLICK_THS
  18.         0x3B, 0x04, // TIME_LIMIT
  19.         0x3C, 0x03, // TIME_LATENCY
  20.         0x3D, 0x20, // TIME_WINDOW
  21. };
  22. /*
  23. lis3dh写寄存器函数
  24. 参数: uint8_t addr  寄存器地址
  25.                          uint8_t value 寄存器数据
  26. 注意ID地址不作为传入参数 已经在全部变量定义好了
  27. */
  28. void lis3dh_write_reg(uint8_t addr, uint8_t value)
  29. {        
  30.         i2c_0_write(LIS3DH_ID, I2C_1_BYTE_ADDRESS, addr, &value, 0x01);
  31. }
  32. /*
  33. lis3dh读寄存器函数
  34. 参数: uint8_t addr  寄存器地址
  35.                          uint8_t value 读到的内容
  36. 注意ID地址不作为传入参数 已经在全部变量定义好了
  37. */
  38. void lis3dh_read_reg(uint8_t addr, uint8_t *p_value)
  39. {
  40.         i2c_0_read(LIS3DH_ID, I2C_1_BYTE_ADDRESS, addr, p_value, 0x01);
  41. }
  42. /*
  43. lis3dh初始化函数
  44. 这里配置了寄存器
  45. */
  46. void lis3dh_init(void)
  47. {
  48.         uint8_t i;
  49.         // lis3dh register initialization
  50.         for(i=0; i<(sizeof(lis3dh_init_data)); i+=2)
  51.                 lis3dh_write_reg(lis3dh_init_data[i], lis3dh_init_data[i+1]);
  52. }
  53. /*
  54. lis3dh获取加速度传感器三个轴的数据函数
  55. 传入参数:uint16_t *p_x X轴数据存储指针
  56.                                         uint16_t *p_y y轴数据存储指针
  57.                                         uint16_t *p_z z轴数据存储指针
  58. */
  59. void lis3dh_get_accelerometer_data(int16_t *p_x, int16_t *p_y, int16_t *p_z)
  60. {
  61.         uint8_t st;
  62.         uint8_t val[2];
  63.         lis3dh_read_reg(LIS3DH_STATUS_REG, &st);   //07
  64.         if((st & 0x04) != 0x00)
  65.         {
  66.                 lis3dh_read_reg(LIS3DH_X_DATA_REG, &val[0]);   //28
  67.                 lis3dh_read_reg(LIS3DH_X_DATA_REG+1, &val[1]);
  68.                 *p_x = val[0] | (val[1] << 8);
  69.                 lis3dh_read_reg(LIS3DH_Y_DATA_REG, &val[0]);   //2A
  70.                 lis3dh_read_reg(LIS3DH_Y_DATA_REG+1, &val[1]);
  71.                 *p_y = val[0] | (val[1] << 8);
  72.                 lis3dh_read_reg(LIS3DH_Z_DATA_REG, &val[0]);    //2c
  73.                 lis3dh_read_reg(LIS3DH_Z_DATA_REG+1, &val[1]);
  74.                 *p_z = val[0] | (val[1] << 8);
  75.         }
  76. }
  77. /*
  78. 使传感器开始工作函数
  79. 如果没有调用该函数,传感器返回的结果不正常
  80. */
  81. void lis3dh_strat_accelerometer()
  82. {
  83.         lis3dh_write_reg(0x20, ( LIS3DH_REG0x20_VAL| 0x07 ));
  84. }
  85. /*
  86. 使传感器结束工作函数
  87. 调用了该函数后,传感器返回的结果将不正常
  88. */
  89. void lis3dh_stop_accelerometer()
  90. {
  91.         lis3dh_write_reg(0x20, LIS3DH_REG0x20_VAL);
  92. }
复制代码

串口打印读取的I2C数据


下面是两个例程



由于今天上传流量用完了,明天继续上传STM8的SPI驱动例程。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入102汤圆

 楼主| 发表于 2020-8-26 17:31:07 | 显示全部楼层
上一个板子的运行效果,500ms采集一次数据通过UART发送到串口助手。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入102汤圆

 楼主| 发表于 2020-8-26 17:41:18 | 显示全部楼层
上传一个STM8 SPI驱动LIS3DH的例程,从别的地方下载的,IAR的工程,没有验证过,不过可以作为参考。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出5入0汤圆

发表于 2021-8-11 10:43:56 | 显示全部楼层
谢谢分享!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-16 12:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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