STM8 硬件I2C 驱动SHT40例程

如题,找不 到STM8 用硬件IIC驱动SHT40相关驱动,求相关资料例程。
在网上找到STM32F1 的,由于是用HAL封装的,不会转换,贴在下面



#include <stm32f1xx_hal.h>

#include "sensirion_arch_config.h"
#include "sensirion_i2c.h"

/**
 * Create new I2C instance. You may also use a different interface, e.g. hi2c2,
 * depending on your CubeMX configuration
 */
static I2C_HandleTypeDef hi2c1;

/**
 * Initialize all hard- and software components that are needed for the I2C
 * communication.
 */
void sensirion_i2c_init(void) {
    hi2c1.Instance = I2C1;
    hi2c1.Init.ClockSpeed = 100000;
    hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
    hi2c1.Init.OwnAddress1 = 0;
    hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
    hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
    hi2c1.Init.OwnAddress2 = 0;
    hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
    hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
    /* Enable the remapping of Pins 6/7 to 8/9 and the I2C clock before the
     * initialization of the GPIO Pins in HAL_I2C_Init(). This is a fix of the
     * code generated by CubeMX v4.16.0 */
    __HAL_AFIO_REMAP_I2C1_ENABLE();
    __HAL_RCC_I2C1_CLK_ENABLE();
    HAL_I2C_Init(&hi2c1);
}

/**
 * Release all resources initialized by sensirion_i2c_init().
 */
void sensirion_i2c_release(void) {
}

/**
 * Execute one read transaction on the I2C bus, reading a given number of bytes.
 * If the device does not acknowledge the read command, an error shall be
 * returned.
 *
 * @param address 7-bit I2C address to read from
 * @param data    pointer to the buffer where the data is to be stored
 * @param count   number of bytes to read from I2C and store in the buffer
 * @returns 0 on success, error code otherwise
 */
int8_t sensirion_i2c_read(uint8_t address, uint8_t* data, uint16_t count) {
    return (int8_t)HAL_I2C_Master_Receive(&hi2c1, (uint16_t)(address << 1),
                                          data, count, 100);
}

/**
 * Execute one write transaction on the I2C bus, sending a given number of
 * bytes. The bytes in the supplied buffer must be sent to the given address. If
 * the slave device does not acknowledge any of the bytes, an error shall be
 * returned.
 *
 * @param address 7-bit I2C address to write to
 * @param data    pointer to the buffer containing the data to write
 * @param count   number of bytes to read from the buffer and send over I2C
 * @returns 0 on success, error code otherwise
 */
int8_t sensirion_i2c_write(uint8_t address, const uint8_t* data,
                           uint16_t count) {
    return (int8_t)HAL_I2C_Master_Transmit(&hi2c1, (uint16_t)(address << 1),
                                           (uint8_t*)data, count, 100);
}

/**
 * Sleep for a given number of microseconds. The function should delay the
 * execution for at least the given time, but may also sleep longer.
 *
 * @param useconds the sleep time in microseconds
 */
void sensirion_sleep_usec(uint32_t useconds) {
    uint32_t msec = useconds / 1000;
    if (useconds % 1000 > 0) {
        msec++;
    }

    /*
     * Increment by 1 if STM32F1 driver version less than 1.1.1
     * Old firmwares of STM32F1 sleep 1ms shorter than specified in HAL_Delay.
     * This was fixed with firmware 1.6 (driver version 1.1.1), so we have to
     * fix it ourselves for older firmwares
     */
    if (HAL_GetHalVersion() < 0x01010100) {
        msec++;
    }

    HAL_Delay(msec);
}


