#include "CS1237_LEFTUP.h" #include "Debug.h" #include "bsp.h" #include "main.h" #include "Algorithm.h" #define CS1237_DOUT_OUT() PORT_OE(LEFTUP_CS1237_DOUT_PORTx, LEFTUP_CS1237_DOUT_PINx, Enable) #define CS1237_DOUT_IN() PORT_OE(LEFTUP_CS1237_DOUT_PORTx, LEFTUP_CS1237_DOUT_PINx, Disable) #define CS1237_DOUT_H() SET_LEFTUP_CS1237_DOUT() #define CS1237_DOUT_L() CLR_LEFTUP_CS1237_DOUT() #define CS1237_DOUT_GET() GET_LEFTUP_CS1237_DOUT() #define CS1237_SCLK_H() SET_LEFTUP_CS1237_SCLK() #define CS1237_SCLK_L() CLR_LEFTUP_CS1237_SCLK() #define CS1237_5NS(x) delay_5ns(x) //5ns延时 #define CS1237_1US(x) Ddl_Delay1us(x) //1us延时 #define CS1237_1MS(x) Ddl_Delay1ms(x) //1ms延时 #define CS1237IntEnable() ExtInt10IntEnable() #define CS1237IntDisable() ExtInt10IntDisable() LEFTUP_CS1237Var_t LEFTUP_CS1237Var; static bool InitFlag; static bool CS1237IrqFlag; static bool BuildDelay; static uint8_t CS1237Port; static uint8_t CS1237Hz; static uint8_t CS1237PGA; extern void LEFTUP_CS1237AinADataProcessCallBack(int32_t AD); /** cs1237 时序时钟*/ static void CS1237_Clock(void) { CS1237_SCLK_H(); CS1237_5NS(60); CS1237_SCLK_L(); CS1237_5NS(60); } /** cs1237 休眠*/ static void CS1237_Sleep(void) { CS1237_SCLK_H(); CS1237_1US(200); } /** cs1237 唤醒*/ static void CS1237_WakeUp(void) { CS1237_SCLK_L(); CS1237_1US(20); } /**设置CS1237寄存器*/ static void Set_CS1237_Config(uint8_t ad_reg) { uint16_t bit_cout = 0; uint8_t reg_temp = 0x00; //DOUT由高变低之后开始读取数据 CS1237_DOUT_OUT(); CS1237_DOUT_H(); CS1237_DOUT_IN(); CS1237_SCLK_L(); //时钟拉低 LEFTUP_CS1237Var.CS1237Delay1mSCnt = 300; CS1237IrqFlag = false; while(CS1237IrqFlag == false) //等待芯片准备好 { if(LEFTUP_CS1237Var.CS1237Delay1mSCnt <= 0){ //DBG_LOG("LEFTUP CS1237 Preparation Timeout...\r\n"); return; // 超时退出 } } CS1237IntDisable(); CS1237IrqFlag = false; /* clk1-clk26 写期间不需要操作*/ for (bit_cout = 0; bit_cout < 26; bit_cout++) { CS1237_Clock(); //给一周期时钟 } /* clk27 DOUT输出拉高*/ CS1237_Clock(); //给一周期时钟 CS1237_DOUT_H(); /* clk28 - clk29 发送写寄存器命令字 */ CS1237_Clock(); //给一周期时钟 CS1237_Clock(); //给一周期时钟 /* clk30 - clk36 发送写寄存器命令字 */ CS1237_DOUT_OUT(); reg_temp = WRITE_CONFIG_CMD << 1; //命令长度为 7bits (写0x65)左移1位 for (bit_cout = 0; bit_cout < 7; bit_cout++) { if (reg_temp & 0x80) //MSB { CS1237_DOUT_H(); } else { CS1237_DOUT_L(); } reg_temp = reg_temp << 1; CS1237_Clock(); } /* clk37写寄存器模式还是输出 */ CS1237_Clock(); /* clk38 ~ clk45 写入寄存器值 */ reg_temp = ad_reg;//要配件的寄存器数值 for (bit_cout = 0; bit_cout < 8; bit_cout++) { if (reg_temp & 0x80) //MSB { CS1237_DOUT_H(); } else { CS1237_DOUT_L(); } reg_temp = reg_temp << 1; CS1237_Clock(); } /* 8: clk46 */ CS1237_Clock(); CS1237_DOUT_H(); CS1237_DOUT_IN(); CS1237IntEnable(); return ; } /**读CS1237寄存器*/ static int32_t Read_CS1237_Config(void) { uint16_t bit_cout = 0; uint8_t reg_temp = 0x00; //DOUT由高变低之后开始读取数据 CS1237_DOUT_OUT(); CS1237_DOUT_H(); CS1237_DOUT_IN(); CS1237_SCLK_L(); //时钟拉低 LEFTUP_CS1237Var.CS1237Delay1mSCnt = 300; CS1237IrqFlag = false; while(CS1237IrqFlag == false) //等待芯片准备好 { if(LEFTUP_CS1237Var.CS1237Delay1mSCnt <= 0){ //DBG_LOG("LEFTUP CS1237 Preparation Timeout...\r\n"); return 0; // 超时退出 } } CS1237IntDisable(); CS1237IrqFlag = false; /* clk1-clk26 写期间不需要操作*/ for (bit_cout = 0; bit_cout < 26; bit_cout++) { CS1237_Clock(); //给一周期时钟 } /* clk27 DOUT输出拉高*/ CS1237_Clock(); //给一周期时钟 CS1237_DOUT_H(); /* clk28 - clk29 发送写寄存器命令字 */ CS1237_Clock(); //给一周期时钟 CS1237_Clock(); //给一周期时钟 /* clk30 - clk36 发送读寄存器命令字 */ CS1237_DOUT_OUT(); reg_temp = READ_CONFIG_CMD << 1; //命令长度为 7bits (写0x56)左移1位 for (bit_cout = 0; bit_cout < 7; bit_cout++) { if (reg_temp & 0x80) //MSB { CS1237_DOUT_H(); } else { CS1237_DOUT_L(); } reg_temp = reg_temp << 1; CS1237_Clock(); } /* clk37,读寄存器模式改输入 */ CS1237_Clock(); CS1237_DOUT_IN(); for (bit_cout = 0; bit_cout < 8; bit_cout++) { CS1237_SCLK_H(); reg_temp <<= 1; //左移1位准备接受数据 初始默认0 CS1237_5NS(60);//延时300ns if(CS1237_DOUT_GET() == true) //有数值则累加 reg_temp |= 1; CS1237_SCLK_L(); CS1237_5NS(60); } /* 8: clk46 */ CS1237_Clock(); CS1237_DOUT_IN(); CS1237_DOUT_H(); CS1237IntEnable(); return reg_temp ; } /**读取CS1237的AD数*/ static int32_t Read_CS1237_Ad_Data(void) { uint16_t bit_cout = 0; int32_t data_temp = 0; /* clk1 ~ clk24 ADC数据*/ data_temp = 0; for (bit_cout = 0; bit_cout < 24; bit_cout++) { CS1237_SCLK_H(); data_temp <<= 1; //左移1位准备接受数据 初始默认0 CS1237_5NS(60);//延时300ns if(CS1237_DOUT_GET() == true) //有数值则累加 data_temp |= 1; CS1237_SCLK_L(); CS1237_5NS(60); } /* clk25 ~ clk27 */ for (bit_cout = 24; bit_cout < 27; bit_cout++) { CS1237_Clock(); //给一周期时钟 } CS1237_DOUT_H(); CS1237_SCLK_L(); if(data_temp > 0x7FFFFF) //取24位 { data_temp |= 0xFF000000; } return data_temp; } void LEFTUP_CS1237_IrqCallBack(void) { CS1237IrqFlag = true; } void LEFTUP_CS1237_Init(void) { CS1237IrqFlag = false; BuildDelay = false; LEFTUP_CS1237Var.AinA_AD = 0; LEFTUP_CS1237Var.Temp_AD = 0; LEFTUP_CS1237Var.Jump_AD = 0; CS1237IntEnable(); CS1237Port = CH_SEL_A; CS1237Hz = SPEED_SEL_640Hz; CS1237PGA = PGA_SEL_128; uint8_t read_reg = 0x00; uint8_t set_reg = REFO_ON | CS1237Hz | CS1237PGA | CS1237Port; CS1237_1MS(20); Set_CS1237_Config(set_reg); CS1237_1MS(20); read_reg = Read_CS1237_Config(); CS1237_1MS(20); if(read_reg != set_reg){ DBG_LOG("LEFTUP CS1237 Init ERR...\r\n"); //DBG_LOG("set_reg = %02X\tread_reg = %02X\r\n",set_reg,read_reg); InitFlag = true; } else { DBG_LOG("LEFTUP CS1237 Init OK...\r\n"); //DBG_LOG("set_reg = %02X\tread_reg = %02X\r\n",set_reg,read_reg); CS1237Port = read_reg & 0x03; InitFlag = true; } CS1237IntDisable(); } void LEFTUP_CS1237DataLoopCollect(void) { static int32_t ad_array[PACK_NUM]; static uint8_t adcnt; static uint8_t TimeOutmagcnt; switch(LEFTUP_CS1237Var.Status) { case LUCS1237_STATUS_IDLE:{ break;} case LUCS1237_STATUS_START:{ memset(&ad_array, 0x00, sizeof(ad_array)); adcnt = 0; TimeOutmagcnt = 0; memset(&LEFTUP_CS1237Var, NULL, sizeof(LEFTUP_CS1237Var)); if(BuildDelay == true) { BuildDelay = false; if(CS1237Hz == SPEED_SEL_10Hz){ LEFTUP_CS1237Var.CS1237Delay1mSCnt = tCon_10Hz; } if(CS1237Hz == SPEED_SEL_40Hz){ LEFTUP_CS1237Var.CS1237Delay1mSCnt = tCon_40Hz; } if(CS1237Hz == SPEED_SEL_640Hz){ LEFTUP_CS1237Var.CS1237Delay1mSCnt = tCon_640Hz; } if(CS1237Hz == SPEED_SEL6_1280Hz){ LEFTUP_CS1237Var.CS1237Delay1mSCnt = tCon_1280Hz; } LEFTUP_CS1237Var.Status = LUCS1237_STATUS_DELAY; } else { LEFTUP_CS1237Var.Status = LUCS1237_STATUS_READ; } break;} case LUCS1237_STATUS_DELAY:{ if(LEFTUP_CS1237Var.CS1237Delay1mSCnt <= 0){ LEFTUP_CS1237Var.Status = LUCS1237_STATUS_READ; } break;} case LUCS1237_STATUS_READ:{ CS1237IrqFlag = false; LEFTUP_CS1237Var.CS1237Delay1mSCnt = 100; LEFTUP_CS1237Var.Status = LUCS1237_STATUS_WAIT_READ; break;} case LUCS1237_STATUS_WAIT_READ:{ if(LEFTUP_CS1237Var.CS1237Delay1mSCnt <= 0){ LEFTUP_CS1237Var.Status = LUCS1237_STATUS_READ; TimeOutmagcnt++; } if(CS1237IrqFlag == true){ CS1237IrqFlag = false; ad_array[adcnt++] = Read_CS1237_Ad_Data(); LEFTUP_CS1237Var.Status = LUCS1237_STATUS_READ; } if(TimeOutmagcnt >= PACK_NUM){ TimeOutmagcnt = 0; if(adcnt > 0){ if(CS1237Port == CH_SEL_A){ LEFTUP_CS1237Var.AinA_AD = IntFilter_32t(ad_array, adcnt, FILTER_NUM); LEFTUP_CS1237AinADataProcessCallBack(LEFTUP_CS1237Var.AinA_AD); } if(CS1237Port == CH_SEL_TEMP){ LEFTUP_CS1237Var.Temp_AD = IntFilter_32t(ad_array, adcnt, FILTER_NUM); //CS1237TempDataProcessCallBack(LEFTLOW_CS1237Var.Temp_AD); } if(CS1237Port == CH_SEL_JUMP){ LEFTUP_CS1237Var.Jump_AD = IntFilter_32t(ad_array, adcnt, FILTER_NUM); //CS1237JumpDataProcessCallBack(LEFTLOW_CS1237Var.Jump_AD); } LEFTUP_CS1237Var.Status = LUCS1237_STATUS_CH_SEL; } else{ if(CS1237Port == CH_SEL_A){ DBG_LOG("LEFTUPs CS1237 CHA TimeOut...\r\n"); } if(CS1237Port == CH_SEL_TEMP){ DBG_LOG("LEFTUP CS1237 Temp TimeOut...\r\n"); } if(CS1237Port == CH_SEL_JUMP){ DBG_LOG("LEFTUP CS1237 Jump TimeOut...\r\n"); } LEFTUP_CS1237Var.Status = LUCS1237_STATUS_CH_SEL; } } if(adcnt >= PACK_NUM){ if(CS1237Port == CH_SEL_A){ LEFTUP_CS1237Var.AinA_AD = IntFilter_32t(ad_array, adcnt, FILTER_NUM); LEFTUP_CS1237AinADataProcessCallBack(LEFTUP_CS1237Var.AinA_AD); } if(CS1237Port == CH_SEL_TEMP){ LEFTUP_CS1237Var.Temp_AD = IntFilter_32t(ad_array, adcnt, FILTER_NUM); //CS1237TempDataProcessCallBack(LEFTLOW_CS1237Var.Temp_AD); } if(CS1237Port == CH_SEL_JUMP){ LEFTUP_CS1237Var.Jump_AD = IntFilter_32t(ad_array, adcnt, FILTER_NUM); //CS1237JumpDataProcessCallBack(LEFTLOW_CS1237Var.Jump_AD); } LEFTUP_CS1237Var.Status = LUCS1237_STATUS_CH_SEL; } break;} case LUCS1237_STATUS_CH_SEL:{ LEFTUP_CS1237Var.Status = LUCS1237_STATUS_STOP; BuildDelay = false; uint8_t read_reg; if(CS1237Port == CH_SEL_A){ #if(PORT_TEMP == 1) read_reg = Read_CS1237_Config(); Set_CS1237_Config((read_reg & 0xFC) | CH_SEL_TEMP); CS1237Port = CH_SEL_TEMP; BuildDelay = true; break; #endif #if(PORT_JUMP == 1) read_reg = Read_CS1237_Config(); Set_CS1237_Config((read_reg & 0xFC) | CH_SEL_JUMP); CS1237Port = CH_SEL_JUMP; BuildDelay = true; break; #endif } if(CS1237Port == CH_SEL_TEMP){ #if(PORT_JUMP == 1) read_reg = Read_CS1238_Config(); Set_CS1238_Config((read_reg & 0xFC) | CH_SEL_JUMP); CS1238Port = CH_SEL_JUMP; BuildDelay = true; break; #endif #if(PORT_A == 1) read_reg = Read_CS1237_Config(); Set_CS1237_Config((read_reg & 0xFC) | CH_SEL_A); CS1237Port = CH_SEL_A; BuildDelay = true; break; #endif } if(CS1237Port == CH_SEL_JUMP){ #if(PORT_A == 1) read_reg = Read_CS1237_Config(); Set_CS1237_Config((read_reg & 0xFC) | CH_SEL_A); CS1237Port = CH_SEL_A; BuildDelay = true; break; #endif #if(PORT_TEMP == 1) read_reg = Read_CS1237_Config(); Set_CS1237_Config((read_reg & 0xFC) | CH_SEL_TEMP); CS1237Port = CH_SEL_TEMP; BuildDelay = true; break; #endif } break;} case LUCS1237_STATUS_STOP:{ LEFTUP_CS1237Stop(); LEFTUP_CS1237Var.Status = LUCS1237_STATUS_IDLE; //LEFTUP_CS1237Var.Status = LUCS1237_STATUS_START;//持续工作 break;} } } void LEFTUP_CS12371mSRoutine(void) { if(LEFTUP_CS1237Var.CS1237Delay1mSCnt > 0) LEFTUP_CS1237Var.CS1237Delay1mSCnt--; } void LEFTUP_CS1237Start(void) { CS1237_WakeUp(); CS1237_1MS(2); BuildDelay = true; CS1237IntEnable(); if(!InitFlag){ LEFTUP_CS1237_Init(); return; } LEFTUP_CS1237Var.Status = LUCS1237_STATUS_START; } void LEFTUP_CS1237Stop(void) { CS1237IntDisable(); //CS1237_Sleep(); }