DA14585 读取 SHT30温度计;

2023-11-20

user_sht30.c

/**


  • @file user_i2c.c
  • @brief user_i2c source file.
  • Copyright © 2018 Dialog Semiconductor. This computer program or computer programs included in this package (“Software”) include confidential, proprietary information of Dialog Semiconductor. All Rights Reserved.
  • THIS SOFTWARE IS AN UNOFFICIAL RELEASE FROM DIALOG SEMICONDUCTOR (慏IALOG? AND MAY ONLY BE USED BY RECIPIENT AT ITS OWN RISK AND WITHOUT SUPPORT OF ANY KIND. THIS SOFTWARE IS SOLELY FOR USE ON AUTHORIZED DIALOG PRODUCTS AND PLATFORMS. RECIPIENT SHALL NOT TRANSMIT ANY SOFTWARE SOURCE CODE TO ANY THIRD PARTY WITHOUT DIALOG扴 PRIOR WRITTEN PERMISSION.
  • UNLESS SET FORTH IN A SEPARATE AGREEMENT, RECIPIENT ACKNOWLEDGES AND UNDERSTANDS THAT TO THE FULLEST EXTENT PERMITTED BY LAW, THE SOFTWARE IS DELIVERED 揂S IS? WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, TITLE OR NON-INFRINGEMENT, AND ALL WARRANTIES THAT MAY ARISE FROM COURSE OF DEALING, CUSTOM OR USAGE IN TRADE. FOR THE SAKE OF CLARITY, DIALOG AND ITS AFFILIATES AND ITS AND THEIR SUPPLIERS DO NOT WARRANT, GUARANTEE OR MAKE ANY REPRESENTATIONS (A) REGARDING THE USE, OR THE RESULTS OF THE USE, OF THE LICENSED SOFTWARE IN TERMS OF CORRECTNESS, COMPLETENESS, ACCURACY, RELIABILITY OR OTHERWISE, AND (B) THAT THE LICENSED SOFTWARE HAS BEEN TESTED FOR COMPLIANCE WITH ANY REGULATORY OR INDUSTRY STANDARD, INCLUDING, WITHOUT LIMITATION, ANY SUCH STANDARDS PROMULGATED BY THE FCC OR OTHER LIKE AGENCIES.
  • IN NO EVENT SHALL DIALOG BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

*/

/*

  • INCLUDE FILES

*/

#include “user_sht30.h”
#include “i2c.h”
/****************************************************************************************

  • MACROS
    ****************************************************************************************/
    // I2C helper macros
    #define SEND_I2C_COMMAND(X) SetWord16(I2C_DATA_CMD_REG, (X))
    #define WAIT_WHILE_I2C_FIFO_IS_FULL() while (!(GetWord16(I2C_STATUS_REG) & TFNF)){}
    #define WAIT_UNTIL_I2C_FIFO_IS_EMPTY() while (!(GetWord16(I2C_STATUS_REG) & TFE)){}
    #define WAIT_UNTIL_NO_MASTER_ACTIVITY() while (GetWord16(I2C_STATUS_REG) & MST_ACTIVITY)
    #define WAIT_FOR_RECEIVED_BYTE() while (!GetWord16(I2C_RXFLR_REG))

struct i2c_cfg_env_t i2c_cfg_env;

static void user_i2c_send_address(uint32_t address_to_send)
{
for(int8_t i = i2c_cfg_env.register_address_width; i >= 0; i–){
SEND_I2C_COMMAND((address_to_send >> 8*i) & 0xFF); // Send the bytes of the register address
}
}