硬件驱动可以参考103的,读取寄存器的值里面的数据是否正确,按照时序操作就好了!

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这篇博客: STM32通过IIC驱动SHT31室内温湿度传感器中的 STM32F103单片机通过IIC控制SHT31室内温湿度传感器 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

    SHT31室内温湿度传感器引脚接正点原子STM32F103mini板:
    SHT31 STM32
    VCC -> VCC(3.3V)
    GND -> GND
    SDA -> PC11
    SCL -> PC12
    本文最后有源工程文件的下载链接。

    工程文件中使用的delay.h,sys.h,usart.h,myiic.h均为正点原子官方提供的STM32F103mini单片机对应的源码,未做改动。

    因此本文只粘贴新加的sht31.h(驱动代码头文件),sht31.c(驱动代码),以及main.c的测试样例

    main.c文件

    #include "delay.h"
    #include "sys.h"
    #include "usart.h"
    #include "sht31.h"
    
    int main(void)
    {	
    	delay_init();	    	 //延时函数初始化	
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
    	uart_init(115200);	 //串口初始化为115200
      SHT31_Init();
    	while(1)
    	{
    		//体温测试
    		SHT31_read_result(0x44);
    		printf("温湿度:%s\r\n",humiture_buff);
    		delay_ms(500);
    	}	 
    }
    

    sht31.h

    #ifndef _SHT31_H
    #define _SHT31_H
    //?????????
    #include "sys.h"
    #include "delay.h"
    #include "stdio.h"
    extern u8 humiture_buff[20];
    extern u8 str[];
    
    extern u8 Temperature_L;
    extern u8 Humidity_L;
    extern u8 Temperature_H;
    extern u8 Humidity_H;
    
    //IO方向设置
    #define SDA_IN()  {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=8<<12;}
    #define SDA_OUT() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=3<<12;}
    
    #define write 0
    #define read  1
    //IO操作函数	 
    #define IIC_SCL    PCout(12) //SCL
    #define IIC_SDA    PCout(11) //SDA	 
    #define READ_SDA   PCin(11)  //输入SDA 
    
    //MLX90614所有操作函数
    void SHT31_Init(void); //器件初始化
    void SHT31_Send_Byte(u8 txd);			//SHT31发送一个字节
    u8 SHT31_Read_Byte(void);//SHT31读取一个字节
    
    void SHT31_read_result(u8 addr);//SHT31读取结果
    
    #endif
    
    
    

    sht31.c

    
    #include "sht31.h"
    #include "myiic.h"
    float humiture[4];
    u8 humiture_buff[20];
    u8 str[]={"000.00℃"};
    u8 Temperature_L=15;
    u8 Humidity_L=50;
    u8 Temperature_H=30;
    u8 Humidity_H=80;
    
    void SHT31_Init()//???MLX90614初始化
    {
      IIC_Init();
    }
    //IIC发送一个字节  
    void SHT31_Send_Byte(u8 txd)
    {                        
        u8 t;   
    	SDA_OUT(); 	    
        IIC_SCL=0;//拉低时钟开始数据传输
        for(t=0;t<8;t++)
        {              
    			IIC_SDA=(txd&0x80)>>7;
    			txd<<=1;
    			delay_us(2);
    			IIC_SCL=1;
    			delay_us(2); 
    			IIC_SCL=0;	
    			delay_us(2);
        }	 
    } 	
    //SHT31读1个字节
    u8 SHT31_Read_Byte()
    {
    	unsigned char i,receive=0;
    	SDA_IN();//SDA设置为输入
       	for(i=0;i<8;i++ )
    	{
          IIC_SCL=0; 
          delay_us(2);
    	  IIC_SCL=1;
    	  delay_us(2);
          receive<<=1;
          if(READ_SDA)receive|=1;;   
    	  delay_us(2); 
        }					 
    	IIC_SCL=0;	
        return receive;
    }
    
    void SHT31_read_result(u8 addr)
    {
    	u16 tem,hum;
    	u16 buff[6];
    	float Temperature=0;
    	float Humidity=0;
    
      	IIC_Start();
    	SHT31_Send_Byte(addr<<1 | write);
    	IIC_Wait_Ack();
      	SHT31_Send_Byte(0x2C);
    	IIC_Wait_Ack();
    	SHT31_Send_Byte(0x06);
    	IIC_Wait_Ack();
    	IIC_Stop(); 
    	delay_us(50);
    	
      IIC_Start();
    	SHT31_Send_Byte(addr<<1 | read);
    	if(IIC_Wait_Ack()==0)
    	{
    		buff[0]=SHT31_Read_Byte();
    		IIC_Ack();
    		buff[1]=SHT31_Read_Byte();
    		IIC_Ack();
    		buff[2]=SHT31_Read_Byte();
    		IIC_Ack();
    		buff[3]=SHT31_Read_Byte();
    		IIC_Ack();
    		buff[4]=SHT31_Read_Byte();
    		IIC_Ack();
    		buff[5]=SHT31_Read_Byte();
    		IIC_Ack();
    		IIC_Stop();
    	}
    	tem = ((buff[0]<<8) | buff[1]);
    	hum = ((buff[3]<<8) | buff[4]);
    	Temperature= (175.0*(float)tem/65535.0-45.0) ;// T = -45 + 175 * tem / (2^16-1)
    	Humidity= (100.0*(float)hum/65535.0);// RH = hum*100 / (2^16-1)
    	if((Temperature>=-20)&&(Temperature<=125)&&(Humidity>=0)&&(Humidity<=100))//??????
    	{
    		humiture[0]=Temperature;
    		humiture[2]=Humidity;
    		sprintf(humiture_buff,"%4.2fC,%4.2f%%",Temperature,Humidity);
    
    	}
    	SHT31_Read_Byte();
        IIC_Stop(); 
    	delay_us(10);
    	hum=0;
    	tem=0;
    
    } 
    
    
    

    STM32F103mini-SHT31工程文件下载链接

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

