如题,找不 到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);
}