ST32F103x 通过I2C读取X-NUCLEO-IKS01A3上传感器的值
[复制链接]
本帖最后由 zdzd23 于 2019-10-6 23:52 编辑
ST32F103x 通过I2C读取X-NUCLEO-IKS01A3上传感器的值.rar
(3.81 MB, 下载次数: 31)
ST32F103x 通过I2C读取X-NUCLEO-IKS01A3上传感器的值.rar
(3.81 MB, 下载次数: 31)
首先是接线:3.3V,GND,SCL,SDA
预定义代码:
/*芯片地址*/
#define LSM6DSO_ADRESS 0XD6
#define LIS2MDL_ADRESS 0X3C
#define LIS2DW12_ADRESS 0X32
#define LPS22HH_ADRESS 0XBA
#define HTS221_ADRESS 0XBE
#define STTS751_ADRESS 0X94
读写函数:
u8 IC_ReadOneByte(u16 IC_ID,u16 addr)
{
u8 temp=0;
u8 ret_suc =1;
I2C_Start();
I2C_Send_Byte(IC_ID&0xfe);//发送器件地址
ret_suc=I2C_Wait_Ack();
if(ret_suc == 1) {return -1;}
I2C_Send_Byte(addr);//发送寄存器地址
ret_suc=I2C_Wait_Ack();
if(ret_suc == 1) {return -1;}
I2C_Start();
I2C_Send_Byte(IC_ID|0x01);//发送器件地址
ret_suc=I2C_Wait_Ack();
if(ret_suc == 1) {return -1;}
temp=I2C_Read_Byte(0); // 0 代表 NACK
//I2C_NAck();
I2C_Stop();
return temp;
}
**************************************************************************
u8 IC_WriteOneByte(u16 IC_ID,u16 addr,u8 value)
{
u8 ret_suc =1;
I2C_Start();
I2C_Send_Byte(IC_ID&0xfe);//发送器件地址
ret_suc=I2C_Wait_Ack();
if(ret_suc == 1) {return -1;}
I2C_Send_Byte(addr);
//单字节是数据地址低位
ret_suc=I2C_Wait_Ack();
if(ret_suc == 1) {return -1;}
I2C_Send_Byte(value);
ret_suc=I2C_Wait_Ack();
if(ret_suc == 1) {return -1;}
I2C_Stop();
delay_ms(10);
return 0;
}
此处务必注意具体的信号时序,时序不对,我在此浪费几天时间。
芯片初始化:
/**********************LPS22HH初始化*************************************/
rig=0xff ;
rig=IC_ReadOneByte(LPS22HH_ADRESS,0X10);
printf("LPS22HH寄存器CONG_REG的值:%d\r\n",rig);
rig=rig&0x8f;
rig=rig|0X10;
do
{
if(0==IC_WriteOneByte(LPS22HH_ADRESS,0X10,rig)){j=7;} ;
delay_ms(10);
reg=IC_ReadOneByte(LPS22HH_ADRESS,0X10);
//j++;
}
while((j<6)&&(reg!=rig));
reg=IC_ReadOneByte(LPS22HH_ADRESS,0X10);
printf("写入后寄存器的值:%d\r\n",reg);
delay_ms(10);
/**********************LPS22HH初始化end*************************************/
//*******************初始设置LSM6DSO寄存器 *****************************
j=0;
do
{
if(0==IC_WriteOneByte(LSM6DSO_ADRESS,0X10,0x10)){j=8;} ;
}
while(j!=8);
j=0;
do
{
if(0==IC_WriteOneByte(LSM6DSO_ADRESS,0X11,0x12)){j=8;} ;
}
while(j!=8);
//*******************初始设置LSM6DSO寄存器end **************************
//*******************初始设置HTS221寄存器 *****************************
j=0;
do
{
if(0==IC_WriteOneByte(HTS221_ADRESS,0X10,0x09)){j=8;} ;
}
while(j!=8);
j=0;
do
{
if(0==IC_WriteOneByte(HTS221_ADRESS,0X20,0x81)){j=8;} ;
}
while(j!=8);
//*******************初始设置HTS221寄存器end **************************
while(1)
{
/**********************stt751读取*************************************/
此处应注意寄存器位的具体作用,有的芯片模式必须选择,否则不进入工作状态。
读出与打印程序:/**********************LSM6DSO读取*************************************/
printf("/******************五,LSM6DSO**********************/\r\n");
//读取Who I am
x=y=z=0 ;
value=IC_ReadOneByte(LSM6DSO_ADRESS,0X0f);
printf("我是LSM6DSO,ID是:%d\r\n",value);
delay_ms(10);
//读取加速度的值
//读取X
value_H=IC_ReadOneByte(LSM6DSO_ADRESS,0X23);
value_L=IC_ReadOneByte(LSM6DSO_ADRESS,0X22);
x=(value_H)<<8|value_L;
delay_ms(10);
//读取Y
value_H=IC_ReadOneByte(LSM6DSO_ADRESS,0X25);
value_L=IC_ReadOneByte(LSM6DSO_ADRESS,0X24);
y=(value_H)<<8|value_L;
delay_ms(10);
//读取Z
value_H=IC_ReadOneByte(LSM6DSO_ADRESS,0X27);
value_L=IC_ReadOneByte(LSM6DSO_ADRESS,0X26);
z=(value_H)<<8|value_L;
printf("读出来的LSM6DSO的加速度传感器值是:X:%d Y:%d Z:%d\r\n",x,y,z);
//读取陀螺仪的值
x=y=z=0 ;
//读取X
value_H=IC_ReadOneByte(LSM6DSO_ADRESS,0X29);
value_L=IC_ReadOneByte(LSM6DSO_ADRESS,0X28);
x=(value_H)<<8|value_L;
delay_ms(10);
//读取Y
value_H=IC_ReadOneByte(LSM6DSO_ADRESS,0X2b);
value_L=IC_ReadOneByte(LSM6DSO_ADRESS,0X2a);
y=(value_H)<<8|value_L;
delay_ms(10);
//读取Z
value_H=IC_ReadOneByte(LSM6DSO_ADRESS,0X2d);
value_L=IC_ReadOneByte(LSM6DSO_ADRESS,0X2c);
z=(value_H)<<8|value_L;
printf("读出来的LSM6DSO的陀螺仪的值是:X:%d Y:%d Z:%d\r\n",x,y,z);
//读取陀螺仪的值结束
printf("/*******************************************/\r\n");
value=0;
delay_ms(100);
/**********************LSM6DSO读取END*************************************/
/**********************HTS221读取*************************************/
printf("/*******************六**********************/\r\n");
delay_ms(100);
x=y=value=0 ;
value=IC_ReadOneByte(HTS221_ADRESS,0X0F);
printf("我是HTS221,我的ID是:%d\r\n",value);
//读取温度
value_H=IC_ReadOneByte(HTS221_ADRESS,0X2B);
value_L=IC_ReadOneByte(HTS221_ADRESS,0X2A);
x=(value_H)<<8|value_L;
delay_ms(10);
//读取湿度
value_H=IC_ReadOneByte(HTS221_ADRESS,0X29);
value_L=IC_ReadOneByte(HTS221_ADRESS,0X28);
y=(value_H)<<8|value_L;
delay_ms(10);
printf("读出来的HTS221温度是:%d,湿度是:%d\r\n",x,y);
delay_ms(10);
printf("/*******************************************/\r\n");
delay_ms(100);
/**********************HTS221读取END*************************************/
效果如下图:
视频分享地址:https://training.eeworld.com.cn/course/5351/learn?preview=1#lesson/22237
|