void user_i2c_init(uint16_t slave_address, I2C_ADDRESS_MODES i2c_address_width, I2C_SPEED_MODES bit_rate, I2C_REGISTER_WIDTH register_width, I2C_ADDRESS_BYTES_COUNT register_address_width)
{
// Save the settings in a struct
i2c_cfg_env.i2c_address_width = i2c_address_width;
i2c_cfg_env.bit_rate = bit_rate;
i2c_cfg_env.register_width = register_width;
i2c_cfg_env.register_address_width = register_address_width;

// Initialize the I2C with the address provided as argument
SetBits16(CLK_PER_REG, I2C_ENABLE, 1); // Enable  clock for I2C
SetWord16(I2C_ENABLE_REG, 0x0); // Disable the I2C controller
SetWord16(I2C_CON_REG,
          I2C_MASTER_MODE | I2C_SLAVE_DISABLE | I2C_RESTART_EN); // Slave is disabled
SetBits16(I2C_CON_REG, I2C_SPEED,
          i2c_cfg_env.bit_rate); // Set speed. Standard speed = 1, fast = 2
if (i2c_cfg_env.i2c_address_width == I2C_7BIT_ADDR) {
    SetBits16(I2C_CON_REG, I2C_10BITADDR_MASTER, 0); // Set addressing mode. 7bit = 0
} else {
    SetBits16(I2C_CON_REG, I2C_10BITADDR_MASTER, 1); // Set addressing mode. 10bit= 1
}
SetWord16(I2C_TAR_REG, slave_address & 0x3FF); // Set Slave device address
SetWord16(I2C_ENABLE_REG, 0x1); // Enable the I2C controller
while (GetWord16(I2C_STATUS_REG) & 0x20)
    ; // Wait for I2C master FSM to be IDLE

}

void user_i2c_set_register_width(I2C_REGISTER_WIDTH width)
{
i2c_cfg_env.register_width = width;
}

void user_i2c_write_reg(uint32_t reg_address, uint32_t wr_data)
{
user_i2c_send_address(reg_address); //Start the transaction and send the address

  for(int8_t i = i2c_cfg_env.register_width; i >= 0; i--){
   WAIT_WHILE_I2C_FIFO_IS_FULL();              // Wait if I2C Tx FIFO is full
   SEND_I2C_COMMAND((wr_data >> 8*i) & 0xFF);  // Write a byte of data to the FIFO
	}
	
WAIT_UNTIL_I2C_FIFO_IS_EMPTY();                // Wait until Tx FIFO is empty
WAIT_UNTIL_NO_MASTER_ACTIVITY();               // wait until no master activity	

}

uint32_t user_i2c_read_reg(uint32_t reg_address)
{
user_i2c_send_address(reg_address);
uint32_t ret = 0;

WAIT_WHILE_I2C_FIFO_IS_FULL(); // Wait if Tx FIFO is full
  for(int8_t i = 0; i <= i2c_cfg_env.register_width; i++){
   SEND_I2C_COMMAND(0x0100 & 0x3FF); // Set R/W bit to 1 (read access) MSB
	}
	
WAIT_UNTIL_I2C_FIFO_IS_EMPTY(); // Wait until I2C Tx FIFO empty
WAIT_UNTIL_NO_MASTER_ACTIVITY();
	
  for(int8_t i = i2c_cfg_env.register_width; i >= 0; i--){
   ret |= (0xFF & GetWord16(I2C_DATA_CMD_REG)) << 8*i; // Get received byte
	}
	
WAIT_UNTIL_I2C_FIFO_IS_EMPTY();  // Wait until Tx FIFO is empty
WAIT_UNTIL_NO_MASTER_ACTIVITY(); // wait until no master activity	
	return ret;

}

void user_i2c_multi_byte_write(uint32_t reg_address, uint8_t *wr_data, uint32_t num_bytes)
{
user_i2c_send_address(reg_address);
for(uint32_t i = 0; i < num_bytes; i++){
WAIT_WHILE_I2C_FIFO_IS_FULL(); // Wait if I2C Tx FIFO is full
SEND_I2C_COMMAND(wr_data[i] & 0xFF); //Write the data to the FIFO
}
WAIT_UNTIL_I2C_FIFO_IS_EMPTY(); //Wait until Tx FIFO is empty
WAIT_UNTIL_NO_MASTER_ACTIVITY(); //Wait until no master activity
}

