金牌会员
 
- 积分
- 2107
- 金钱
- 2107
- 注册时间
- 2017-2-11
- 在线时间
- 307 小时
|
直接上代码
- /*
- * bsp_sht31_1.c
- *
- * Created on: 2020年11月10日
- * Author: jiangyuanyuan
- */
- #include "bsp_sht31_1.h"
- void SHT31_SDA_IN(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct = {0};
- //PB7初始化设置
- SHT7_DIR_BA();
- GPIO_InitStruct.Pin = SHT7_SDA1_Pin;
- GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
- GPIO_InitStruct.Pull = GPIO_PULLUP;
- HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
- }
- void SHT31_SDA_OUT(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct = {0};
- //PB7初始化设置
- SHT7_DIR_AB();
- GPIO_InitStruct.Pin = SHT7_SDA1_Pin;
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStruct.Pull = GPIO_PULLUP;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
- HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
- }
- /*************************以下为IO口模拟IIC通信**********************************/
- //IIC起始信号
- void SHT31_Start(void)
- {
- //when scl is high, the SDA is change from high to low
- SHT31_SDA_OUT(); //配置SDA线为输出
- SHT31_IIC_SDAOUT = 1;
- // Delay_us(5);
- SHT31_IIC_SCL = 1;
- Delay_us(10);
- SHT31_IIC_SDAOUT = 0;
- Delay_us(10);
- SHT31_IIC_SCL = 0; //准备发送或接收数据
- Delay_us(10);
- }
- //IIC停止信号
- void SHT31_Stop(void)
- {
- //When scl is high, the SDA is change from low to high
- SHT31_SDA_OUT(); //配置SDA线为输出
- SHT31_IIC_SCL = 0;
- Delay_us(3);
- SHT31_IIC_SDAOUT = 0;
- Delay_us(5);
- SHT31_IIC_SCL = 1;
- Delay_us(10);
- SHT31_IIC_SDAOUT = 1; //发送I2C总线结束信号
- Delay_us(10);
- }
- /****************************************************************************
- * 名 称: u8 MCU_Wait_Ack(void)
- * 功 能:MCU等待从设备应答信号到来
- * 入口参数:无
- * 返回参数:1:接收应答失败 0:接收应答成功
- * 说 明:
- ****************************************************************************/
- u8 SHT31_Wait_Ack(void)
- {
- u16 WaitTime = 0;
- SHT31_IIC_SDAOUT = 1;
- SHT31_SDA_IN(); //配置SDA线为输入
- Delay_us(4); //2
- SHT31_IIC_SCL = 1;
- Delay_us(2); //5
- while(SHT31_IIC_SDAIN)
- {
- Delay_us(1);
- WaitTime++;
- if(WaitTime>250)
- {
- SHT31_Stop();
- return 1;
- }
- }
- SHT31_IIC_SCL = 0;
- Delay_us(8); //added
- return 0;
- }
- /****************************************************************************
- * 名 称: u8 void MCU_Send_Ack(void)
- * 功 能:MCU产生ACK应答,告知24cxx
- * 入口参数:无
- * 返回参数:
- * 说 明:
- ****************************************************************************/
- void SHT31_Send_Ack(void)
- {
- SHT31_IIC_SCL = 0;
- SHT31_SDA_OUT();
- SHT31_IIC_SDAOUT = 0;
- Delay_us(2);
- SHT31_IIC_SCL = 1;
- Delay_us(2);
- SHT31_IIC_SCL = 0;
- }
- /****************************************************************************
- * 名 称: u8 void MCU_Send_Ack(void)
- * 功 能:MCU不产生ACK应答
- * 入口参数:无
- * 返回参数:
- * 说 明:
- ****************************************************************************/
- void SHT31_NOAck(void)
- {
- SHT31_IIC_SCL = 0;
- SHT31_SDA_OUT();
- SHT31_IIC_SDAOUT = 1;
- Delay_us(2);
- SHT31_IIC_SCL = 1;
- Delay_us(2);
- SHT31_IIC_SCL = 0;
- }
- /****************************************************************************
- * 名 称: void IIC_write_OneByte(u8 Senddata)
- * 功 能:IIC写一个字节到EEPROM
- * 入口参数:Senddata:写入的8位数据
- * 返回参数:
- * 说 明:
- ****************************************************************************/
- void SHT31_write_OneByte(u8 Senddata)
- {
- u8 t;
- SHT31_SDA_OUT();
- // IIC_SCL=0; //拉低时钟开始数据传输
- for(t = 0;t < 8;t++)
- {
- SHT31_IIC_SDAOUT=(Senddata&0x80)>>7;
- Senddata <<= 1;
- Delay_us(5);
- SHT31_IIC_SCL = 1;
- Delay_us(10);
- SHT31_IIC_SCL = 0;
- Delay_us(2);
- }
- }
- /****************************************************************************
- * 名 称: void IIC_Read_OneByte(u8 Senddata)
- * 功 能:IIC读取一个字节
- * 入口参数:ack=1,发送ACK,ack=0,发送nACK
- * 返回参数:读到的8位数据
- * 说 明:
- ****************************************************************************/
- u8 SHT31_Read_OneByte(u8 ack)
- {
- u8 i,receivedata = 0;
- SHT31_SDA_IN(); //配置SDA线为输入
- for(i=0;i<8;i++ )
- {
- SHT31_IIC_SCL = 0;
- Delay_us(3);
- SHT31_IIC_SCL = 1;
- Delay_us(5); //added by xiang
- receivedata <<= 1;
- if(SHT31_IIC_SDAIN)
- receivedata++;
- Delay_us(1);
- }
- if (!ack)
- SHT31_NOAck();//发送nACK
- else
- SHT31_Send_Ack(); //发送ACK
- return receivedata;
- }
- //初始化IIC接口
- void SHT31_Init(void)
- {
- Delay_us(200);
- SHT31_SetPeriodicMeasurement();
- Delay_us(200);
- }
- u16 TemValue = 0;
- u16 RhValue = 0;
- u8 Flag_New_Data = 0;
- void SHT31_Get(void)
- {
- u16 temp1 = 0,temp2 = 0;
- u16 data;
- u8 buf1[3],buf2[3]; //store Temperature +crc and Humidity +crc
- SHT31_Start(); //启动总线
- SHT31_write_OneByte(i2cAddWrite_8bit); //发送写命令(i2c地址)
- SHT31_Wait_Ack(); //等待应答
- SHT31_write_OneByte(CMD_FETCH_DATA_H); //发送地址 High
- SHT31_Wait_Ack(); //等待应答
- SHT31_write_OneByte(CMD_FETCH_DATA_L); //发送地址 Low
- SHT31_Wait_Ack(); //等待应答
- SHT31_Start(); //重新启动总线
- SHT31_write_OneByte(i2cAddRead_8bit); //设置为读操作
- SHT31_Wait_Ack(); //等待应答;
- //读字节下面连续读出数据6 bytes 前5个ACK应答 最后一个NO ACK
- buf1[0] = SHT31_Read_OneByte(1);
- buf1[1] = SHT31_Read_OneByte(1);
- buf1[2] = SHT31_Read_OneByte(1);
- buf2[0] = SHT31_Read_OneByte(1);
- buf2[1] = SHT31_Read_OneByte(1);
- buf2[2] = SHT31_Read_OneByte(0);
- SHT31_Stop(); //结束总线
- temp1 = SHT31_CheckCrc(buf1,2,buf1[2]);
- if(!temp1)
- {
- data = (buf1[0]<<8)|buf1[1];
- TemValue = SHT31_CalcTemperature(data);
- Flag_New_Data = 1;
- }
- temp2 = SHT31_CheckCrc(buf2,2,buf2[2]);
- if(!temp2)
- {
- data = (buf2[0]<<8) | buf2[1];
- RhValue = SHT31_CalcRH(data);
- Flag_New_Data = 1;
- }
- *(u16 *)&ucParamMem[ID_EMT][0] = TemValue;
- *(u16 *)&ucParamMem[ID_EMH][0] = RhValue;
- }
- /******************************************************/
- void SHT31_WriteCMD(u16 cmd)
- {
- SHT31_Start();
- SHT31_write_OneByte(i2cAddWrite_8bit);
- SHT31_Wait_Ack();
- SHT31_write_OneByte(cmd>>8);
- SHT31_Wait_Ack();
- SHT31_write_OneByte(cmd);
- SHT31_Wait_Ack();
- SHT31_Stop();
- }
- /********************************************************/
- void SHT31_SetPeriodicMeasurement(void)
- {
- SHT31_WriteCMD(CMD_MEAS_PERI_2_H);
- }
- u8 SHT31_CalcCrc(u8 *data, u8 nbrOfBytes)
- {
- u8 bit; // bit mask
- u8 crc = 0xFF; // calculated checksum
- u8 byteCtr; // byte counter
- // calculates 8-Bit checksum with given polynomial
- for(byteCtr = 0; byteCtr < nbrOfBytes; byteCtr++)
- {
- crc ^= (data[byteCtr]);
- for(bit = 8; bit > 0; --bit)
- {
- if(crc & 0x80)
- {
- crc = (crc << 1) ^ POLYNOMIAL;
- }
- else
- {
- crc = (crc << 1);
- }
- }
- }
- return crc;
- }
- //校验
- u8 SHT31_CheckCrc(u8 *pdata, u8 nbrOfBytes, u8 checksum)
- {
- u8 crc;
- crc = SHT31_CalcCrc(pdata, nbrOfBytes);// calculates 8-Bit checksum
- if(crc != checksum)
- {
- return 1;
- }
- return 0;
- }
- //获取温度
- u16 SHT31_CalcTemperature(u16 rawValue)
- {
- // calculate temperature
- u16 temp;
- temp = (175 * (float)rawValue * 100 / 65535 - 4500) ; // T = -45 + 175 * rawValue / (2^16-1)
- return temp;
- }
- //获取湿度
- u16 SHT31_CalcRH(u16 rawValue)
- {
- // calculate relative humidity [%RH]
- u16 temp = (100 * (float)rawValue * 100 / 65535) ; // RH = rawValue / (2^16-1) * 10
- return temp;
- }
复制代码
- /*
- * bsp_sht31_1.h
- *
- * Created on: 2020年11月10日
- * Author: jiangyuanyuan
- */
- #ifndef INC_BSP_SHT31_1_H_
- #define INC_BSP_SHT31_1_H_
- #include "mytype.h"
- #include "stm32f4xx_hal.h"
- #include "bsp_delay.h"
- #include "bsp_sys.h"
- #include "gpio.h"
- #include "parameter.h"
- #define i2cAddWrite_8bit 0x88
- #define i2cAddRead_8bit 0x89
- #define TEM_CHEAK_VALUE 2
- #define RH_CHEAK_VALUE 13
- /*CRC*/
- #define POLYNOMIAL 0x131 // P(x) = x^8 + x^5 + x^4 + 1 = 100110001
- // Sensor Commands
- // readout measurements for periodic mode
- #define CMD_FETCH_DATA_H 0xe0
- #define CMD_FETCH_DATA_L 0x00
- #define CMD_MEAS_PERI_2_H 0x2236
- #define SHT31_IIC_SCL PBout(6) //SCL
- #define SHT31_IIC_SDAOUT PBout(7) //输出SDA
- #define SHT31_IIC_SDAIN PBin(7) //输入SDA
- #define SHT7_DIR_AB() PBout(8)=1
- #define SHT7_DIR_BA() PBout(8)=0
- //IIC相关函数
- void SHT31_Start(void); //发送IIC开始信号
- void SHT31_Stop(void); //发送IIC停止信号
- u8 SHT31_Wait_Ack(void); //IIC等待ACK信号
- void SHT31_Send_Ack(void); //IIC发送ACK信号
- void SHT31_NOAck(void); //IIC不发送ACK信号
- void SHT31_write_OneByte(u8 Senddata);
- u8 SHT31_Read_OneByte(u8 ack);
- extern u16 TemValue;
- extern u16 RhValue;
- extern u8 Flag_New_Data;
- extern void SHT31_Init(void);
- extern void SHT31_Get(void);
- void SHT31_SetPeriodicMeasurement(void);
- u8 SHT31_CheckCrc(u8 *pdata, u8 nbrOfBytes, u8 checksum);
- u16 SHT31_CalcTemperature(u16 rawValue);
- u16 SHT31_CalcRH(u16 rawValue);
- #endif /* INC_BSP_SHT31_1_H_ */
复制代码
main.c文件
- int main(void)
- {
- static u16 usLoopCnt = 0;
- SHT31_Init();
- while(1)
- {
- if (usLoopCnt == 199)
- {
- SHT31_Get();
- }
- usLoopCnt++;
- usLoopCnt %= 300;
- }
- }
复制代码
|
|