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其中任意一轴有数据时,便可打印数据到串口

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

  • 10
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值