void user_i2c_multi_byte_read(uint32_t reg_address, uint8_t *rd_data, uint32_t num_bytes)
{
user_i2c_send_address(reg_address);
uint32_t index = 0;

  for(uint32_t i = 0; i < num_bytes;){
   SEND_I2C_COMMAND(0x0100 & 0x3FF); // Set R/W bit to 1 (read access) MSB
		 if(!(++i % 24)){ //FIFO is 32 bits
	      WAIT_UNTIL_I2C_FIFO_IS_EMPTY();                 // Wait until Tx FIFO is empty
      WAIT_UNTIL_NO_MASTER_ACTIVITY();                // wait until no master activity
			  for (uint8_t j = 0; j < 24; j++){
					//Store the FIFO contents in ram
					rd_data[index++] = (0xFF & GetWord16(I2C_DATA_CMD_REG)); // Get received byte
				}
				reg_address += 24/(i2c_cfg_env.register_width + 1);//Calculate the next register to read out 
				user_i2c_send_address(reg_address);                //Restart the read
		 }
	}
	
WAIT_UNTIL_I2C_FIFO_IS_EMPTY(); // Wait until I2C Tx FIFO empty
WAIT_UNTIL_NO_MASTER_ACTIVITY();
	
  while(index < num_bytes){
   rd_data[index++] = (0xFF & GetWord16(I2C_DATA_CMD_REG)); // Get received byte
	}
	
WAIT_UNTIL_I2C_FIFO_IS_EMPTY();  // Wait until Tx FIFO is empty
WAIT_UNTIL_NO_MASTER_ACTIVITY(); // wait until no master activity	

}
/// @} APP

void init_SHT30(){

RESERVE_GPIO(SHT30_EN, SHT30_SCL_PORT, SHT30_SCL_PIN, PID_I2C_SCL);
RESERVE_GPIO(SHT30_EN, SHT30_SDA_PORT, SHT30_SDA_PIN, PID_I2C_SDA);

GPIO_ConfigurePin(SHT30_SCL_PORT, SHT30_SCL_PIN, INPUT_PULLUP, PID_I2C_SCL, true);
GPIO_ConfigurePin(SHT30_SDA_PORT, SHT30_SDA_PIN, INPUT_PULLUP, PID_I2C_SDA, true);

user_i2c_init(SHT30_I2C_ADDRESS, I2C_7BIT_ADDR, I2C_STANDARD, I2C_2BYTES_REGISTER, I2C_2BYTES_ADDRS);

}

#define CRC8_POLYNOMIAL 0x31

#define CRC8_POLYNOMIAL 0x31

uint8_t CheckCrc8(uint8_t* const message, uint8_t initial_value)
{
uint8_t remainder; //余数
uint8_t i = 0, j = 0; //循环变量

/* 初始化 */
remainder = initial_value;

for(j = 0; j < 2;j++)
{
    remainder ^= message[j];

    /* 从最高位开始依次计算  */
    for (i = 0; i < 8; i++)
    {
        if (remainder & 0x80)
        {
            remainder = (remainder << 1)^CRC8_POLYNOMIAL;
        }
        else
        {
            remainder = (remainder << 1);
        }
    }
}

/* 返回计算的CRC码 */
return remainder;

}
/**

  • @brief 将SHT30接收的6个字节数据进行CRC校验,并转换为温度值和湿度值
  • @param dat —— 存储接收数据的地址(6个字节数组)
  • @retval 校验成功 —— 返回0
  •         校验失败  —— 返回1,并设置温度值和湿度值为0
    

/
uint8_t SHT30_Dat_To_Float(uint8_t
const dat, float* temperature, float* humidity)
{
uint16_t recv_temperature = 0;
uint16_t recv_humidity = 0;

/* 校验温度数据和湿度数据是否接收正确 */
if(CheckCrc8(dat, 0xFF) != dat[2] || CheckCrc8(&dat[3], 0xFF) != dat[5])
    return 1;

/* 转换温度数据 */
recv_temperature = ((uint16_t)dat[0]<<8)|dat[1];
*temperature = -45 + 175*((float)recv_temperature/65535);

