2207|0

17

帖子

1

TA的资源

一粒金砂(中级)

楼主
 

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

点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表