每一次解答都是一次用心理解的过程,期望对你有所帮助。
参考结合AI智能库,如有帮助,恭请采纳。

以下是使用STM8微控制器通过IIC总线驱动SHT40温湿度传感器的示例代码。在这个示例中,使用C语言和ST的STM8开发工具

#include "stm8s.h"  
#include "stm8s_i2c.h"  
  
#define SHT40_ADDRESS 0x40  
  
void I2C_Init(void)  
{  
    I2C_DeInit();  
    I2C_Init_Advanced(I2C_Standard_Fast_Plus, 100000); //使用标准快速加频模式,时钟速率为100kHz  
}  
  
void I2C_Start(void)  
{  
    I2C_GenerateSTART();  
}  
  
void I2C_Stop(void)  
{  
    I2C_GenerateSTOP();  
}  
  
void I2C_Send7bitAddress(uint8_t addr)  
{  
    I2C_Send7bitAddress(SHT40_ADDRESS);  
}  
  
void I2C_SendData(uint8_t data)  
{  
    I2C_SendData(data);  
}  
  
uint8_t I2C_ReceiveData(void)  
{  
    return I2C_ReceiveData();  
}  
  
void main(void)  
{  
    uint8_t data[2];  
    uint16_t humidity, temperature;  
  
    // 初始化IIC总线  
    I2C_Init();  
  
    // 发送IIC启动信号  
    I2C_Start();  
  
    // 发送传感器地址  
    I2C_Send7bitAddress(SHT40_ADDRESS);  
  
    // 等待传感器响应  
    while (I2C_ReceiveData() != 0x08);  
  
    // 发送命令字节(读温湿度数据)  
    I2C_SendData(0x03);  
  
    // 等待传感器响应并读取数据  
    while (I2C_ReceiveData() != 0x00);  
    while (I2C_ReceiveData() != 0x06);  
    while (I2C_ReceiveData() != 0x00);  
    while (I2C_ReceiveData() != 0x80); //读取温度数据的高8位  
    data[0] = I2C_ReceiveData(); //读取温度数据的低8位  
    while (I2C_ReceiveData() != 0x80); //读取湿度数据的高8位  
    data[1] = I2C_ReceiveData(); //读取湿度数据的低8位  
  
    // 将读取的数据转换为温湿度值  
    humidity = (uint16_t)(data[1] << 8) | data[0]; //湿度数据格式为: 湿度值 = (data[1] << 8) | data[0] / 100.0f; //单位为%RH(相对湿度)  
    temperature = (uint16_t)(data[3] << 8) | data[2]; //温度数据格式为: 温度值 = (data[3] << 8) | data[2] / 100.0f; //单位为℃(摄氏度)  
  
    // 发送IIC停止信号并结束通信  
    I2C_Stop();  
}