/* 转换湿度数据 */
recv_humidity = ((uint16_t)dat[3]<<8)|dat[4];
*humidity = 100 * ((float)recv_humidity / 65535);

return 0;

}
float temperature,humidity;
void SHT30_Read(void)
{
uint8_t buff[6]={0};

user_i2c_multi_byte_read(0x2C06,buff,6);

//温度转换;

SHT30_Dat_To_Float(buff,&temperature,&humidity);
//printf(“temperature =%.2f ,humidity = .2f /r/n”,temperature,humidity);
}

user_sht30.h
#ifndef USER_SHT30_H
#define USER_SHT30_H

#include “user_sht30.h”

#define SHT30_I2C_ADDRESS 0x44 //This is the sensor address without R/W bit (0x1D or 0x53 for ADXL)

#define NOTIFICATION_DELAY 50 //The time interval between sent notifications

#define SHT30_SCL_PORT GPIO_PORT_2
#define SHT30_SCL_PIN GPIO_PIN_3

#define SHT30_SDA_PORT GPIO_PORT_2
#define SHT30_SDA_PIN GPIO_PIN_1

typedef enum
{
I2C_7BIT_ADDR,
I2C_10BIT_ADDR,
}I2C_ADDRESS_MODES;

typedef enum
{
I2C_1BYTE_ADDRS,
I2C_2BYTES_ADDRS,
I2C_3BYTES_ADDRS,
}I2C_ADDRESS_BYTES_COUNT;

typedef enum
{
I2C_STANDARD = 1,
I2C_FAST,
}I2C_SPEED_MODES;

typedef enum
{
I2C_1BYTE_REGISTER,
I2C_2BYTES_REGISTER,
I2C_3BYTES_REGISTER,
I2C_4BYTES_REGISTER,
}I2C_REGISTER_WIDTH;

/**

  • @brief I2C struct
    */
    struct i2c_cfg_env_t
    {
    uint8_t bit_rate; //Standard mode or fast mode
    uint8_t register_width; //Slave register width 8 or 16 bit
    uint8_t i2c_address_width; //Slave addressing width 10 or 7 bit
    uint8_t register_address_width;//Slave register addressing width 8 or 16 bit
    };

/*

  • FUNCTION DECLARATIONS

*/

/**


  • @brief Initializes the I2C interface with the provide slave address
  • @param[in] slave_address , The I2C slave address to communicate with
  • @param[in] i2c_address_width , The width of the I2C address(7 or 10 bit)
  • @param[in] bit_rate , The I2C bus frequency (standard or fast mode)
  • @param[in] register_width , The I2C slave register width (1-4 bytes)
  • @param[in] register_address_width , The I2C slave register address width (1-3 bytes)
  • @return void

*/
void user_i2c_init(uint16_t slave_address, I2C_ADDRESS_MODES i2c_address_width, I2C_SPEED_MODES bit_rate, I2C_REGISTER_WIDTH register_width, I2C_ADDRESS_BYTES_COUNT register_address_width);

/**


  • @brief Sets the register width of the slave device
  • @param[in] register_width, The I2C slave register width (1-4 bytes)
  • @return void

*/
void user_i2c_set_register_width(I2C_REGISTER_WIDTH width);

/**


  • @brief Reads data from an I2C slave register
  • @param[in] reg_address, Register address to be read
  • @return Contents of the register

*/
uint32_t user_i2c_read_reg(uint32_t reg_address);

/**


  • @brief Writes data to a register address of an I2C slave
  • @param[in] reg_address, Register address to write to
  • @param[in] wr_data, Data to write
  • @return void

*/
void user_i2c_write_reg(uint32_t reg_address, uint32_t wr_data);

/**


  • @brief Writes data to a register address of an I2C slave
  • @param[in] reg_address, Register address to write to
  • @param[in] wr_data, Data to write
  • @param[in] num_bytes, Number of bytes to write
  • @return void

*/
void user_i2c_multi_byte_write(uint32_t reg_address, uint8_t *wr_data, uint32_t num_bytes);

