GD32E231模拟IIC驱动LIS2DW12
[复制链接]
继续玩加速度传感器LIS2DW12。
主要是获取3个轴的重力加速度。
看原理图,这个是连接在IIC2上面的,但是使用IIC1的接口也是可以使用的,因为IIC和IIC2都连接在了一个总线上,是可以通用的:
上图中可以看到IIC地址是0x32
寄存器,该芯片的寄存器较多。
其中主要使用到的寄存器在下面:
不知道为什么,提供了两个温度寄存器,一个是12bit的,还有一个是8bit的。这两个的寄存器如下。
12bit:
温度寄存器第4为没用,所以读出来的值需要除以16,看下面的说明16LBS/℃,寄存器值全0的时候是25摄氏度,所以实际值是25+寄存器值/16/16.
8bit:
寄存器的值全0的时候是25℃,没1LBS是1℃,所以温度值为25+寄存器值。
Who_am_i寄存器:
控制寄存器1:
状态寄存器:
XYZ输出寄存器:
代码:
初始化:
//初始化传感器LIS2DW12
if(0 == Set_Reg_LIS2DW12(LIS2DW12_ADDR_W_1, LIS2DW12_CTRL1, 0x16))
{
send_str((unsigned char *)"IF_CTRL set successful\r\n");
}
else
{
send_str((unsigned char *)"IF_CTRL set fail\r\n");
}
寄存器操作和串口发送数据:
//LIS2DW12写
static int IIC_WrDat_LIS2DW12(uint8_t IIC_Add, uint8_t IIC_Reg, uint8_t IIC_Data)
{
uint8_t ret_suc = 1;
IIC_Start();
IIC_Send_Byte(IIC_Add & 0xfe);
ret_suc = IIC_Wait_Ack();
if(ret_suc == 1) {IIC_Stop();return -1;}
IIC_Send_Byte(IIC_Reg); //write data
ret_suc = IIC_Wait_Ack();
if(ret_suc == 1) {IIC_Stop();return -1;}
IIC_Send_Byte(IIC_Data);
ret_suc = IIC_Wait_Ack();
if(ret_suc == 1) {IIC_Stop();return -1;}
IIC_Stop();
return 0;
}
//LIS2DW12读
static int IIC_Read_LIS2DW12(uint8_t IIC_Add, uint8_t IIC_Reg)
{
int ret;
uint8_t ret_suc = 1;
IIC_Start();
IIC_Send_Byte(IIC_Add & 0xfe);
ret_suc = IIC_Wait_Ack();
if(ret_suc == 1) {IIC_Stop();return -1;}
IIC_Send_Byte(IIC_Reg);
ret_suc = IIC_Wait_Ack();
if(ret_suc == 1) {IIC_Stop();return -1;}
IIC_Start();
IIC_Send_Byte(IIC_Add | 0x01);
ret_suc = IIC_Wait_Ack();
if(ret_suc == 1) {IIC_Stop();return -1;}
ret=IIC_Read_Byte(0);
IIC_Stop();
return ret;
}
//LIS2DW12读2个寄存器
static int IIC_Read2_LIS2DW12(uint8_t IIC_Add, uint8_t IIC_Reg)
{
int ret;
uint8_t ret_suc = 1;
IIC_Start();
IIC_Send_Byte(IIC_Add & 0xfe);
ret_suc = IIC_Wait_Ack();
if(ret_suc == 1) {IIC_Stop();return -1;}
IIC_Send_Byte(IIC_Reg);
ret_suc = IIC_Wait_Ack();
if(ret_suc == 1) {IIC_Stop();return -1;}
IIC_Start();
IIC_Send_Byte(IIC_Add | 0x01);
ret_suc = IIC_Wait_Ack();
if(ret_suc == 1) {IIC_Stop();return -1;}
ret=IIC_Read_Byte(1);
ret=(IIC_Read_Byte(0)<<8)|ret;
IIC_Stop();
return ret;
}
//设置寄存器
int Set_Reg_LIS2DW12(uint8_t add, uint8_t reg, uint8_t dat)
{
int ret_succ = -1;
uint8_t i = 20u; //失败之后尝试的次数
do{
if(0 == IIC_WrDat_LIS2DW12(add, reg, dat))
{
ret_succ = 0; //设置成功
break;
}
else
{
i--; //获取失败,再次尝试
}
}while(i>0u);
return ret_succ;
}
//读取寄存器
int Get_Reg_LIS2DW12(uint8_t add, uint8_t reg)
{
uint8_t i = 20u;
int ret_get = -1;
do{
ret_get = IIC_Read_LIS2DW12(add, reg);
if(-1 != ret_get)
{
break; //获取数据成功
}
else
{
i--; //获取失败,再次尝试
}
}while(i>0u);
return ret_get;
}
//读取我是谁
int Get_WHO_AM_I_LIS2DW12(void)
{
return Get_Reg_LIS2DW12(LIS2DW12_ADDR_W_1, LIS2DW12_REG_WHO_AM_I);
}
//获取状态寄存器
int Get_Status_LIS2DW12(void)
{
return Get_Reg_LIS2DW12(LIS2DW12_ADDR_W_1, LIS2DW12_CFG_STATUS);
}
float Get_Temp_1_LIS2DW12(void)
{
short temp_reg = (Get_Reg_LIS2DW12(LIS2DW12_ADDR_W_1, LIS2DW12_OUT_T_H)<<8)|Get_Reg_LIS2DW12(LIS2DW12_ADDR_W_1, LIS2DW12_OUT_T_L);
float temp_cal = 0.0f;
temp_cal = 25.0+temp_reg/16.0/16.0;
return temp_cal;
}
signed char Get_Temp_2_LIS2DW12(void)
{
return (25+(Get_Reg_LIS2DW12(LIS2DW12_ADDR_W_1, LIS2DW12_OUT_T)));
}
short Get_X_LIS2DW12(void)
{
return ((Get_Reg_LIS2DW12(LIS2DW12_ADDR_W_1, LIS2DW12_OUT_X_H)<<8)|Get_Reg_LIS2DW12(LIS2DW12_ADDR_W_1, LIS2DW12_OUT_X_L));
}
short Get_Y_LIS2DW12(void)
{
return ((Get_Reg_LIS2DW12(LIS2DW12_ADDR_W_1, LIS2DW12_OUT_Y_H)<<8)|Get_Reg_LIS2DW12(LIS2DW12_ADDR_W_1, LIS2DW12_OUT_Y_L));
}
short Get_Z_LIS2DW12(void)
{
return ((Get_Reg_LIS2DW12(LIS2DW12_ADDR_W_1, LIS2DW12_OUT_Z_H)<<8)|Get_Reg_LIS2DW12(LIS2DW12_ADDR_W_1, LIS2DW12_OUT_Z_L));
}
//发送数据到串口
void Send_Uart_LIS2DW12(void)
{
char str[35] = {0};
send_str((uint8_t *)"<-----------START--------->\r\n");
sprintf(str,"X:%d | Y:%d | Z:%d\r\n", Get_X_LIS2DW12(),Get_Y_LIS2DW12(),Get_Z_LIS2DW12());
send_str((uint8_t *)str);
sprintf(str,"Temp:%.2f℃ | %d℃\r\n", Get_Temp_1_LIS2DW12(),Get_Temp_2_LIS2DW12());
send_str((uint8_t *)str);
sprintf(str,"Status:0x%X\r\n", Get_Status_LIS2DW12());
send_str((uint8_t *)str);
sprintf(str,"Who_am_i:%X\r\n",Get_WHO_AM_I_LIS2DW12());
send_str((uint8_t *)str);
send_str((uint8_t *)"<------------END---------->\r\n\n");
}
显示效果:
|