最近芯片紧张,国产IC应用趋多。SC7A20是国产三轴加速度传感器。芯片使用LGA-12-2x2x1.0mm包装,体积极小。具有以下功能:
本来想省去做轮子的过程,直接用别人的例程,但是网上应用的例子很少,就自己瞎搞。
直奔主题,如何驱动SC7A20呢?
一是硬件配置:
这是一款IIC和SPI兼容的芯片。本例子采用了IIC通信模式。因为这样可以节省引脚。IC引脚资源紧张时,极其方便。(SPI优点是通信速度快。
下面我们上电路图
根据手册,需要设置通信模式。
拉高10号引脚CS即设置芯片通信模式为IIC。
浮空1号引脚SDO也就是说,将芯片设备的地址设置为默认地址此地址手册可查)。
另外,IIC接口需要上拉。因为我的主控IC引脚内部有上拉电阻,所以我不做额外的设置。
在这里,硬件设置完成。让我们设置软件:
首先要考虑通信速率,SC7A20的IIC如上图所示,最大通信速度为400K。我使用了150KHz。
#define MID_SC7A20_SPEED 150 iic_init(IIC_CHANNEL_0, MID_SC7A20_SPEED, 0);
查手册可知下列寄存器地址:
#define ADDR_SC7A20 0x19 #define ADDR_WHO_AM_I 0x0F #define ADDR_CTRL_REG_1 0x20 #define ADDR_CTRL_REG_2 0x21 #define ADDR_CTRL_REG_3 0x22 #define ADDR_X_L 0x28 #define ADDR_X_H 0x29 #define ADDR_Y_L 0x2A #define ADDR_Y_H 0x2B #define ADDR_Z_L 0x2C #define ADDR_Z_H 0x2D #define ADDR_WHO_AM_I 0x0F #define ADDR_STATUS_REG 0x27
知道这些寄存器地址后,我们在使用它之前,还要做一些初始化工作:
void sc7a20Init() { iic_write_byte(IIC_CHANNEL_0, ADDR_SC7A20 << 1, ADDR_CTRL_REG_1, 0x77); iic_write_byte(IIC_CHANNEL_0, ADDR_SC7A20 << 1, ADDR_CTRL_REG_2, 0x88); iic_write_byte(IIC_CHANNEL_0, ADDR_SC7A20 << 1, ADDR_CTRL_REG_3, 0x88); }
这里详细配置内容内容参考手册。
然后我们实现一个方法来读取一个坐标轴的数据
int SC7A20_Get_ACCD(uint8_t accd_lsb, uint8_t accd_msb) { uint8_t accd_l, accd_m = 0; uint32_t temp; int accd; iic_read_byte(IIC_CHANNEL_0, ADDR_SC7A20 << 1, accd_lsb, &accd_l); iic_read_byte(IIC_CHANNEL_0, ADDR_SC7A20 << 1, accd_msb, &accd_m); temp &= 0x0000; temp |= accd_m; temp <<= 8; temp &= 0xff00; temp |= accd_l; if(temp& 0x8000) { temp >>= 4; temp |= 0xf000; } else { temp >>= 4; temp &= 0x0fff; } accd = temp* 1; return accd; }
然后实现一个方法输出三个轴的数据:
void SC7A20_GetInfo() { int x,y,z = 0; unsigned char i = 16; for(i= 8;i> 0;i--) { x += SC7A20_Get_ACCD(ADDR_X_L,ADDR_X_H); y += SC7A20_Get_ACCD(ADDR_Y_L,ADDR_Y_H); z += SC7A20_Get_ACCD(ADDR_Z_L,ADDR_Z_H); } x /= 8; y /= 8; z /= 8; if (x || y || z) { } co_printf( "x: 0x%x mg, y: 0x%x mg, z: 0x%x mg \r\n", x, y, z); }
这时,当x,y,z其中任意一轴有数据时,便可打印数据到串口
文到末尾,如果您觉得不错,可以通过打赏功能请我喝杯咖啡。您的支持是我的动力!