资讯详情

SC7A20信息

最近芯片紧张,国产IC应用趋多。SC7A20是国产三轴加速度传感器。芯片使用LGA-12-2x2x1.0mm包装,体积极小。具有以下功能:

本来想省去做轮子的过程,直接用别人的例程,但是网上应用的例子很少,就自己瞎搞。

直奔主题,如何驱动SC7A20呢?

一是硬件配置:

这是一款IIC和SPI兼容的芯片。本例子采用了IIC通信模式。因为这样可以节省引脚。IC引脚资源紧张时,极其方便。(SPI优点是通信速度快。

下面我们上电路图

根据手册,需要设置通信模式。

拉高10号引脚CS即设置芯片通信模式为IIC。

浮空1号引脚SDO也就是说,将芯片设备的地址设置为默认地址此地址手册可查)。

另外,IIC接口需要上拉。因为我的主控IC引脚内部有上拉电阻,所以我不做额外的设置。

在这里,硬件设置完成。让我们设置软件:

首先要考虑通信速率,SC7A20的IIC如上图所示,最大通信速度为400K。我使用了150KHz。

          
       
  1. #define MID_SC7A20_SPEED 150
  2. iic_init(IIC_CHANNEL_0, MID_SC7A20_SPEED, 0);

查手册可知下列寄存器地址:

          
       
  1. #define ADDR_SC7A20 0x19
  2. #define ADDR_WHO_AM_I 0x0F
  3. #define ADDR_CTRL_REG_1 0x20
  4. #define ADDR_CTRL_REG_2 0x21
  5. #define ADDR_CTRL_REG_3 0x22
  6. #define ADDR_X_L 0x28
  7. #define ADDR_X_H 0x29
  8. #define ADDR_Y_L 0x2A
  9. #define ADDR_Y_H 0x2B
  10. #define ADDR_Z_L 0x2C
  11. #define ADDR_Z_H 0x2D
  12. #define ADDR_WHO_AM_I 0x0F
  13. #define ADDR_STATUS_REG 0x27

 知道这些寄存器地址后,我们在使用它之前,还要做一些初始化工作:


   
     
       
  1. void sc7a20Init() {
  2. iic_write_byte(IIC_CHANNEL_0, ADDR_SC7A20 << 1, ADDR_CTRL_REG_1, 0x77);
  3. iic_write_byte(IIC_CHANNEL_0, ADDR_SC7A20 << 1, ADDR_CTRL_REG_2, 0x88);
  4. iic_write_byte(IIC_CHANNEL_0, ADDR_SC7A20 << 1, ADDR_CTRL_REG_3, 0x88);
  5. }

这里详细配置内容内容参考手册。

然后我们实现一个方法来读取一个坐标轴的数据


   
     
       
  1. int SC7A20_Get_ACCD(uint8_t accd_lsb, uint8_t accd_msb) {
  2. uint8_t accd_l, accd_m = 0;
  3. uint32_t temp;
  4. int accd;
  5. iic_read_byte(IIC_CHANNEL_0, ADDR_SC7A20 << 1, accd_lsb, &accd_l);
  6. iic_read_byte(IIC_CHANNEL_0, ADDR_SC7A20 << 1, accd_msb, &accd_m);
  7. temp &= 0x0000;
  8. temp |= accd_m;
  9. temp <<= 8;
  10. temp &= 0xff00;
  11. temp |= accd_l;
  12. if(temp& 0x8000)
  13. {
  14. temp >>= 4;
  15. temp |= 0xf000;
  16. }
  17. else
  18. {
  19. temp >>= 4;
  20. temp &= 0x0fff;
  21. }
  22. accd = temp* 1;
  23. return accd;
  24. }

然后实现一个方法输出三个轴的数据:


   
     
       
  1. void SC7A20_GetInfo() {
  2. int x,y,z = 0;
  3. unsigned char i = 16;
  4. for(i= 8;i> 0;i--)
  5. {
  6. x += SC7A20_Get_ACCD(ADDR_X_L,ADDR_X_H);
  7. y += SC7A20_Get_ACCD(ADDR_Y_L,ADDR_Y_H);
  8. z += SC7A20_Get_ACCD(ADDR_Z_L,ADDR_Z_H);
  9. }
  10. x /= 8;
  11. y /= 8;
  12. z /= 8;
  13. if (x || y || z) {
  14. }
  15. co_printf( "x: 0x%x mg, y: 0x%x mg, z: 0x%x mg \r\n", x, y, z);
  16. }

这时,当x,y,z其中任意一轴有数据时,便可打印数据到串口

文到末尾,如果您觉得不错,可以通过打赏功能请我喝杯咖啡。您的支持是我的动力!

标签: 传感器7a1707c

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台