From 9f0b84b83da70fd2d841e5f5c0caa28eda28521e Mon Sep 17 00:00:00 2001 From: liumin Date: Sat, 5 Jul 2025 07:58:42 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6=E8=87=B3?= =?UTF-8?q?=20/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SwDriver.H | 122 ++++++++++++ T2.C | 175 +++++++++++++++++ T2.H | 104 ++++++++++ temperature.C | 518 ++++++++++++++++++++++++++++++++++++++++++++++++++ temperature.h | 164 ++++++++++++++++ 5 files changed, 1083 insertions(+) create mode 100644 SwDriver.H create mode 100644 T2.C create mode 100644 T2.H create mode 100644 temperature.C create mode 100644 temperature.h diff --git a/SwDriver.H b/SwDriver.H new file mode 100644 index 0000000..91e78e1 --- /dev/null +++ b/SwDriver.H @@ -0,0 +1,122 @@ +#ifndef _MC33993_H_ +#define _MC33993_H_ + +//***************************************************************************** +//宏定义 +//***************************************************************************** +//多余20片需要增加 +#define Mc33993_0 0 +#define Mc33993_1 1 +#define Mc33993_2 2 +#define Mc33993_3 3 +#define Mc33993_4 4 +#define Mc33993_5 5 +#define Mc33993_6 6 +#define Mc33993_7 7 +#define Mc33993_8 8 +#define Mc33993_9 9 +#define Mc33993_10 10 +#define Mc33993_11 11 +#define Mc33993_12 12 +#define Mc33993_13 13 +#define Mc33993_14 14 +#define Mc33993_15 15 +#define Mc33993_16 16 +#define Mc33993_17 17 +#define Mc33993_18 18 +#define Mc33993_19 19 +#define Mc33993_20 20 + + +#define D24V 0 +#define Gnd 1 + +#define TriOff 0 +#define TriOn 1 + +#define WetCur2mA 0 +#define WetCur16mA 1 + +#define SwToGnd 0 +#define SwToPwr 1 + +#define ALLTRI 0xff +#define ALLD24V 0x0 + +#define DF_CMDSWSTATUS 0x00 +#define DF_CMDSETTING 0x01 +#define DF_CMDINT_SP 0x02 +#define DF_CMDINT_SG 0x03 +#define DF_CMDMETALLIC_SP 0x04 +#define DF_CMDMETALLIC_SG 0x05 +#define DF_CMDANALOG 0x06 +#define DF_CMDWETCURR_SP 0x07 +#define DF_CMDWETCURR_SG 0x08 +#define DF_CMDTRISTATE_SP 0x09 +#define DF_CMDTRISTATE_SG 0x0A +#define DF_CMDCALIBRATION 0x0B +#define DF_CMDSLEEP 0x0C +#define DF_CMDRESET 0x7F + + +#define DF_FLGTHEM 10 +#define DF_FLGINT 11 +#define DF_FLGSP7 12 +#define DF_FLGSP6 13 +#define DF_FLGSP5 14 +#define DF_FLGSP4 15 +#define DF_FLGSP3 16 +#define DF_FLGSP2 17 +#define DF_FLGSP1 18 +#define DF_FLGSP0 19 +#define DF_FLGSG13 20 +#define DF_FLGSG12 21 +#define DF_FLGSG11 22 +#define DF_FLGSG10 23 +#define DF_FLGSG9 24 +#define DF_FLGSG8 25 +#define DF_FLGSG7 26 +#define DF_FLGSG6 27 +#define DF_FLGSG5 28 +#define DF_FLGSG4 29 +#define DF_FLGSG3 30 +#define DF_FLGSG2 31 +#define DF_FLGSG1 32 +#define DF_FLGSG0 33 + +//Analog +#define DF_AN_HIMP 1 +#define DF_AN_2MA 2 +#define DF_AN_16MA 3 + +#define DF_CH_SG0 1 +#define DF_CH_SG1 2 +#define DF_CH_SG2 3 +#define DF_CH_SG3 4 +#define DF_CH_SG4 5 +#define DF_CH_SG5 6 +#define DF_CH_SG6 7 +#define DF_CH_SG7 8 +#define DF_CH_SG8 9 +#define DF_CH_SG9 10 +#define DF_CH_SG10 11 +#define DF_CH_SG11 12 +#define DF_CH_SG12 13 +#define DF_CH_SG13 14 +#define DF_CH_SP0 15 +#define DF_CH_SP1 16 +#define DF_CH_SP2 17 +#define DF_CH_SP3 18 +#define DF_CH_SP4 19 +#define DF_CH_SP5 20 +#define DF_CH_SP6 21 +#define DF_CH_SP7 22 +//***************************************************************************** +//外部引用全局函数声明 +//***************************************************************************** +void SwStaSample(UnSwSample *ptmp); +void InitSW(void); +void LedLight(UnSwOut *tmpUn); +//void Swtest2(void); +//ubyte Mc33993AnalogChSel(ubyte NumMc,ubyte Mode,ubyte Channal); +#endif \ No newline at end of file diff --git a/T2.C b/T2.C new file mode 100644 index 0000000..c9fc744 --- /dev/null +++ b/T2.C @@ -0,0 +1,175 @@ +//**************************************************************************** +// @Module Timer 2 +// @Filename T2.C +// @Project CL2.0.dav +//---------------------------------------------------------------------------- +// @Controller Infineon XC886CLM-8FF +// +// @Compiler Keil +// +// @Codegenerator 1.3 +// +// @Description: This file contains functions that use the T2 module. +// +//---------------------------------------------------------------------------- +// @Date 2025/1/18 20:45:31 +// +//**************************************************************************** + +// USER CODE BEGIN (T2_General,1) + +// USER CODE END + + + +//**************************************************************************** +// @Project Includes +//**************************************************************************** + +#include "MAIN.H" + +// USER CODE BEGIN (T2_General,2) + +// USER CODE END + + +//**************************************************************************** +// @Macros +//**************************************************************************** + +// USER CODE BEGIN (T2_General,3) + +// USER CODE END + + +//**************************************************************************** +// @Defines +//**************************************************************************** + +// USER CODE BEGIN (T2_General,4) + +// USER CODE END + + +//**************************************************************************** +// @Typedefs +//**************************************************************************** + +// USER CODE BEGIN (T2_General,5) + +// USER CODE END + + +//**************************************************************************** +// @Imported Global Variables +//**************************************************************************** + +// USER CODE BEGIN (T2_General,6) + +// USER CODE END + + +//**************************************************************************** +// @Global Variables +//**************************************************************************** + +// USER CODE BEGIN (T2_General,7) + +// USER CODE END + + +//**************************************************************************** +// @External Prototypes +//**************************************************************************** + +// USER CODE BEGIN (T2_General,8) + +// USER CODE END + + +//**************************************************************************** +// @Prototypes Of Local Functions +//**************************************************************************** + +// USER CODE BEGIN (T2_General,9) + +// USER CODE END + + +//**************************************************************************** +// @Function void T2_vInit(void) +// +//---------------------------------------------------------------------------- +// @Description This is the initialization function of the Timer 2 function +// library. It is assumed that the SFRs used by this library +// are in their reset state. +// +// The following SFRs and SFR fields will be initialized: +// T2_RC2H/RC2L - reload/capture timer 2 register +// T2_T2H/T2L - timer 2 register +// ET2 - timer 2 interrupt enable +// T2_T2MOD - timer 2 mode register +// CP/RL2 - Capture/Reload select +// EXEN2 - External enable control +// TR2 - Timer2 run control +// +//---------------------------------------------------------------------------- +// @Returnvalue None +// +//---------------------------------------------------------------------------- +// @Parameters None +// +//---------------------------------------------------------------------------- +// @Date 2025/1/18 +// +//**************************************************************************** + +// USER CODE BEGIN (T2_Init,1) + +// USER CODE END + +void T2_vInit(void) +{ + // USER CODE BEGIN (T2_Init,2) + + // USER CODE END + + // ----------------------------------------------------------------------- + // Operating Mode + // ----------------------------------------------------------------------- + + /// 16-bit timer function with automatic reload when timer 2 overflows + /// the timer 2 resolution is 1 ?s + /// the timer 2 overflow is 1000.000 ?s + /// timer 2 interrupt: enabled + /// timer 2 will be started + + // ----------------------------------------------------------------------- + // Register Initialization + // ----------------------------------------------------------------------- + + T2_T2L = 0x30; // load timer 2 register, low byte + + T2_T2H = 0xF8; // load timer 2 register, high byte + + T2_RC2L = 0x30; // load timer 2 reload/capture register, + // low byte + T2_RC2H = 0xF8; // load timer 2 reload/capture register, + // high byte + T2_T2MOD = 0x00; // load timer 2 mode register + + /// timer 2 Interrupt enable bit is set in SHINT_vInit() function + + // USER CODE BEGIN (T2_Init,3) + + // USER CODE END + + TR2 = 1; // start timer + +} // End of function T2_vInit + + +// USER CODE BEGIN (T2_General,10) + +// USER CODE END + diff --git a/T2.H b/T2.H new file mode 100644 index 0000000..a55512d --- /dev/null +++ b/T2.H @@ -0,0 +1,104 @@ +//**************************************************************************** +// @Module Timer 2 +// @Filename T2.H +// @Project CL2.0.dav +//---------------------------------------------------------------------------- +// @Controller Infineon XC886CLM-8FF +// +// @Compiler Keil +// +// @Codegenerator 1.3 +// +// @Description: This file contains all function prototypes and macros for +// the T2 module. +// +//---------------------------------------------------------------------------- +// @Date 2025/1/18 20:45:31 +// +//**************************************************************************** + +// USER CODE BEGIN (T2_Header,1) + +// USER CODE END + + + +#ifndef _T2_H_ +#define _T2_H_ + +//**************************************************************************** +// @Project Includes +//**************************************************************************** + +// USER CODE BEGIN (T2_Header,2) + +// USER CODE END + + +//**************************************************************************** +// @Macros +//**************************************************************************** + +// USER CODE BEGIN (T2_Header,3) + +// USER CODE END + + +//**************************************************************************** +// @Defines +//**************************************************************************** + +// USER CODE BEGIN (T2_Header,4) + +// USER CODE END + +//**************************************************************************** +// @Typedefs +//**************************************************************************** + +// USER CODE BEGIN (T2_Header,5) + +// USER CODE END + + +//**************************************************************************** +// @Imported Global Variables +//**************************************************************************** + +// USER CODE BEGIN (T2_Header,6) + +// USER CODE END + + +//**************************************************************************** +// @Global Variables +//**************************************************************************** + +// USER CODE BEGIN (T2_Header,7) + +// USER CODE END + + +//**************************************************************************** +// @Prototypes Of Global Functions +//**************************************************************************** + +void T2_vInit(void); + +// USER CODE BEGIN (T2_Header,8) + +// USER CODE END + + +//**************************************************************************** +// @Interrupt Vectors +//**************************************************************************** + + +// Shared interrupt vector definitions are defined in SHARED_INT.H + +// USER CODE BEGIN (T2_Header,9) + +// USER CODE END + +#endif // ifndef _T2_H_ diff --git a/temperature.C b/temperature.C new file mode 100644 index 0000000..cefe3f9 --- /dev/null +++ b/temperature.C @@ -0,0 +1,518 @@ +#include "temperature.H" +#include +#include + +UnSwSample UnSwSample_1 = {0}; +#define Measure_Period 11000 + +unsigned char romid[MAXNUM][8]; +int RomNum; + +/** + * @brief 计算多个字节序列的校验和 + * @param serial:字节数组指针 + * @param length:字节数组的长度 + * @retval 校验和(CRC) +*/ +#define POLYNOMIAL 0x131 //100110001 +ubyte MY_OW_CRC8(ubyte *serial, ubyte length) +{ + ubyte result = 0x00; + ubyte pDataBuf; + ubyte i; + + while(length--) { + pDataBuf = *serial++; + for(i=0; i<8; i++) { + if((result^(pDataBuf))&0x01) { + result ^= 0x18; + result >>= 1; + result |= 0x80; + } + else { + result >>= 1; + } + pDataBuf >>= 1; + } + } + + return result; +} + + +//非精确延时2*X us,固定误差10us +//@12.000MHz 12T模式 +void Delay_us(uword x) +{ + for (; x > 0; x--) + { + _nop_(); + _nop_(); + } +} + +//////////////////////////////////////////////////////////////////// +// 主机发送 复位脉冲( 大于 480 us 低电平) ,并检查 存在 脉冲 +unsigned char OW_ResetPresence(void) +{ + unsigned char presence; int count=0; + + SFR_PAGE(_pp0, noSST); // switch to page 0 + P3_DIR = P3_DIR | 0x20; // load direction register P3.5切换为输出 + + DQ = 0; // 主机拉低 DQ 总线 + Delay_us(240); // 拉低 DQ 总线 持续 480us + DQ = 1; // 主机释放总线,由上拉电阻拉高 + + SFR_PAGE(_pp0, noSST); // switch to page 0 + P3_DIR = P3_DIR & 0xDF;// load direction register + + Delay_us(40); // 等待 80us 后检查 presence + presence = DQ; // 检查存在 脉冲 + while( presence && (count< 17) ) + { + Delay_us(5); + presence = DQ; + count++; + } + Delay_us(200); // 时序末尾 等待 + return (presence ? FALSE : TRUE); +} // presence =0 时, M6 01 存在 , presence =1 时, M601 不存在 + +//////////////////////////////////////////////////////////////////// +//// READ_BIT – 从 M601 读取 一位数 +unsigned char read_bit(void) +{ + unsigned char res; + + SFR_PAGE(_pp0, noSST); // switch to page 0 + P3_DIR = P3_DIR | 0x20; // load direction register 切换为输出状态 + + DQ = 0; // 主机拉低 DQ 总线 + Delay_us(1); // 拉低 DQ 总线 持续 3us + DQ = 1; // 主机释放 DQ 总线,由上拉电阻拉高 + SFR_PAGE(_pp0, noSST); // switch to page 0 + P3_DIR = P3_DIR & 0xDF;// load direction register + + Delay_us(3); // 等待 10us 确保总线上数据稳定 + + res = DQ; + Delay_us(27); // 时序末尾 等待 + return(res); // 返回读取 数值 +} + +//////////////////////////////////////////////////////////////////// +//// WRITE_BIT – 主机 写一位数据 到 M601 +void write_bit(char bitval) +{ + SFR_PAGE(_pp0, noSST); // switch to page 0 + P3_DIR = P3_DIR | 0x20; // load direction register 切换为输出状态 + + DQ = 0; // 主机拉低 DQ 总线 + Delay_us(2); // 拉低 DQ 总线 持续 5us + if(bitval == 1) DQ =1; // 如果 写 1,此时拉高 DQ 总线 + Delay_us(25); // 如果 写 0,则持续拉低 DQ 总线 60 us + DQ = 1; // 释放 DQ 总线 + Delay_us(5); // (写 0)恢复 时间 10us +} + +///////////////////////////////////////////////////////////////////// +//// READ_BYTE - 从 M601 读取 一字节 数据 +unsigned char OW_ReadByte(void) +{ + unsigned char i, j; + unsigned char value = 0; + for (i = 0;i < 8;i++) { + j = read_bit(); + value = (value) | (j<> i; + temp &= 0x01; // 低位 先行 + write_bit(temp); + } +} + + +/** + * @brief 读芯片寄存器的暂存器组 + * @param scr:字节数组指针, 长度为 @sizeof(M601_SCRATCHPAD_READ) + * @retval 读状态 +*/ +BOOL M601_ReadScratchpad_SkipRom(ubyte *scr) +{ + int i; + +// /*size < sizeof(M601_SCRATCHPAD_READ)*/ + if(OW_ResetPresence() == FALSE) + return FALSE; + + OW_WriteByte(SKIP_ROM); + OW_WriteByte(READ_SCRATCHPAD); + + for(i=0; i < sizeof(M601_SCRATCHPAD_READ); i++) + { + *scr++ = OW_ReadByte(); + } + + return TRUE; +} + +/** + * @brief 写芯片寄存器的暂存器组 + * @param scr:字节数组指针, 长度为 @sizeof(M601_SCRATCHPAD_WRITE) + * @retval 写状态 +**/ +BOOL M601_WriteScratchpad_SkipRom(ubyte *scr) +{ + int i; + + if(OW_ResetPresence() == FALSE) + return FALSE; + + OW_WriteByte(SKIP_ROM); + OW_WriteByte(WRITE_SCRATCHPAD); + + for(i=0; i < sizeof(M601_SCRATCHPAD_WRITE); i++) + { + OW_WriteByte(*scr++); + } + + return TRUE; +} + + + +/** + * @brief 设置周期测量频率和重复性 + * @param mps 要设置的周期测量频率(每秒测量次数),可能为下列其一 + * @arg CFG_MPS_Single :每执行ConvertTemp一次,启动一次温度测量 + * @arg CFG_MPS_Half :每执行ConvertTemp一次,启动每秒0.5次重复测量 + * @arg CFG_MPS_1 :每执行ConvertTemp一次,启动每秒1次重复测量 + * @arg CFG_MPS_2 :每执行ConvertTemp一次,启动每秒2次重复测量 + * @arg CFG_MPS_4 :每执行ConvertTemp一次,启动每秒4次重复测量 + * @arg CFG_MPS_10 :每执行ConvertTemp一次,启动每秒10次重复测量 + * @param repeatability:要设置的重复性值,可能为下列其一 + * @arg CFG_Repeatbility_Low :设置低重复性 + * @arg CFG_Repeatbility_Medium :设置中重复性 + * @arg CFG_Repeatbility_High :设置高重复性 + * @retval 无 +*/ +BOOL SetConfig(ubyte mps, ubyte repeatability) +{ + ubyte scrb[sizeof(M601_SCRATCHPAD_READ)]; + M601_SCRATCHPAD_READ *scr = (M601_SCRATCHPAD_READ *) scrb; + + /*读9个字节。第7字节是系统配置寄存器,第8字节是系统状态寄存器。最后字节是前8个的校验和--CRC。*/ + if(M601_ReadScratchpad_SkipRom(scrb) == FALSE) + { + return FALSE; /*读暂存器组水平*/ + } + + /*计算接收的前8个字节的校验和,并与接收的第9个CRC字节比较。*/ + if(scrb[8] != MY_OW_CRC8(scrb, 8)) + { + return FALSE; /*CRC验证未通过*/ + } + + scr->Cfg &= ~CFG_Repeatbility_Mask; + scr->Cfg |= repeatability; + scr->Cfg &= ~CFG_MPS_Mask; + scr->Cfg |= mps; + + M601_WriteScratchpad_SkipRom(scrb+4); + + return TRUE; +} + +/** + * @brief 把16位二进制补码表示的温度输出转换为以摄氏度为单位的温度读数 + * @param out:有符号的16位二进制温度输出 + * @retval 以摄氏度为单位的浮点温度 +*/ +float M601_OutputtoTemp(int out) +{ + + + + return ((float)(out/256.0) + 40.0); +} + +/** + * @brief 启动温度测量 + * @param 无 + * @retval 单总线发送状态 +*/ +BOOL ConvertTemp(void) +{ + if(OW_ResetPresence() == FALSE) + return FALSE; + + OW_WriteByte(SKIP_ROM); + OW_WriteByte(CONVERT_T); + + return TRUE; +} + +/** + * @brief 等待转换结束后读测量结果。和@ConvertTemp联合使用 + * @param iTemp:返回的16位温度测量结果 + * @retval 读状态 +*/ +//BOOL ReadTempWaiting(uword *iTemp) +//{ +// ubyte scrb[sizeof(M601_SCRATCHPAD_READ)]; +// M601_SCRATCHPAD_READ *scr = (M601_SCRATCHPAD_READ *) scrb; + +// /*读9个字节。前两个是温度转换结果,最后字节是前8个的校验和--CRC。*/ +// if(M601_ReadScratchpad_SkipRom(scrb) == FALSE) +// { +// UnSwSample_1.bit_data.temperature[1] = 1; +// return FALSE; /*读寄存器失败*/ +// } + +// /*计算接收的前8个字节的校验和,并与接收的第9个CRC字节比较。*/ +// UnSwSample_1.bit_data.temperature[1] = scrb[8]; +// if(scrb[8] != MY_OW_CRC8(scrb, 8)) +// { + +// return FALSE; /*CRC验证未通过*/ +// } +//// UnSwSample_1.bit_data.temperature[1] = *iTemp; +// /*将温度测量结果的两个字节合成为16位字。*/ +// *iTemp = ((uword)(scr->T_msb) << 8) | scr->T_lsb; +// +// return TRUE; +//} + + + +/** + * @brief 启动温度测量并读温 + * @param 无 + * @retval 状态 +*/ + +//BOOL GetTemp(void) +//{ +// static uword intTemp = 0;//定义为静态变量,否则会出现值自己变化 +// float fTemp; +// int signedInt_f_tem = 0; +////--------------------------------------- +// intTemp = 0; +// if(ConvertTemp() == FALSE) return FALSE; +// Delay_us(6000); +// ReadTempWaiting(&intTemp); + +// signedInt_f_tem = (int)intTemp; +// +// fTemp = ( (float)(signedInt_f_tem)/256.0 ) + 40.0; +// +// +//// fTemp = M601_OutputtoTemp(signedInt_f_tem); +//// 将浮点数转换为有符号整型 +// signedInt_f_tem = (int)(fTemp*10); +//// 温度 有符号整型转成无符号整形 +// UnSwSample_1.bit_data.temperature[0] = signedInt_f_tem; +// return TRUE; +//} +/**----------------------------------------------------------------------- + * @brief 主机从芯片读取两个bit(读取顺序:低位->高位) + * @param 无 + * @retval 读取到的两个bit数据 +-------------------------------------------------------------------------*/ +unsigned char OW_Read2Bits(void) +{ + unsigned char i, dq, owdata; + owdata = 0; + + for (i = 0; i < 2; i++) + { + dq = read_bit(); + owdata = (owdata) | (dq << i); + } + return owdata; +} + + +// 搜索算法 +/** + * @brief 搜索总线上接入的所有芯片的ROM ID + * @param 存有ROM ID的二维数组 + * @retval 搜索到的M601的个数 +*/ +int Search_ROM(unsigned char(*romID)[8]) +{ + unsigned char k, l = 0, ConflictBit, m, n; + unsigned char BUFFER[MAXNUM]={0}; + unsigned char ss[64]; + unsigned char s = 0; + int num = 0; + do + { + if (OW_ResetPresence() == 0)//检查总线上从机是否存在 + { + return 0; + } + OW_WriteByte(0xF0);//搜索 ROM 序列号指令 + for (m = 0; m < 8; m++) + { + for (n = 0; n < 8; n++) + { + k = OW_Read2Bits(); //主机从 DQ 总线上读两位数据 + k = k & 0x03; + s = s >> 1; + + if (k == 0x02) + { //此时读到总线上当前数据位为 0 + write_bit(0); //主机写 0, 使总线上数据位为 0 的设备响应 + ss[(m * 8 + n)] = 0; + } + else if (k == 0x01) + { //此时读到总线上当前数据位为 1 + s = s | 0x80; + write_bit(1); //主机写 1, 使总线上数据位为 1 的设备响应 + ss[(m * 8 + n)] = 1; + } + else if (k == 0x00) + {//如果读到 00, 则此位数据有冲突,需选择 + ConflictBit = m * 8 + n + 1; + if (ConflictBit > BUFFER[l]) + { //凡遇到新的差异位,选择 0 + write_bit(0); + ss[(m * 8 + n)] = 0; + BUFFER[++l] = ConflictBit; + } + else if (ConflictBit < BUFFER[l]) + {//凡上次遍历时最后一个走 0 的差异位之前的差异位仍按上次遍历的老路走 + s = s | ((ss[(m * 8 + n)] & 0x01) << 7); + write_bit(ss[(m * 8 + n)]); + } + else if (ConflictBit == BUFFER[l]) + { //凡上次遍历时最后一个走 0 的差异位本次应走 1 + s = s | 0x80; + write_bit(1); + ss[(m * 8 + n)] = 1; + l = l - 1; + } + } + else + { //如果读到 11,说明总线上不存在设备 + return num; //搜索完成 + } + } + romID[num][m] = s; + s = 0; + } + num = num + 1; + } while (BUFFER[l] != 0 && (num < MAXNUM)); + return num; //返回搜索到的 M601 个数 +} + +/** + * @brief 读芯片寄存器的暂存器组 + * @param scr:字节数组指针, 长度为 @sizeof(M601_SCRATCHPAD_READ) + * @param j :search到的芯片的序号,如总线上只有一颗芯片,j赋值0 + * @retval 读状态 +*/ +BOOL M601_ReadScratchpad(unsigned char* scr, unsigned char j) +{ + unsigned char i, k; + + /*size < sizeof(M601_SCRATCHPAD_READ)*/ + if (OW_ResetPresence() == FALSE) + { + return FALSE; + } + +//#ifdef SingleIC +// OW_WriteByte(SKIP_ROM); + +//#else + OW_WriteByte(MATCH_ROM); + for (k = 0; k < 8; k++) + { + OW_WriteByte(romid[j][k]); + } +//#endif + OW_WriteByte(READ_SCRATCHPAD); + + for (i = 0; i < sizeof(M601_SCRATCHPAD_READ); i++) + { + *scr++ = OW_ReadByte(); + } + return TRUE; +} + + +/** + * @brief 等待转换结束后读测量结果。和@ConvertTemp联合使用 + * @param iTemp:返回的16位温度测量结果 + * @param j :search到的芯片的序号,如总线上只有一颗芯片,j赋值0 + * @retval 读状态 +*/ +BOOL ReadTempWaiting(unsigned short* iTemp, unsigned char j) +{ + unsigned char scrb[sizeof(M601_SCRATCHPAD_READ)]; + M601_SCRATCHPAD_READ* scr = (M601_SCRATCHPAD_READ*)scrb; + + /*读9个字节。前两个是温度转换结果,最后字节是前8个的校验和--CRC。*/ + if (M601_ReadScratchpad(scrb, j) == 0) + { + return FALSE; /*读寄存器失败*/ + } + + /*计算接收的前8个字节的校验和,并与接收的第9个CRC字节比较。*/ + if (scrb[8] != MY_OW_CRC8(scrb, 8)) + { + return FALSE; /*CRC验证未通过*/ + } + + /*将温度测量结果的两个字节合成为16位字。*/ + *iTemp = (unsigned short)scr->T_msb << 8 | scr->T_lsb; + + return TRUE; +} +/** + * @brief 测温读温 + * @param 无 + * @retval 状态 +*/ +BOOL GetTemp(void) +{ + float fTemp; + static unsigned int iTemp[MAXNUM]; + int i; + int signedInt_f_tem = 0; +//---------------------------------------------------- +// memset(romid, 0, sizeof(romid));//清零 + + /*总线上所有芯片一起测温*/ + if(ConvertTemp() == FALSE) return FALSE; + Delay_us(6500); + + + for (i = 0; i < RomNum; i++) //遍历所有芯片 + { + iTemp[i] = 0; + /*读温*/ + ReadTempWaiting(&iTemp[i], i); + + fTemp = M601_OutputtoTemp((int)iTemp[i]); //温度输出的浮点数 + + // 将浮点数转换为有符号整型 + signedInt_f_tem = (int)(fTemp*10); + // 温度 有符号整型转成无符号整形 + UnSwSample_1.bit_data.temperature[i] = (unsigned int)signedInt_f_tem; + } + return TRUE; +} diff --git a/temperature.h b/temperature.h new file mode 100644 index 0000000..6722106 --- /dev/null +++ b/temperature.h @@ -0,0 +1,164 @@ +#ifndef _TEMPERATURE_H_ +#define _TEMPERATURE_H_ + +#include "MAIN.H" + + +#define DQ P3_5 + +///*Bit definition of config register*/ +#define CFG_CLKSTRETCH_Mask 0x20 +#define CFG_MPS_Mask 0x1C +#define CFG_Repeatbility_Mask 0x03 + +#define CFG_ClkStreatch_Disable (0x00 << 5) +#define CFG_ClkStreatch_Enable (0x01 << 5) + +#define CFG_MPS_Single 0x00 +#define CFG_MPS_Half 0x04 +#define CFG_MPS_1 0x08 +#define CFG_MPS_2 0x0C +#define CFG_MPS_4 0x10 +#define CFG_MPS_10 0x14 + +#define CFG_Repeatbility_Low 0x00 +#define CFG_Repeatbility_Medium 0x01 +#define CFG_Repeatbility_High 0x02 + + +#define MAXNUM 5 /*总线级联最大芯片数量*/ + +typedef enum { + FALSE = 0, + TRUE = !FALSE +} BOOL; + + +typedef struct +{ + char Tha_set_lsb; + char Tla_set_lsb; + ubyte Cfg; /*系统配置寄存器, RW*/ +} M601_SCRATCHPAD_WRITE; + + +/* M601/01 ow Commands-------------------------------------------------------*/ +typedef enum +{ + //ROM command + SKIP_ROM = 0xcc, + READ_ROM = 0x33, + MATCH_ROM = 0x55, + SEARCH_ROM = 0xf0, + ALARM_SEARCH = 0xec, + //Function command + CONVERT_T = 0x44, + READ_SCRATCHPAD = 0xbe, + WRITE_SCRATCHPAD = 0x4e, +} M601_OW_CMD; + + + + +/****************** Scratchpad/SRAM ******************/ +/*SRAM scratchpad*/ +typedef struct +{ + ubyte T_lsb; /*The LSB of 温度结果, RO*/ + ubyte T_msb; /*The MSB of 温度结果, RO*/ + ubyte C1_lsb; /*The LSB of 电容通道C1, RO*/ + ubyte C1_msb; /*The MSB of 电容通道C1, Ro*/ + ubyte Tha_set_lsb; + ubyte Tla_set_lsb; + ubyte Cfg; /*系统配置寄存器, RW*/ + ubyte Status; /*系统状态寄存器, RO*/ + ubyte crc_scr; /*CRC for byte0-7, RO*/ +} M601_SCRATCHPAD_READ; + + + + + +//20250116 增加温度采集字节 +typedef struct _StrSwSample +{ + unsigned int emergency_stop_switch : 1; // 通道1,急停开关 + unsigned int High_voltage_switch : 1; // 通道2,高压开关 + unsigned int CH03 : 1; // 通道3 + unsigned int CH04 : 1; // 通道4 + unsigned int CH05 : 1; // 通道5 + unsigned int CH06 : 1; // 通道6 + unsigned int CH07 : 1; // 通道7 + unsigned int CH08 : 1; // 通道8 + unsigned int CH09 : 1; // 通道9 + unsigned int CH10 : 1; // 通道10 + unsigned int CH11 : 1; // 通道11 + unsigned int CH12 : 1; // 通道12 + unsigned int CH13 : 1; // 通道13 + unsigned int CH14 : 1; // 通道14 + unsigned int CH15 : 1; // 通道15 + unsigned int CH16 : 1; // 通道16 + unsigned int CH17 : 1; // 通道17 + unsigned int CH18 : 1; // 通道18 + unsigned int CH19 : 1; // 通道19 + unsigned int CH20 : 1; // 通道20 + unsigned int CH21 : 1; // 通道21 + unsigned int CH22 : 1; // 通道22 + unsigned int CH23 : 1; // 通道23 + unsigned int CH24 : 1; // 通道24 + unsigned int CH25 : 1; // 通道25 + unsigned int CH26 : 1; // 通道26 + unsigned int CH27 : 1; // 通道27 + unsigned int CH28 : 1; // 通道28 + unsigned int CH29 : 1; // 通道29 + unsigned int CH30 : 1; // 通道30 + unsigned int CH31 : 1; // 通道31 + unsigned int CH32 : 1; // 通道32 + +// unsigned int CH33 : 1; // 通道33 +// unsigned int CH34 : 1; // 通道34 +// unsigned int CH35 : 1; // 通道35 +// unsigned int CH36 : 1; // 通道36 +// unsigned int CH37 : 1; // 通道37 +// unsigned int CH38 : 1; // 通道38 +// unsigned int CH39 : 1; // 通道39 +// unsigned int CH40 : 1; // 通道40 +// unsigned int CH41 : 1; // 通道41 +// unsigned int CH42 : 1; // 通道42 +// unsigned int CH43 : 1; // 通道43 +// unsigned int CH44 : 1; // 通道44 +// unsigned int reserve : 4; + + unsigned int temperature[2]; // 温度 + +} StrSwSample; + +typedef union _UnSwSample +{ + StrSwSample bit_data; // 使用定义的结构体变量名 + unsigned char arr[sizeof(StrSwSample)]; // 通过结构体类型确定大小 +} UnSwSample; + + + + +extern UnSwSample UnSwSample_1 ; + + + +BOOL GetTemp(void); +BOOL SetConfig(ubyte mps, ubyte repeatability); + + +int Search_ROM(unsigned char(*romID)[8]); +extern unsigned char romid[MAXNUM][8]; +extern int RomNum; + + + + + + + + +#endif // _TEMPERATURE_H_