电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
x-nucleo-iks01a3使用之温度传感器STTS751
分 享
扫描二维码分享
x-nucleo-iks01a3使用之温度传感器STTS751
iks01a3
STTS751
LPC11U68
hehung
关注
发布时间: 2019-09-09
丨
阅读: 2100
# 一、背景 x-nucleo-iks01a3是ST新出品的及多个传感器于一身的评测板,包括了: 1、3D加速度传感器LIS2DW12; 2、3D加速度+3D陀螺仪传感器LSM6DSO; 3、3D磁力计LIS2MDL; 4、气压传感器LPS22HH; 5、温度传感器STTS751; 6、温湿度传感器HTS221。 x-nucleo-iks01a3一共集成了上述的6个传感器,有了上述的传感器可以实现很多的功能了。 本文针对x-nucleo-iks01a3传感器测评板中的STTS751传感器进行了测评。使用了NXP的单片机LPC11U68,通过模拟IIC协议对该芯片进行测评。 该芯片提供了多个寄存器,可以对采样精度进行设置,在不同精度下采样频率会有所差别。 LPC11U68可以和x-nucleo-iks01a3直接插在一起,如下图: ![](https://cf01.ickimg.com/bbsimages/201908/7e56e794721161d04816dc4b43b4436e.jpg) 如果使用其他的飞arduino的芯片,可以通过x-nucleo-iks01a3上面引出的四根线VCC,GND,SCL,SDA进行通信,使用起来也很方便。 # 二、原理图 从原理图中看到,该芯片是通过一个NTX0104GU12连接到I2C1的,后面也写出了该芯片的IIC地址为0x94。 ![](https://cf01.ickimg.com/bbsimages/201908/37224b706ecddf5f94783802005b5c00.jpg) IIC通信在本文中就不做过多的介绍了。 板子上的stts751传感器在这个位子,如下所示: ![](https://cf01.ickimg.com/bbsimages/201909/f9f5088dcbdda41a92b018d34f64febf.jpg) # 三、STTS751寄存器 下面例举了该芯片的所有寄存器: ![](https://cf01.ickimg.com/bbsimages/201908/97783dd284c635a588182392e266b7a6.jpg) 上述寄存器中,最主要的几个寄存器是0x00, 0x02, 0xFE,本文主要就是使用了这几个寄存器。 其中,0x00是读取温度的高位数据,0x02是读取温度的低位数据。0xfe是读取出厂的ID,可以用来识别这个芯片,同时也可以用来验证你的通信是不是正常的。 该芯片的一个特点就是可以直接使用I2C进行数据的读取,无需再进行额外的配置,也无需先power on,并且可以设置高低温度的限制,通过寄存器进行高低限位的温度配置即可。 下图是读取温度的寄存器; ![](https://cf01.ickimg.com/bbsimages/201908/2d3f3626dfecc57d9190e7ec55553465.jpg) 温度数据可以直接进行读取,读出来的值即是温度,无需再对寄存器中的数据进行自行计算处理,在读取数据的时候已经是处理之后的温度数值了,对于传感器而言这一点是非常棒的。 # 四、lpc11u68工程 该工程使用的是Keil编译器MDK5进行编译的,如果版本太低可能不能用,最好的是下载最新版本。 该代码的工程是直接在lpc11u68的官方例程中修改而来的,借用了官方的例程,增加了串口功能,IIC功能,OLED功能等。 工程的创建不做过多的描述,但是要注意自己在Options for Target 'lpc11u68'中接入你新创建的.h头文件和.c文件的路径,不然的话编译得到时候是会报错的,如下所示: ![](https://cf01.ickimg.com/bbsimages/201909/1420250f1f670dac196d266916733022.jpg) ![](https://cf01.ickimg.com/bbsimages/201909/e70eeda5be75762de83a00b9382c16d3.jpg) # 五、程序实现 首先是对stts751芯片中寄存器和地址的宏定义: 其中芯片的地址是0x94,即IIC操作地址。 ```c /@@* Exported types ------------------------------------------------------------*/ #define STTS751_REG_STATUS (0x01U) #define STTS751_REG_CONFIG (0x03U) #define STTS751_REG_CONRAT (0x04U) #define STTS751_REG_TEMPVH (0x00U) #define STTS751_REG_TEMPVL (0x02U) #define STTS751_REG_MANUALID (0xFEU) #define STTS751_REG_PRODUCT (0xFDU) /@@*IIC slave address*/ #define STTS751_ADDR 0x94U ``` I2C的写数据和读数据: 通过IIC协议可知,主 往从设备中写入数据的时候,通信的时候首先需要主设备发送从设备的地址,从设备响应之后再发送写寄存器地址命令道从设备,从设备返回响应命令之后发送数据。 读数据的时候,也是首先发送从设备的地址,等待从设响应,在发送读取哪个寄存器的寄存器地址命令,从设备响应之后等待从设备返回的具体数据。 ```c //STTS751写 static int IIC_WrDat_STTS751(uint8_t IIC_Add, uint8_t IIC_Reg, uint8_t IIC_Data) { uint8_t succ, stime=0; 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; } //STTS751读 static int IIC_Read_STTS751(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); IIC_Stop(); return ret; } ``` 读寄存器和写寄存器: 下述程序对寄存器的读取进行了封装,连续20次读取,读取正确即可退出,否则返回读取错误的命令。 ```c //设置寄存器 int Set_Reg_STTS751(uint8_t add, uint8_t reg, uint8_t dat) { int ret_succ = -1; uint8_t i = 20u; //失败之后尝试的次数 do{ if(0 == IIC_WrDat_STTS751(add, reg, dat)) { ret_succ = 0; //设置成功 break; } else { i--; //获取失败,再次尝试 } }while(i>0u); return ret_succ; } //读取寄存器 int Get_Reg_STTS751(uint8_t add, uint8_t reg) { uint8_t i = 20u; int ret_get = -1; do{ ret_get = IIC_Read_STTS751(add, reg); if(-1 != ret_get) { break; //获取数据成功 } else { i--; //获取失败,再次尝试 } }while(i>0u); return ret_get; } ``` 读取温度数据和产品出厂ID: ```c //读取温度高字节 int Read_Temperature_H_STTS751(void) { return Get_Reg_STTS751(STTS751_ADDR, STTS751_REG_TEMPVH); } //读取温度低字节 int Read_Temperature_L_STTS751(void) { return Get_Reg_STTS751(STTS751_ADDR, STTS751_REG_TEMPVL); } //获取Manualfacture ID signed char Read_STTS751_Manualfacture_ID(void) { return (Get_Reg_STTS751(STTS751_ADDR, STTS751_REG_MANUALID)); } ``` 最后通过串口将数据打印出来: ```c //发送数据到串口 void Send_Uart_STTS751(void) { DEBUGOUT("%s","<-----------STTS751--------->\r\n"); DEBUGOUT("Temp:%d.%d\r\n",Read_Temperature_H_STTS751(),Read_Temperature_L_STTS751()); //发送温度 DEBUGOUT("M_ID:%X\r\n",Read_STTS751_Manualfacture_ID()); DEBUGOUT("P_ID:%d\r\n",Read_STTS751_Product_ID()); DEBUGOUT("%s","<--------STTS751-END------->\r\n"); } ``` 本文最主要的是对STTS751的数据进行采集,所以关于OLED的驱动代码就不做过多的介绍了。 # 五、显示效果 如下图所示: 程序中返回了传感器读取的温度值,芯片ID:0x53(返回的是十六进制的),以及产品ID(0x01). 通过给传感器加热,可以看到数值会往上升。 ![](https://cf01.ickimg.com/bbsimages/201908/436a8d17e8fb59259e077860ed2e8a80.jpg) 下图是使用OLED显示的温度数据 ![](https://cf01.ickimg.com/bbsimages/201909/06408e573d971477a2f8674a3534cfed.jpg)
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
hehung
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交