/****************************************************************************** *Copyright(C),2024-2024,万众一芯生 *van_BSP_Temp_mts01.c *mts01 温度相关驱动接口 *修改历史 author 范义东 新建 2024/01/27 ******************************************************************************/ #include "onechip_include_header.h" #define MTS_IIC_ERR_TEMP (float)-60 #define MTS_MAX_ERR_NUMBER 5 #define MTS_REINIT_TIME 5*MTS_MAX_ERR_NUMBER #define MTS_RETRY_TIME 20000*MTS_MAX_ERR_NUMBER VAN_TEMP_MTS01_CON_ST_Def gTemp_mts01_demo_V1[] = { {TEMP_MTS01NAMEANDID(TEMP_BLOCK), &hi2c1, MTS01_ADDR0, TEMP_MTS01_MAX_AVG_TIME, 0}, }; const unsigned int gTemp_mts01_demo_V1_Num = ARR_LEN(gTemp_mts01_demo_V1); P_VAN_TEMP_MTS01_CON_ST_Def gTemp_mts01; unsigned int gTemp_mts01Num; VAN_TEMP_CHANNEl_CON_ST_Def gTemp_channel_demo_V1[] = { {EnmFuntionIdType_Idhost, 1 << TEMP_BLOCK}, }; const unsigned int gTemp_channel_demo_V1_Num = ARR_LEN(gTemp_channel_demo_V1); static float mst01_samp[ARR_LEN(gTemp_mts01_demo_V1)] = {0}; //传感器采集数据 static unsigned short last_valve[ARR_LEN(gTemp_mts01_demo_V1)] = {0}; static uint32_t count[ARR_LEN(gTemp_mts01_demo_V1)] = {0}; static uint32_t errorConter[ARR_LEN(gTemp_mts01_demo_V1)] = {0}; uint32_t printMts_temp = 0; extern void DelayMS(uint32_t ms); unsigned int MTS01_Init(P_VAN_TEMP_MTS01_CON_ST_Def pmts01); /**************************************************************** 函数名: loadPidCfg 创建时间: 2024/01/08 创建人: 范义东 函数说明:加载配置文件 参数: 返回值 : 加载成功 ****************************************************************/ unsigned int loadTemp_mts01Cfg(void) { unsigned int res; gTemp_mts01 = gTemp_mts01_demo_V1; gTemp_mts01Num = gTemp_mts01_demo_V1_Num; P_VAN_TEMP_MTS01_CON_ST_Def pmts01 = gTemp_mts01; for (int i = 0; i < gTemp_mts01Num; i++) { pmts01->header = 0; memset(pmts01->temp, 0, sizeof(pmts01->temp)); res = MTS01_Init(pmts01); pmts01++; } return res; } unsigned int MY_CRC8(unsigned char data[], unsigned char nbrOfBytes) { unsigned char bit; // Bit mask unsigned char crc = 0xFF; // Calculated checksum unsigned char 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; } /**************************************************************** 函数名: MTS01_Init 创建时间: 2024/01/08 创建人: 范义东 函数说明:模块初始化 参数: 返回值 : 加载成功 ****************************************************************/ unsigned int MTS01_Reg_Write(P_VAN_TEMP_MTS01_CON_ST_Def pmts01, unsigned int cmd, unsigned char *pData, unsigned int Size) { uint32_t ret; unsigned char wrbuf[16]; wrbuf[0] = cmd >> 8; wrbuf[1] = cmd; for (unsigned int i = 0; i < Size; i++) { wrbuf[2 + i] = pData[i]; } ret = HAL_I2C_Master_Transmit(pmts01->I2C, pmts01->addr, wrbuf, (Size + 2), 1000); return ret; } /**----------------------------------------------------------------------- * @brief Receive register data from I2C * @param DeviceAddr:I2C address cmd:I2C command *pdata:data received Size:total length * @retval success status -------------------------------------------------------------------------*/ unsigned int MTS01_Reg_Read(P_VAN_TEMP_MTS01_CON_ST_Def pmts01, unsigned int cmd, unsigned char *pData, unsigned int Size) { uint32_t ret; ret = MTS01_Reg_Write(pmts01, cmd, NULL, 0); if (ret == HAL_OK) { ret = HAL_I2C_Master_Receive(pmts01->I2C, pmts01->addr, pData, Size, 1000); } return ret; } /**************************************************************** 函数名: MTS01_Init 创建时间: 2024/01/08 创建人: 范义东 函数说明:模块初始化 参数: 返回值 : 加载成功 ****************************************************************/ unsigned int MTS01_Init(P_VAN_TEMP_MTS01_CON_ST_Def pmts01) { unsigned char scr_rd[3], scr_wr[3] = {0}; pmts01->isload = 0; if(HAL_OK == MTS01_Reg_Read(pmts01, READ_STATUSCONFIG, scr_rd, sizeof(scr_rd))){ pmts01->isload = 1; }else{ return 0; } scr_wr[0] |= CFG_Repeatbility_Medium; scr_wr[0] = (scr_wr[0] & ~CFG_MPS_Mask); scr_wr[0] |= CFG_MPS_10; scr_wr[1] = 0xFF; scr_wr[2] = MY_CRC8(scr_wr, 2); MTS01_Reg_Write(pmts01, WRITE_CONFIG, scr_wr, sizeof(scr_rd)); MTS01_Reg_Write(pmts01, CONVERT_T, NULL, 0); return 1; } /**************************************************************** * 函数名: MTS01_FindChale * 创建时间: 2024/01/08 * 创建人: 范义东 * 函数说明:通过 ID,查找Mts配置文件 * 输入参数: runMtsId ID * 输出参数: pMts01 电机参数 * 返回值 : 有配置文件返回true,返回失败 ****************************************************************/ bool MTS01_FindChale(unsigned char runMtsId, P_VAN_TEMP_MTS01_CON_ST_Def *pMts01) { unsigned char MtsId; /*寻找配置文件*/ for (MtsId = 0; MtsId < gTemp_mts01Num; MtsId++) { if (runMtsId == gTemp_mts01[MtsId].tempID) { *pMts01 = &gTemp_mts01[MtsId]; return true; } } *pMts01 = NULL; return false; } /**************************************************************** * 函数名: MTS01_ReadTemp * 创建时间: 2024/01/08 * 创建人: 范义东 * 函数说明:通过温度通道 获取当前温度 * 输入参数: runMtsId 通道 * 输出参数: pTemp 当前温度 * 返回值 : 成功rue,失败返回false ****************************************************************/ bool MTS01_ReadTemp(unsigned char runMtsId, float *pTemp) { unsigned char data[3] = {0}; P_VAN_TEMP_MTS01_CON_ST_Def pMts01; if (MTS01_FindChale(runMtsId, &pMts01)) { if(pMts01->isload == 0){ *pTemp = -104; return False; }; I2C_HandleTypeDef *I2C = pMts01->I2C; HAL_StatusTypeDef ret = HAL_I2C_Master_Receive(pMts01->I2C, pMts01->addr, data, sizeof(data), 1000); if (ret != HAL_OK) { errorConter[runMtsId]++; if ((errorConter[runMtsId] % MTS_MAX_ERR_NUMBER) == 0) { if ((errorConter[runMtsId] < MTS_REINIT_TIME)) { *pTemp = MTS_IIC_ERR_TEMP-1;/*比异常低一度,便于异常判断*/ float temp = (*pTemp - 40)*256; *(short *)&last_valve[runMtsId] = temp; HAL_I2C_DeInit(I2C); HAL_Delay(300U); HAL_I2C_Init(I2C); HAL_Delay(300U); MTS01_Init(pMts01); HAL_Delay(300U); } } else if (errorConter[runMtsId] > MTS_RETRY_TIME) { errorConter[runMtsId] = 0; } return False; } unsigned char clcCrc = MY_CRC8(data, 2); if (data[2] == clcCrc) { unsigned short tmpraw = (uint16_t)data[0] << 8 | data[1]; //值相同的次数++ if (last_valve[runMtsId] == tmpraw) { count[runMtsId]++; if (count[runMtsId] > 5) { //需要重新初始化 count[runMtsId] = 0; HAL_I2C_DeInit(I2C); HAL_Delay(300U); HAL_I2C_Init(I2C); HAL_Delay(300U); MTS01_Init(pMts01); HAL_Delay(300U); } } else { count[runMtsId] = 0; errorConter[runMtsId] = 0; } last_valve[runMtsId] = tmpraw; float temp = (short)tmpraw; temp = temp / 256; *pTemp = (temp + 40); if (*pTemp > (float)200.0) { } return True; } else { if (MTS_MAX_ERR_NUMBER > errorConter[runMtsId]) { float temp = (short)last_valve[runMtsId]; temp = temp / 256; *pTemp = (temp + 40); } else if (MTS_MAX_ERR_NUMBER == errorConter[runMtsId]) { *pTemp = -101; errorConter[runMtsId] = 0; } errorConter[runMtsId]++; } } else { *pTemp = -103; } return False; } /**************************************************************** * 函数名: MTS01_Temp_get * 创建时间: 2024/01/08 * 创建人: 范义东 * 函数说明:通过温度通道 获取当前温度 * 输入参数: runMtsId 通道 * 输出参数: pTemp 当前温度 * 返回值 : -1001:IIC 不回; -1002:IIC校验错误; -1003:没有传感器 ****************************************************************/ bool MTS01_Temp_get(uint32_t runMtsId, float *Value) { P_VAN_TEMP_CHANNEl_CON_ST_Def p = gTemp_channel_demo_V1; for (int i = 0; i < gTemp_channel_demo_V1_Num; i++) { if (p->id == runMtsId) { *Value = p->temp; return true; } p++; } return False; }