参考
(1) 最全的STM8 IIC学习笔记 https://blog.csdn.net/m0_52525687/article/details/117740392
(2) stm8的IIC库的使用 https://www.cnblogs.com/sjsxk/p/5951806.html

你用cubeMAX软件试一下

STM8上面用GPIO模拟IIC来替代标准库接口

STM32Cubemxhal库硬件IIC驱动SHT40温湿度传感器
可以参考下

可以使用cube ide 配置

可以参考相关驱动资料:
https://www.lmlphp.com/user/73180/article/item/710048/
或者找找官方的驱动资料:
STM8 Reference Manual: 该文档包含了STM8的所有寄存器和外设的详细说明,包括IIC的寄存器和操作方法。
STM8 Software Development Tools: 该工具包提供了STM8的编译器、调试器和仿真器等开发工具,可以帮助您编写和调试STM8程序。

STM8的找不到,也可以参考一下相关型号的编写,大体差不多

官网上找一找,看有没有

STM8是意法半导体的一款微控制器芯片,支持硬件I2C总线,可用于各种应用场景,如温湿度传感器的测量和控制。SHT40是一款数字式温湿度传感器,可以用于实时测量环境中的温度和湿度。

为了将SHT40传感器与STM8微控制器芯片连接并读取数据,我们需要编写一段STM8硬件I2C驱动程序。以下是一个简单的例程来实现这个功能:

  1. 首先,需要在STM8芯片上配置I2C的端口和引脚。例如,我们可以将SCL引脚连接到PA1,SDA引脚连接到PA2。

  2. 然后,在STM8芯片上初始化I2C总线,包括设置I2C时钟频率、使能I2C总线和配置中断。

    I2C_Init();
    I2C_ClockSpeedConfig(I2C_CLOCK_SPEED_100K);
    I2C_Cmd(ENABLE);
    I2C_ITConfig(ENABLE);

  3. 接下来,我们可以编写一个函数来向SHT40传感器发送命令并读取数据。例如,我们可以使用0x2C命令来读取温度和湿度数据。

    void SHT40_Read_Data()
    {

     uint8_t buffer[6];
     I2C_GenerateSTART(ENABLE);
     while (!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));
     I2C_Send7bitAddress(SHT40_ADDRESS, I2C_DIRECTION_TX);
     while (!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
     I2C_SendData(0x2C);
     while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));
     I2C_GenerateSTOP(ENABLE);
     delay(10);
     I2C_GenerateSTART(ENABLE);
     while (!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));
     I2C_Send7bitAddress(SHT40_ADDRESS, I2C_DIRECTION_RX);
     while (!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
     for (int i = 0; i < 6; i++)
     {
         if (i == 5)
             I2C_AcknowledgeConfig(DISABLE);
         while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED));
         buffer[i] = I2C_ReceiveData();
     }
     I2C_GenerateSTOP(ENABLE);
    

    }

  4. 最后,我们可以在主函数中调用SHT40_Read_Data()函数以读取温度和湿度数据。

    int main()
    {

     SHT40_Read_Data();
     // 处理温湿度数据
     return 0;
    

    }

通过上述代码,我们可以在STM8芯片上实现与SHT40传感器的通信和数据读取。此外,需要注意一些细节问题,如时序控制和错误处理等,以确保系统的可靠性和稳定性。

STM8是意法半导体公司推出的一款低成本、高性能、低功耗的8位微控制器。在STM8控制器中,硬件I2C模块是一个常用的外设。SHT40是一种数字式温度和湿度传感器,具有高精度、高稳定性和广泛的应用领域。本文将介绍如何使用STM8的硬件I2C驱动SHT40传感器。

  1. 硬件连接

