近来芯片紧张,国产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其中任意一轴有数据时,便可打印数据到串口
文到末尾,如果您觉得不错,可以通过打赏功能请我喝杯咖啡。您的支持是我的动力!