/**


  • @brief Writes data to a register address of an I2C slave
  • @param[in] reg_address, Register address to write to
  • @param[in] rd_data, Array where the data will be read to
  • @param[in] num_bytes, Number of bytes to read
  • @return void

*/
void user_i2c_multi_byte_read(uint32_t reg_address, uint8_t *rd_data, uint32_t num_bytes);

void init_SHT30(void);
void SHT30_Read(void);
#endif //USER_I2C_H
/// @} APP

如图;debug显示温湿度值

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DA14585 读取 SHT30温度计; 的相关文章

  • vue启动报错vue-cli-service: command not found

    要配置环境变量以便能够在任意位置使用 Vue CLI 你可以按照以下步骤操作 确保已经全局安装了 Vue CLI 如果尚未安装 请使用以下命令进行全局安装 Copy Code npm install g vue cli 打开命令行终端 并输
  • vue实现拍照人脸识别功能带人脸选中框

    前言 实现打开摄像头 并识别人脸 实现效果 实现步骤 一 安装 1 官网下载 tracking js 的代码包官网入口 2 npm下载 执行命令 cnpm install tracking save 二 demo案例代码
  • nexus扩容后,代理功能出错,重启失败原因排查

    用nexus做仓库 其中有yum maven docker helm 当时搭建的时候觉得100g磁盘空间够用了 结果后期大家都在使用 不到俩月就磁盘占满了 无奈知道将虚拟机的磁盘扩容 扩容后nexus页面貌似一切正常 偶然发现 yum in
  • Spring Boot笔记

    文章目录 一 Spring Boot 入门 1 Spring Boot 简介 2 微服务 3 环境准备 1 MAVEN设置 2 IDEA设置 4 Spring Boot HelloWorld 1 创建一个maven工程 jar 2 导入sp
  • 在有机器学习和深度学习的基础上,如何自学AutoML算法?

    作者 FedAI联邦学习 链接 https www zhihu com question 334021426 answer 840727058 来源 知乎 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 AutoML技术

