如题,找不 到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的,读取寄存器的值里面的数据是否正确,按照时序操作就好了!
不知道你这个问题是否已经解决, 如果还没有解决的话: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驱动程序。以下是一个简单的例程来实现这个功能:
首先,需要在STM8芯片上配置I2C的端口和引脚。例如,我们可以将SCL引脚连接到PA1,SDA引脚连接到PA2。
然后,在STM8芯片上初始化I2C总线,包括设置I2C时钟频率、使能I2C总线和配置中断。
I2C_Init();
I2C_ClockSpeedConfig(I2C_CLOCK_SPEED_100K);
I2C_Cmd(ENABLE);
I2C_ITConfig(ENABLE);
接下来,我们可以编写一个函数来向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);
}
最后,我们可以在主函数中调用SHT40_Read_Data()函数以读取温度和湿度数据。
int main()
{
SHT40_Read_Data();
// 处理温湿度数据
return 0;
}
通过上述代码,我们可以在STM8芯片上实现与SHT40传感器的通信和数据读取。此外,需要注意一些细节问题,如时序控制和错误处理等,以确保系统的可靠性和稳定性。
STM8是意法半导体公司推出的一款低成本、高性能、低功耗的8位微控制器。在STM8控制器中,硬件I2C模块是一个常用的外设。SHT40是一种数字式温度和湿度传感器,具有高精度、高稳定性和广泛的应用领域。本文将介绍如何使用STM8的硬件I2C驱动SHT40传感器。
首先,需要将SHT40传感器连接到STM8控制器,具体的连接方式如下:
SHT40 | STM8 |
---|---|
GND | GND |
VDD | 3.3V |
SCL | PB4 |
SDA | PB5 |
在使用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应答。
在初始化完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是读取的数据长度。该函数的实现过程为:
我们可以从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传感器应用程序。