首先,需要将SHT40传感器连接到STM8控制器,具体的连接方式如下:

SHT40STM8
GNDGND
VDD3.3V
SCLPB4
SDAPB5
  1. I2C初始化

在使用STM8的硬件I2C模块之前,需要对其进行初始化。下面是STM8的硬件I2C初始化代码:

void i2c_init(void)
{
    I2C->CR1 |= I2C_CR1_PE;     // Enable I2C
    I2C->FREQR = 16;            // Set I2C freq to 16MHz
    I2C->CCR = 160;             // Set I2C clock to 100kHz
    I2C->TRISE = 17;            // Set I2C rise time
    I2C->CR2 |= I2C_CR2_ACK;    // Enable I2C ACK
}

其中,I2C_CR1_PE表示使能I2C模块,I2C_FREGR表示I2C时钟频率,I2C_CCR表示I2C时钟,I2C_TRISE表示I2C时钟上升时间,I2C_CR2_ACK表示允许ACK应答。

  1. 读取SHT40传感器数据

在初始化完STM8的硬件I2C后,就可以通过I2C总线读取SHT40传感器的数据了。具体的读取过程如下:

void sht40_read(uint8_t* data, uint8_t size)
{
    uint8_t i;
    I2C->CR2 |= SHT40_ADDRESS;      // Send SHT40 address
    I2C->CR2 |= I2C_CR2_START;      // Send start bit
    while(!(I2C->SR1 & I2C_SR1_SB)); // Wait for start bit to be sent
    (void)I2C->SR1;                 // Clear start bit flag
    for(i = 0; i < size - 1; i++)
    {
        while(!(I2C->SR1 & I2C_SR1_ADDR));  // Wait for address to be sent
        (void)I2C->SR1;                     // Clear address flag
        (void)I2C->SR3;                     // Clear address flag
        while(!(I2C->SR1 & I2C_SR1_RXNE));  // Wait for data to be received
        data[i] = I2C->DR;                  // Read data
    }
    I2C->CR2 |= I2C_CR2_STOP;     // Send stop bit
    while(I2C->SR3 & I2C_SR3_MSL); // Wait for stop bit to be sent
    while(!(I2C->SR1 & I2C_SR1_RXNE)); // Wait for last data to be received
    data[size - 1] = I2C->DR;     // Read last data
}

其中,SHT40_ADDRESS是SHT40传感器的地址,data是读取的数据存储地址,size是读取的数据长度。该函数的实现过程为:

  • 第1-4行:发送SHT40传感器地址和启动位;
  • 第6-16行:循环读取数据,并在读取最后一字节前发送停止位;
  • 第18-19行:等待停止位发送完成;
  • 第20-21行:等待最后一字节数据被接收;
  • 第22行:读取最后一字节数据。
  1. 计算温度和湿度值

我们可以从SHT40传感器中读取温度和湿度值,然后根据其原始数据计算出实际的温度和湿度值。下面是计算温度和湿度值的代码:

float sht40_read_temperature(void)
{
    uint8_t data[2];
    float temp;
    sht40_read(data, 2);
    temp = (175.0 * (float)data[0] / 65535.0) - 45.0;
    return temp;
}

float sht40_read_humidity(void)
{
    uint8_t data[2];
    float hum;
    sht40_read(data, 2);
    hum = (100.0 * (float)data[1] / 65535.0);
    return hum;
}

其中,sht40_read_temperature函数用于读取温度值,sht40_read_humidity函数用于读取湿度值。在读取SHT40传感器数据并计算温度和湿度值后,我们就可以在应用程序中使用这些值了。

总之,本文介绍了如何使用STM8的硬件I2C驱动SHT40传感器的过程,其中包括I2C的初始化、读取SHT40传感器数据和计算温度和湿度值。这些步骤可以帮助读者快速开发STM8和SHT40传感器应用程序。