随机推荐

  • POI实现Word文件转PDF

    需求 采用spire doc生成word文件后 需要加一个预览PDF的功能 可以直接采用POI对docx文件进行转换处理 public static void main String args throws Exception String
  • 遗传算法的有趣实践

    源码 先放上我的源码链接 https github com AIjugg Genetic Algorithm git 自己思考加纯手写的代码 有兴趣的同学可以拿去玩玩 前言 生物进化是一个有趣的话题 人是怎么从人猿进化到的人 长颈鹿的脖子为
  • 基于Java SSM+layui+mysql实现的图书借记管理系统源代码+数据库

    介绍 本项目使用的技术栈是SSM layui mysql 服务器使用的是tomcat 其中书籍图片存放的位置需要先在tomcat根目录下conf setting xml中配置虚拟路径 本项目配置的是D upload 完整代码下载地址 图书借
  • java mapper.readtree_java - 杰克逊的readValue和readTree:何时使用哪个? - 堆栈内存溢出...

    我刚刚开始使用Jackson JSON库 杰克逊是一个非常强大的库 但它有一个非常广泛的API 很多事情可以通过多种方式完成 这使得很难在杰克逊找到自己的方式 如何知道什么是正确 最好的做事方式 我为什么要使用这个解决方案 String j
  • 笔试题8:一些常见的转义字符

    a 响铃 b 退格 f 换页 n 换行 r 回车 t 水平制表 v 垂直制表 反斜杠 文号字符 单引号字符 双引号字符 0 空字符 Null ddd 任意字符 三位八进制数 xhh 任意字符二位十进制数
  • 悟空CRM / 72crm-11.0-Spring部署

    目录 悟空CRM部署 悟空CRM目录结构 悟空CRM使用的主要技术栈 使用说明 一 前置环境 二 JDK1 8 Maven3 5安装 三 安装Mysql数据库 四 安装Elasticsearch 6 8 6 五 安装Redis 六 Naco
  • 如何实现Linux系统和Windows系统之间的文件传输

    一 FTP的概念 FTP服务 用来传输文件的协议 FTP是一种上传和下载用的软件 用户可以通过它把自己的PC机与运行FTP协议的服务器相连 访问服务器上的程序和信息 与大多数Internet服务一样 FTP也是一个客户机 服务器系统 用户通
  • 物联网产业到2023年连接数将突破20亿

    导读 随着经济社会数字化转型和智能升级步伐加快 物联网逐渐成为新型基础设施的重要组成部分 近日 工信部等8部门联合印发 物联网新型基础设施建设三年行动计划 2021 2023年 下称 行动计划 明确到2023年底 在国内主要城市初步建成物联
  • web服务器推送技术

    传统模式的 Web 系统以客户端发出请求 服务器端响应的方式工作 不能满足很多现实应用的需求 譬如 监控系统 后台硬件温度 电压发生变化 即时通信系统 其它用户登录 发送信息 即时报价系统 后台数据库内容发生变化 即时信息系统 微博 说说实
  • leetcode -------414. 第三大的数 C语言版本

    目录 题目 解题思路 图解 代码 题目 414 第三大的数 给你一个非空数组 返回此数组中 第三大的数 如果不存在 则返回数组中最大的数 示例 1 输入 3 2 1 输出 1 解释 第三大的数是 1 示例 2 输入 1 2 输出 2 解释
  • STL list使用

    List 容器 list是C 标准模版库 STL Standard Template Library 中的部分内容 实际上 list容器就是一个双向链表 可以高效地进行插入删除元素 使用list容器之前必须加上
  • VMware--配置php debug环境之PHPStudy+VSCode Xdebug php调试

    目录 1 win配置php环境 1 1 配置PHPStudy 1 1 1 下载phpstudy 1 1 2 配置phpstudy 1 1 3 测试phpstudy是否配置完成 1 2 配置环境变量 1 2 1 打开环境变量 添加配置 1 2
  • OpenWrt 学习记录

    OpenWrt 学习记录 ssh setting CodePath review Makefile CURDIR MAKEFILE LIST ssh setting keygen ssh keygen t rsa C hugh win10W
  • error Missing “key“ prop for element in array react/jsx-key

    react遇到一个奇怪的问题 error Missing key prop for element in array react jsx key 检查了jsx中使用map的 都定义了key div otherList map item an
  • matlab遗传算法(GA)详解(一)算法入门

    遗传算法 Genetic Algorithm GA 是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型 是一种通过模拟自然进化过程搜索最优解 所找到的解是全局最优解 的方法 参数编码 初始群体的设定 适应度函数的设计 遗传
  • C++ 子类继承父类 之 构造函数

    C 子类继承父类 之 构造函数 前面常写点java的代码 对于C 基本的一些概念很模糊了 就当写个小笔记 之后遇到问题肯定还要补充 主要内容 a 子类继承父类写法 b 子类继承父类的构造函数 创建父类F h cpp view plain c
  • Java中Collections类详细用法

    1 sort Collection 方法的使用 含义 对集合进行排序 例 对已知集合c进行排序 public class Practice public static void main String args List c new Arr
  • 游戏开发物理引擎PhysX研究系列:深入学习方法思考

    无论是google还是百度 对于PhysX相关介绍实在是太少了 目前个人感受是最好通过Unity的物理相关设置来猜测PhysX相关接口的细节原理 光看c 代码去理解时 速度不是很快 有时候效果也不一定对的上
  • maven deploy plugin_Maven插件

    在默认的maven工程内默认使用的JDK1 5的版本 将JDK也看成一个项目进行处理 设置JDK的版本保证当前的IDE集成了设置Maven需要的JDK版本 修改JDK版本的方式是在项目的pom文件内使用build标签进行插件的配置 标签 b
  • DA14585 读取 SHT30温度计;

    user sht30 c file user i2c c brief user i2c source file Copyright 2018 Dialog Semiconductor This computer program or com