| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282 |
- /******************************************************************************
- *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;
- }
|