C51 COMPILER V9.59.0.0 SC92F_ADC 01/18/2024 10:03:13 PAGE 1 C51 COMPILER V9.59.0.0, COMPILATION OF MODULE SC92F_ADC OBJECT MODULE PLACED IN ..\Output\sc92f_adc.obj COMPILER INVOKED BY: D:\Keil_v5\C51\BIN\C51.EXE ..\FWLib\SC92F_Lib\src\sc92f_adc.c LARGE OBJECTADVANCED OPTIMIZE(8,SIZE) - BROWSE INCDIR(..\FWLib\SC92F_Lib\inc;..\User;..\Apps;..\Apps;..\User) DEFINE(SC92F836xB) DEBUG PRINT(..\List\sc92f_adc. -lst) OBJECT(..\Output\sc92f_adc.obj) line level source 1 //************************************************************ 2 // Copyright (c) 深圳市赛元微电子有限公司 3 // 文件名称: sc92f_adc.c 4 // 作者: 赛元应用团队 5 // 模块功能: ADC固件库函数C文件 6 // 最后更正日期: 2022年3月23日 7 // 版本: V1.10005 8 // 说明: 9 //************************************************************* 10 11 /* 头文件引用 */ 12 #include "sc92f_adc.h" 13 14 #if !defined(SC92F827X) && !defined(SC92F837X) 15 /************************************************** 16 *函数名称:void ADC_DeInit(void) 17 *函数功能:ADC相关寄存器复位至缺省值 18 *入口参数:void 19 *出口参数:void 20 **************************************************/ 21 void ADC_DeInit(void) 22 { 23 1 ADCCON = 0x00; 24 1 ADCCFG0 = 0X00; 25 1 ADCCFG1 = 0X00; 26 1 #if defined(SC92F854x) || defined(SC92F754x) || defined(SC92F844xB) || defined(SC92F744xB) || defined(SC92 -F84Ax_2) || defined(SC92F74Ax_2)\ 27 1 || defined(SC92F846xB) || defined(SC92F746xB) || defined(SC92F836xB) || defined(SC92F736xB) || defined(SC -92F84Ax) || defined(SC92F74Ax)\ 28 1 || defined(SC92F83Ax) || defined(SC92F73Ax) || defined(SC92F848x) || defined(SC92F748x) || defined (SC92F -859x) || defined (SC92F759x)\ 29 1 || defined (SC92L853x) || defined (SC92L753x) 30 1 ADCCFG2 = 0X00; 31 1 #endif 32 1 ADCVL = 0X00; 33 1 ADCVH = 0X00; 34 1 EADC = 0; 35 1 IPADC = 0; 36 1 } 37 38 /************************************************** 39 *函数名称:void ADC_Init(ADC_PresSel_TypeDef ADC_PrescalerSelection, ADC_Cycle_TypeDef ADC_Cycle) 40 *函数功能:ADC初始化配置函数 41 *入口参数: 42 ADC_PresSel_TypeDef:ADC_PrescalerSelection:预分频选择 43 ADC_Cycle_TypeDef:ADC_Cycle:采样时钟周期选择 44 *出口参数:void 45 **************************************************/ 46 #if defined(SC92F854x) || defined(SC92F754x) || defined(SC92F844xB) || defined(SC92F744xB) || defined(SC92 -F84Ax_2) || defined(SC92F74Ax_2)\ 47 || defined(SC92F846xB) || defined(SC92F746xB) || defined(SC92F836xB) || defined(SC92F736xB) || defined(SC -92F84Ax) || defined(SC92F74Ax)\ 48 || defined(SC92F83Ax) || defined(SC92F73Ax) || defined(SC92FWxx) || defined(SC92F848x) || defined(SC92F74 C51 COMPILER V9.59.0.0 SC92F_ADC 01/18/2024 10:03:13 PAGE 2 -8x)\ 49 || defined (SC92F859x) || defined (SC92F759x) 50 void ADC_Init(ADC_PresSel_TypeDef ADC_PrescalerSelection, 51 ADC_Cycle_TypeDef ADC_Cycle) 52 { 53 1 /* 配置ADC时钟分频和采样周期 */ 54 1 ADCCFG2 = ADC_PrescalerSelection | ADC_Cycle; 55 1 } 56 #elif defined(SC92F7003) || defined(SC92F8003) || defined(SC92F740x) void ADC_Init(ADC_PresSel_TypeDef ADC_PrescalerSelection, ADC_Cycle_TypeDef ADC_Cycle) { /* 配置ADC时钟分频和采样周期 */ ADCCFG1 = ADC_PrescalerSelection | ADC_Cycle; } #elif defined(SC92F742x) || defined(SC92F725X) || defined(SC92F735X) || defined(SC92F730x) || defined(SC92 -F732X) || defined(SC92F7490)\ || defined(SC93F833x) || defined(SC93F843x) || defined(SC93F743x) void ADC_Init(ADC_PresSel_TypeDef ADC_PrescalerSelection, ADC_Cycle_TypeDef ADC_Cycle) { ADC_Cycle = 0; //SC92F742x无此功能 /* 配置ADC时钟分频 */ ADCCON = (ADCCON & 0xDF) | ADC_PrescalerSelection; } #elif defined (SC92L853x) || defined (SC92L753x) void ADC_Init(ADC_PresSel_TypeDef ADC_PrescalerSelection, ADC_Cycle_TypeDef ADC_Cycle) { ADC_Cycle = 0x00; //该入参在92L系列无效 /* 配置ADC时钟分频 */ ADCCFG2 = ADC_PrescalerSelection; } #endif 80 81 /************************************************** 82 *函数名称:void ADC_ChannelConfig(ADC_Channel_TypeDef ADC_Channel, FunctionalState NewState) 83 *函数功能:ADC输入口配置函数,并且使能相关功能 84 *入口参数: 85 ADC_Channel_TypeDef:ADC_Channel:ADC输入口选择 86 FunctionalState:NewState:ADCx使能/关闭选择 87 *出口参数:void 88 **************************************************/ 89 #if defined(SC92F854x) || defined(SC92F754x) || defined(SC92F844xB) || defined(SC92F744xB) || defined(SC92 -F84Ax_2) || defined(SC92F74Ax_2)\ 90 || defined(SC92F846xB) || defined(SC92F746xB) || defined(SC92F836xB) || defined(SC92F736xB) || defined(S -C92F84Ax) || defined(SC92F74Ax)\ 91 || defined(SC92F83Ax) || defined(SC92F73Ax) || defined(SC92FWxx) || defined(SC92F848x) || defined(SC92F7 -48x)\ 92 || defined(SC92F859x) || defined(SC92F759x) || defined (SC92L853x) || defined (SC92L753x) 93 void ADC_ChannelConfig(ADC_Channel_TypeDef ADC_Channel, FunctionalState NewState) 94 { 95 1 uint16_t TempReg; 96 1 /* 配置ADC转换通道 */ 97 1 ADCCON = (ADCCON & 0XE0) | ADC_Channel; 98 1 99 1 /* 配置ADC外部采样通道 */ 100 1 if (ADC_Channel < ADC_CHANNEL_VDD_D4) //内部采样通道无需配置 101 1 { 102 2 TempReg = (0x0001 << ADC_Channel); 103 2 if (NewState == DISABLE)// 使能ADC采样通道 104 2 { 105 3 ADCCFG0 &= (~(uint8_t)TempReg); C51 COMPILER V9.59.0.0 SC92F_ADC 01/18/2024 10:03:13 PAGE 3 106 3 ADCCFG1 &= (~(uint8_t)(TempReg >> 8)); 107 3 } 108 2 else // 失能ADC采样通道 109 2 { 110 3 ADCCFG0 |= ((uint8_t)TempReg); 111 3 ADCCFG1 |= ((uint8_t)(TempReg >> 8)); 112 3 } 113 2 } 114 1 } 115 #elif defined(SC92F7003) || defined(SC92F8003) || defined(SC92F740x) || defined(SC92F7490) void ADC_ChannelConfig(ADC_Channel_TypeDef ADC_Channel, FunctionalState NewState) { uint8_t TempReg; /* 配置ADC转换通道 */ ADCCON = (ADCCON & 0xE0) | ADC_Channel; /* 配置ADC采样通道 */ if (ADC_Channel < ADC_CHANNEL_VDD_D4) //内部采样通道无需配置 { TempReg = (0x01 << ADC_Channel); if (ADC_Channel < ADC_CHANNEL_VDD_D4) { if (NewState == DISABLE) //失能ADC采样通道 { ADCCFG0 &= (~TempReg); } else //使能ADC采样通道 { ADCCFG0 |= TempReg; } } } } #elif defined(SC92F742x) || defined(SC92F730x) || defined(SC92F725X) || defined(SC92F735X) || defined(SC92 -F732X) void ADC_ChannelConfig(ADC_Channel_TypeDef ADC_Channel, FunctionalState NewState) { uint16_t TempReg; /* 配置ADC转换通道 */ ADCCON = (ADCCON & 0xF0) | ADC_Channel; /* 配置ADC采样通道 */ if (ADC_Channel < ADC_CHANNEL_VDD_D4) //内部采样通道无需配置 { TempReg = (0x0001 << ADC_Channel); if (NewState == DISABLE) { ADCCFG0 &= (~(uint8_t)TempReg); ADCCFG1 &= (~(uint8_t)(TempReg >> 8)); } else { ADCCFG0 |= ((uint8_t)TempReg); ADCCFG1 |= ((uint8_t)(TempReg >> 8)); } } } #elif defined(SC93F833x) || defined(SC93F843x) || defined(SC93F743x) void ADC_ChannelConfig(ADC_Channel_TypeDef ADC_Channel, FunctionalState NewState) { uint16_t TempReg; /* 配置ADC转换通道 */ C51 COMPILER V9.59.0.0 SC92F_ADC 01/18/2024 10:03:13 PAGE 4 ADCCON = (ADCCON & 0xF0) | ADC_Channel; /* 配置ADC采样通道 */ if (ADC_Channel < ADC_CHANNEL_Temp) //配置外部采样通道 { TempReg = (0x0001 << ADC_Channel); if (NewState == DISABLE) { ADCCFG0 &= (~(uint8_t)TempReg); ADCCFG1 &= (~(uint8_t)(TempReg >> 8)); } else { ADCCFG0 |= ((uint8_t)TempReg); ADCCFG1 |= ((uint8_t)(TempReg >> 8)); } } else if (ADC_Channel == ADC_CHANNEL_Temp) //内部温度采样通道 { if (NewState == DISABLE) { TSCFG &= 0X7F; } else { /* ADC参考电压选择内部2.4V作为参考 */ OPINX = 0xC2; OPREG = OPREG & 0X7F | 0x80; TSCFG |= 0x80; } } else if (ADC_Channel == ADC_CHANNEL_9_PGA) //可变增益放大器采样通道 { unsigned char code *IFBAddr = 0x3D; if (NewState == DISABLE) { ADCCFG1 &= (~(uint8_t)0x02); //关闭通道9 PGACON &= 0x7F; //使能PGA } /* 读取PGA内部出厂校准值 */ else { ADCCFG1 |= ((uint8_t)0x02); //PGA输入通道与通道9复用,使能通道9 IAPADE = 0x01; //指针指向 IFB 区 PGACFG = *(IFBAddr); //读取校准值 IAPADE = 0x00; //指针指向 ROM 区 PGACON |= 0x80; //使能PGA } } } #endif 221 222 /************************************************** 223 *函数名称:void ADC_EAINConfig(uint16_t ADC_Channel, FunctionalState NewState) 224 *函数功能:将对应的ADC输入口设置为模拟输入模式 225 *入口参数: 226 ADC_EAIN_TypeDef:ADC_EAIN_Select:选择需要设置的ADC口 227 FunctionalState:NewState:ADC通道使能/关闭选择 228 *出口参数:void C51 COMPILER V9.59.0.0 SC92F_ADC 01/18/2024 10:03:13 PAGE 5 229 **************************************************/ 230 void ADC_EAINConfig(uint16_t ADC_EAIN_Select, 231 FunctionalState NewState) 232 { 233 1 if (NewState == DISABLE) 234 1 { 235 2 ADCCFG0 &= (~(uint8_t)ADC_EAIN_Select); 236 2 #if defined (SC92F854x) || defined (SC92F754x) || defined (SC92F844xB) || defined (SC92F744xB) || defined - (SC92F84Ax_2) || defined (SC92F74Ax_2)\ 237 2 || defined (SC92F846xB) || defined (SC92F746xB) || defined (SC92F836xB) || defined (SC92F736xB)||defined - (SC92F84Ax) || defined (SC92F74Ax)\ 238 2 || defined(SC92F83Ax) || defined(SC92F73Ax) || defined(SC92F848x) || defined(SC92F748x) || defined(SC92F -859x) || defined (SC92F759x)\ 239 2 || defined (SC92L853x) || defined (SC92L753x) 240 2 ADCCFG1 &= (~(uint8_t)(ADC_EAIN_Select >> 8)); 241 2 #endif 242 2 } 243 1 else 244 1 { 245 2 ADCCFG0 |= ((uint8_t)ADC_EAIN_Select); 246 2 #if defined (SC92F854x) || defined (SC92F754x) || defined (SC92F844xB) || defined (SC92F744xB)||defined ( -SC92F84Ax_2) || defined (SC92F74Ax_2)\ 247 2 || defined (SC92F846xB) || defined (SC92F746xB) || defined (SC92F836xB) || defined (SC92F736xB) || defin -ed (SC92F84Ax) || defined (SC92F74Ax)\ 248 2 || defined(SC92F83Ax) || defined(SC92F73Ax) || defined(SC92F848x) || defined(SC92F748x) || defined(SC92F -859x) || defined (SC92F759x)\ 249 2 || defined (SC92L853x) || defined (SC92L753x) 250 2 ADCCFG1 |= ((uint8_t)(ADC_EAIN_Select >> 8)); 251 2 #endif 252 2 } 253 1 } 254 /***************************************************** 255 *函数名称:void ADC_Cmd(FunctionalState NewState) 256 *函数功能:ADC功能开关函数 257 *入口参数: 258 FunctionalState:NewState:功能启动/关闭选择 259 *出口参数:void 260 *****************************************************/ 261 void ADC_Cmd(FunctionalState NewState) 262 { 263 1 if (NewState == DISABLE) 264 1 { 265 2 ADCCON &= 0X7F; 266 2 } 267 1 else 268 1 { 269 2 ADCCON |= 0x80; 270 2 } 271 1 } 272 273 /***************************************************** 274 *函数名称:uint16_t ADC_GetConversionValue(void) 275 *函数功能:获得一次AD转换数据 276 *入口参数:void 277 *出口参数:uint16_t 278 *****************************************************/ 279 unsigned int ADC_GetConversionValue(void) 280 { 281 1 return ((ADCVH << 4) + (ADCVL >> 4)); 282 1 } 283 284 /***************************************************** C51 COMPILER V9.59.0.0 SC92F_ADC 01/18/2024 10:03:13 PAGE 6 285 *函数名称:FlagStatus ADC_GetFlagStatus(void) 286 *函数功能:获得ADC中断标志状态 287 *入口参数:void 288 *出口参数: 289 FlagStatus:ADC中断标志状态 290 *****************************************************/ 291 FlagStatus ADC_GetFlagStatus(void) 292 { 293 1 #if defined (SC92F854x) || defined (SC92F754x) ||defined (SC92F844xB) || defined (SC92F744xB)||defined ( -SC92F84Ax_2) || defined (SC92F74Ax_2)\ 294 1 || defined (SC92F846xB) || defined (SC92F746xB) || defined (SC92F836xB) || defined (SC92F736xB)||defined - (SC92F84Ax) || defined (SC92F74Ax)\ 295 1 || defined (SC92F83Ax) || defined (SC92F73Ax) || defined (SC92F7003) || defined (SC92F8003) || defined -(SC92F740x) || defined (SC92FWxx)\ 296 1 || defined(SC92F848x) || defined(SC92F748x) || defined(SC92F859x) || defined (SC92F759x) || defined (SC92 -L853x) || defined (SC92L753x) 297 1 return (bool)(ADCCON & 0x20); 298 1 #elif defined(SC92F742x) || defined(SC92F730x) || defined(SC92F725X) || defined(SC92F735X) || defined(SC92 -F732X) || defined(SC92F7490) || defined(SC93F833x) || defined(SC93F843x) || defined(SC93F743x) return (bool)(ADCCON & 0x10); #endif 301 1 } 302 303 /***************************************************** 304 *函数名称:void ADC_ClearFlag(void) 305 *函数功能:清除ADC中断标志状态 306 *入口参数:void 307 *出口参数:void 308 *****************************************************/ 309 void ADC_ClearFlag(void) 310 { 311 1 #if defined(SC92F854x) || defined(SC92F754x) || defined(SC92F844xB) || defined(SC92F744xB) || defined(SC92 -F84Ax_2) || defined(SC92F74Ax_2)\ 312 1 || defined(SC92F846xB) || defined(SC92F746xB) || defined(SC92F836xB) || defined(SC92F736xB) || defined(S -C92F84Ax) || defined(SC92F74Ax)\ 313 1 || defined(SC92F83Ax) || defined(SC92F73Ax) || defined(SC92F8003) || defined(SC92F740x) || defined(SC92F -848x) || defined(SC92F748x)\ 314 1 || defined(SC92F859x) || defined(SC92F759x) || defined (SC92L853x) || defined (SC92L753x) 315 1 ADCCON &= 0xdf; 316 1 #endif 317 1 #if defined(SC92F742x) || defined(SC92F730x) || defined(SC92F725X) || defined(SC92F735X) || defined(SC92F7 -32X) || defined(SC92F7490) || defined(SC93F833x) || defined(SC93F843x) || defined(SC93F743x) ADCCON &= 0xef; #endif 320 1 } 321 322 #if defined(SC93F833x) || defined(SC93F843x) || defined(SC93F743x) unsigned int ADC_TS_StandardData = 0x8000; /***************************************************** *函数名称:void ADC_TSCmd(PriorityStatus NewState) *函数功能:ADC 温度传感器功能开关函数 *入口参数: FunctionalState:NewState:功能启动/关闭选择 *出口参数:void *****************************************************/ void ADC_TSCmd(FunctionalState NewState) { if (NewState == DISABLE) { TSCFG &= 0X7F; } C51 COMPILER V9.59.0.0 SC92F_ADC 01/18/2024 10:03:13 PAGE 7 else { TSCFG |= 0X80; } } /***************************************************** *函数名称:void ADC_CHOPConfig(PriorityStatus NewState) *函数功能:拉高或者拉低抵消offset的应用控制位 *入口参数: PriorityStatus:NewState:温度传感器高/低选择 *出口参数:void *****************************************************/ void ADC_CHOPConfig(PriorityStatus NewState) { if (NewState == LOW) { TSCFG &= 0XFE; } else { TSCFG |= 0x01; } } /***************************************************** *函数名称:void ADC_CHOPConfig(PriorityStatus NewState) *函数功能:获取出厂时ADC 25度时的转换值 *入口参数:void *出口参数:void *****************************************************/ uint16_t ADC_Get_TS_StandardData(void) { unsigned int code *IFBAddr = 0x3E; IAPADE = 0x01; //指针指向 IFB 区 ADC_TS_StandardData = *(IFBAddr); IAPADE = 0x00; //指针指向 ROM 区 return ADC_TS_StandardData; } /***************************************************** *函数名称:void ADC_GetTSValue(void) *函数功能:直接获取float类型温度值,获取温度时会关闭中断 *入口参数:void *出口参数: float:温度值 *****************************************************/ float ADC_GetTSValue(void) { unsigned char EADC_Flag = EADC; //获取EA标志位状态 unsigned int ADC_Value1 = 0, ADC_Value2 = 0, ADC_Value = 0; unsigned int code *IFBAddr = 0x3E; ADC_Get_TS_StandardData(); disableInterrupts(); //关闭中断 ADC_CHOPConfig(LOW); //拉低抵消offset的应用控制位 ADC_StartConversion(); //开始AD转换 while(!ADC_GetFlagStatus()); //等待转换完成 ADC_ClearFlag(); //清除转换标志位 ADC_Value1 = ADC_GetConversionValue(); //获取第一次AD的转换值 ADC_CHOPConfig(HIGH); //拉高抵消offset的应用控制位 ADC_StartConversion(); //开始AD转换 C51 COMPILER V9.59.0.0 SC92F_ADC 01/18/2024 10:03:13 PAGE 8 while(!ADC_GetFlagStatus()); //等待转换完成 ADC_ClearFlag(); //清除转换标志位 ADC_Value2 = ADC_GetConversionValue(); //获取第二次AD的转换值 ADC_Value = (ADC_Value1 + ADC_Value2) / 2; //获取两次AD采样的平均值 if (EADC_Flag) //还原加入运算前的EA标志位 { enableInterrupts(); } return (25 + ((float)ADC_Value - (float)ADC_TS_StandardData) / 8); } /***************************************************** *函数名称:ADC_PGAConfig(ADC_PGACOM_TypeDef ADC_PGACOM,ADC_PGAGAN_TypeDef ADC_PGAGAN,ADC_PGAIPT_TypeDef ADC -_PGAIPT) *函数功能:PGA相关配置 *入口参数: ADC_PGACOM_TypeDef:ADC_PGACOM:PGA共模电压选择 ADC_PGAGAN_TypeDef:ADC_PGAGAN:PGA增益放大倍数 ADC_PGAIPT_TypeDef:ADC_PGAIPT:PGA同相/反相选择 *出口参数:void *****************************************************/ void ADC_PGAConfig(ADC_PGACOM_TypeDef ADC_PGACOM, ADC_PGAGAN_TypeDef ADC_PGAGAN, ADC_PGAIPT_TypeDef ADC_PG -AIPT) { PGACON &= 0x8F; PGACON |= (ADC_PGACOM | ADC_PGAGAN | ADC_PGAIPT); } /***************************************************** *函数名称:void ADC_PGACmd(PriorityStatus NewState) *函数功能:ADC PGA功能开关函数 *入口参数: FunctionalState:NewState:功能启动/关闭选择 *出口参数:void *****************************************************/ void ADC_PGACmd(PriorityStatus NewState) { if (NewState == LOW) { PGACON &= 0XFE; } else { PGACON |= 0x01; } } #endif 446 447 448 /***************************************************** 449 *函数名称:void ADC_VrefConfig(ADC_Vref_TypeDef ADC_Vref) 450 *函数功能:ADC 参考电压选择 451 *入口参数: 452 ADC_Vref_TypeDef:ADC_Vref:选择ADC参考电压 453 *出口参数:void 454 *****************************************************/ 455 void ADC_VrefConfig(ADC_Vref_TypeDef ADC_Vref) 456 { 457 1 OPINX = 0xC2; 458 1 OPREG = OPREG & 0X7F | ADC_Vref; 459 1 } C51 COMPILER V9.59.0.0 SC92F_ADC 01/18/2024 10:03:13 PAGE 9 460 #endif 461 462 /******************* (C) COPYRIGHT 2021 SinOne Microelectronics *****END OF FILE****/ MODULE INFORMATION: STATIC OVERLAYABLE CODE SIZE = 162 ---- CONSTANT SIZE = ---- ---- XDATA SIZE = ---- ---- PDATA SIZE = ---- ---- DATA SIZE = ---- ---- IDATA SIZE = ---- ---- BIT SIZE = ---- ---- EDATA SIZE = ---- ---- HDATA SIZE = ---- ---- XDATA CONST SIZE = ---- ---- FAR CONST SIZE = ---- ---- END OF MODULE INFORMATION. C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)