V1.1 For EVIC
Dependencies: SDFileSystem max32630fthr USBDevice
Diff: DUT_RegConfig.cpp
- Revision:
- 3:35b05d91568d
- Parent:
- 1:7530b7eb757a
--- a/DUT_RegConfig.cpp Thu May 28 02:32:15 2020 +0000 +++ b/DUT_RegConfig.cpp Mon Jun 22 05:27:48 2020 +0000 @@ -23,10 +23,14 @@ Semaphore chip_int_semph(1); extern DigitalOut xSHUT; extern I2C i2c_v; +extern DigitalOut TRIM_EN; uint16_t histogram_pos_num = 0; uint16_t histogram_per_pos = 0; +uint16_t range_step_num = 0; +uint16_t range_per_step = 0; + extern const uint8_t reg_table[]; extern const uint8_t Firmware_Ranging[]; extern uint8_t _uart_send_pbuff[CMD_BUF_LEN] ; @@ -36,24 +40,42 @@ xSHUT = 0; wait_ms(30); xSHUT = 1; + wait_ms(30); } -void DUT_RegInit(void) +void SetBitThree(uint8_t rco, uint8_t tdc, uint8_t dcr) +{ + WriteOneReg(0x37, rco); + WriteOneReg(0xE4, tdc); + WriteOneReg(0xC0, dcr); +} + +void DUT_RegInit(uint8_t rco, uint8_t tdc, uint8_t dcr) { LoadRegTable(); - for(uint16_t i = 0; i < 256; i++) { - //WriteOneReg(dut_reg[i].addr, dut_reg[i].value); - dut_reg[i].addr = i; - dut_reg[i].value = 0x00; + for(uint16_t i = 0; i < 256; i++) + { + WriteOneReg(dut_reg[i].addr, dut_reg[i].value); } + + SetBitThree(rco, tdc, dcr); } - void DUT_FirmwareInit(void) { WriteFW(LoadFirmware()); } +void DeviceAllInit(uint8_t rco, uint8_t tdc, uint8_t dcr) +{ + ChipInitReset(); + wait_ms(100); + DUT_RegInit(rco, tdc, dcr); + wait_ms(100); + DUT_FirmwareInit(); + wait_ms(100); +} + void Enable_DUT_Interrupt(void) { int_enable = 1; @@ -77,19 +99,23 @@ } } + + void HistogramReport() { uint8_t ret = 0; - uint16_t lsb, mili; + uint16_t lsb, mili, noise_level; + uint32_t peak; uint16_t histogram_pos = 0; uint16_t histogram_num = 0; + uint16_t range_step = 0; while(1) { if(histogram_mode == 1) { //ReadOneReg(REG_SYS_CFG, &sys_cfg_save); //WriteOneReg(REG_SYS_CFG, 0x00); - ret = OneTimeMeasure(&lsb, &mili); + ret = OneTimeMeasure(&lsb, &mili, &peak, &noise_level); if(ret != 0) { histogram_mode = 0; } else { @@ -104,7 +130,7 @@ } else if(histogram_mode == 2) { //ReadOneReg(REG_SYS_CFG, &sys_cfg_save); //WriteOneReg(REG_SYS_CFG, 0x00); - ret = OneTimeMeasure(&lsb, &mili); + ret = OneTimeMeasure(&lsb, &mili, &peak, &noise_level); if(ret != 0) { histogram_mode = 0; } else { @@ -134,7 +160,7 @@ } //ReadOneReg(REG_SYS_CFG, &sys_cfg_save); //WriteOneReg(REG_SYS_CFG, 0x00); - ret = OneTimeMeasure(&lsb, &mili); + ret = OneTimeMeasure(&lsb, &mili, &peak, &noise_level); if(ret != 0) { histogram_mode = 0; } else { @@ -154,7 +180,7 @@ } else if(histogram_mode == 4) { //ReadOneReg(REG_SYS_CFG, &sys_cfg_save); //WriteOneReg(REG_SYS_CFG, 0x00); - ret = OneTimeMeasure(&lsb, &mili); + ret = OneTimeMeasure(&lsb, &mili, &peak, &noise_level); if(ret != 0) { histogram_mode = 0; } else { @@ -170,9 +196,43 @@ } } //WriteOneReg(REG_SYS_CFG, sys_cfg_save); - }else { + } else if(histogram_mode == 5) { + + if(range_per_step == 0) { + range_step++; + if(range_step >= range_step_num) { + histogram_mode = 0; + } + ServoRun(1, 10); + while(CheckUntil()) wait_ms(100); + + range_per_step = 0; + ret = ContinuousMeasure(); + if(ret != 0) { + histogram_mode = 0; + } else { + while(range_per_step<256 && histogram_mode == 5) { + wait_ms(100); + } + StoreHistogram(range_step, 0, 0); + wait_ms(5); + StoreHistogram(range_step, 0, 1); + wait_ms(5); + StoreHistogram(range_step, 0, 2); + wait_ms(5); + StoreHistogram(range_step, 0, 3); + wait_ms(5); + range_per_step = 0; + + } + } + + + + } else { histogram_num = 0; histogram_pos = 0; + range_step = 0; histogram_pos_num = 0; histogram_per_pos = 0; } @@ -180,18 +240,51 @@ } } +void StoreMeasureData(uint16_t lsb, uint16_t milimeter, uint32_t peak, uint16_t noise_level, uint16_t i) +{ + histogram[0][4*i] = 0; + histogram[0][4*i+1] = 0; + histogram[0][4*i+2] = lsb >> 8; + histogram[0][4*i+3] = lsb ; + + histogram[1][4*i] = 0; + histogram[1][4*i+1] = 0; + histogram[1][4*i+2] = milimeter >> 8; + histogram[1][4*i+3] = milimeter ; + + histogram[2][4*i] = peak >> 24; + histogram[2][4*i+1] = peak >> 16; + histogram[2][4*i+2] = peak >> 8; + histogram[2][4*i+3] = peak ; + + histogram[3][4*i] = 0; + histogram[3][4*i+1] = 0; + histogram[3][4*i+2] = noise_level >> 8; + histogram[3][4*i+3] = noise_level ; + +} + void ContinuousMeasureReport() { - uint16_t lsb, milimeter; + uint16_t lsb, milimeter, noise_level; + uint32_t peak; uint8_t int_flag = 0; uint16_t time_out = 0; while(1) { chip_int_semph.wait(); - - if(RaadContinuousMeasure(&lsb, &milimeter) == 0) { - HandleContinuousMeasureReport(lsb, milimeter); + if(histogram_mode == 5) { + if(RaadContinuousMeasure(&lsb, &milimeter, &peak, &noise_level) == 0) { + StoreMeasureData(lsb, milimeter, peak, noise_level, range_per_step++); + if(range_per_step == 256) { + StopContinuousMeasure(); + } + } + } else { + if(RaadContinuousMeasure(&lsb, &milimeter, &peak, &noise_level) == 0) { + HandleContinuousMeasureReport(lsb, milimeter, peak, noise_level); + } } } @@ -290,6 +383,7 @@ ret = ReadOneReg (REG_PW_CTRL, ®_pw_ctrl); ret = WriteOneReg(REG_PW_CTRL, reg_pw_ctrl | (0x01<<3)); //set otp_ld_done ret = WriteOneReg(REG_PW_CTRL, reg_pw_ctrl | (0x01<<3) | (0x01<<1)); //set otp_ld_done, pw_ctrl_lp + ret = WriteOneReg(REG_MCU_CFG, 0x01); ret = WriteOneReg(REG_CMD, 0x01); ret = WriteOneReg(REG_SIZE, 0x02); ret = WriteOneReg(REG_SCRATCH_PAD_BASE+0x00, *((uint8_t*)(&ram_addr_base) )); @@ -303,19 +397,21 @@ ret = ReadOneReg(0x0c+i, &histogram[tdc_index][32*j + i]); } } + ret = WriteOneReg(REG_MCU_CFG, 0x03); ret = WriteOneReg(REG_SYS_CFG, reg_sys_cfg & ~(0x01<<0)); //clear sc_en ret = WriteOneReg(REG_PW_CTRL, reg_pw_ctrl | (0x01<<1)); //restore power control register - ret = WriteOneReg(REG_PW_CTRL, reg_pw_ctrl & ~(0x01<<1)); //clear pw_ctrl_lp + ret = WriteOneReg(REG_PW_CTRL, reg_pw_ctrl); //clear pw_ctrl_lp return ret; } -uint8_t OneTimeMeasure(uint16_t *lsb, uint16_t *milimeter) +uint8_t OneTimeMeasure(uint16_t *lsb, uint16_t *milimeter, uint32_t *peak, uint16_t *noise_level) { uint8_t ret = 0; uint8_t reg_pw_ctrl; uint8_t reg_sys_cfg; uint32_t timeout = 0; + uint8_t flag = 0; int_mark = 1;//One Time Measure @@ -324,6 +420,7 @@ //ret = ReadOneReg (REG_PW_CTRL, ®_pw_ctrl); //ret = WriteOneReg(REG_PW_CTRL, reg_pw_ctrl | (0x01<<3)); //set otp_ld_done //ret = WriteOneReg(REG_PW_CTRL, (reg_pw_ctrl | (0x01<<3)) & ~(0x01<<1)); //set otp_ld_done, clear pw_ctrl_lp + //ret = WriteOneReg(0x08, 0x00); ret = WriteOneReg(REG_CMD, 0x0E); //ret = WriteOneReg(REG_SIZE, 0x00); @@ -331,6 +428,11 @@ while(int_mark == 1 && timeout != 0) { timeout--; wait_ms(5); + //ReadOneReg(0x08, &flag); + // if(flag == 0xFF) + //{ + // int_mark = 0; + // } } if(timeout == 0) { @@ -344,6 +446,14 @@ ret = ReadOneReg(0x18, (uint8_t*)milimeter); ret = ReadOneReg(0x19, (uint8_t*)milimeter + 1); + ret = ReadOneReg(0x26, (uint8_t*)noise_level); + ret = ReadOneReg(0x27, (uint8_t*)noise_level + 1); + + ret = ReadOneReg(0x28, (uint8_t*)peak ); + ret = ReadOneReg(0x29, (uint8_t*)peak + 1); + ret = ReadOneReg(0x2a, (uint8_t*)peak + 2); + ret = ReadOneReg(0x2b, (uint8_t*)peak + 3); + } //ret = WriteOneReg(REG_SYS_CFG, reg_sys_cfg & ~(0x01<<0)); //clear sc_en @@ -374,7 +484,7 @@ return ret; } -uint8_t RaadContinuousMeasure(uint16_t *lsb, uint16_t *milimeter) +uint8_t RaadContinuousMeasure(uint16_t *lsb, uint16_t *milimeter, uint32_t *peak, uint16_t *noise_level) { uint8_t ret = 0; uint8_t reg_pw_ctrl; @@ -394,6 +504,14 @@ ret = ReadOneReg(0x18, (uint8_t*)milimeter); ret = ReadOneReg(0x19, (uint8_t*)milimeter + 1); + ret = ReadOneReg(0x26, (uint8_t*)noise_level); + ret = ReadOneReg(0x27, (uint8_t*)noise_level + 1); + + ret = ReadOneReg(0x28, (uint8_t*)peak ); + ret = ReadOneReg(0x29, (uint8_t*)peak + 1); + ret = ReadOneReg(0x2a, (uint8_t*)peak + 2); + ret = ReadOneReg(0x2b, (uint8_t*)peak + 3); + //ret = WriteOneReg(REG_SYS_CFG, reg_sys_cfg & ~(0x01<<0)); //clear sc_en return ret; @@ -460,10 +578,11 @@ uint8_t ret = 0; uint32_t timeout = 0; memset(dcr_matrix, 0x00, 17*9*2); - WriteOneReg(0x50, 0x01); - WriteOneReg(0xBD, 0x01); - wait_ms(100); - WriteOneReg(0xD8, 0xF0); + //WriteOneReg(0x50, 0x01); + //WriteOneReg(0xBD, 0x01); + //wait_ms(100); + //WriteOneReg(0xD8, 0xF0); + WriteOneReg(0xC0, vspad); for(uint8_t group = 0; group < 9; group++) { WriteOneReg(0x0C, group); @@ -495,7 +614,7 @@ uint8_t DelayLineTest(uint8_t phase, uint8_t* buf) { uint8_t ret = 0; - uint32_t timeout = 0; + uint32_t timeout = 0; WriteOneReg(0xE4, phase); wait_ms(10); @@ -511,12 +630,12 @@ while(int_mark == 1 && timeout != 0) { timeout--; wait_ms(100); - } + } for(uint8_t tdc = 0; tdc < 9; tdc++) { ret = ReadOneReg(0x0c + tdc*2, buf + step*18 + tdc*2 + 1); wait_ms(1); - ret = ReadOneReg(0x0c + tdc*2 + 1, buf + step*18 + tdc*2); - wait_ms(1); + ret = ReadOneReg(0x0c + tdc*2 + 1, buf + step*18 + tdc*2); + wait_ms(1); } } @@ -552,4 +671,198 @@ return 0; } +uint8_t SetWindow(uint8_t* pd) +{ + uint8_t ret = 0; + uint8_t buf[14]; + + memset(buf, 0x00, 14); + + buf[0] |= (pd[5]&0xF); + buf[0] |= ((pd[6] << 4)&0xF0); + + buf[1] |= (pd[7]&0xF); + buf[1] |= ((pd[8] << 4)&0xF0); + + buf[2] |= (pd[9]&0xF); + buf[2] |= ((pd[10] << 4)&0xF0); + + buf[3] |= (pd[11]&0xF); + buf[3] |= ((pd[12] << 4)&0xF0); + + buf[4] |= (pd[13]&0xF); + buf[4] |= ((pd[14] << 4)&0xF0); + + buf[5] |= (pd[15]&0xF); + buf[5] |= ((pd[16] << 4)&0xF0); + + buf[6] |= (pd[17]&0xF); + buf[6] |= ((pd[18] << 4)&0xF0); + + buf[7] |= (pd[19]&0xF); + buf[7] |= ((pd[20] << 4)&0xF0); + + buf[8] = 0x00;// Fisrt 16LSB cut off + buf[9] = 0xFF; + + buf[10] = 0x01;// Ref PAD switch + + buf[11] = 0x1F;// TDC Resolution 1F = 31 + + buf[12] = 0x0C;// Length + buf[13] = 0x09;//CMD + + for(uint8_t i = 0; i < 12; i++) + { + WriteOneReg(0x0C + i, buf[i]); + } + + WriteOneReg(0x0B, 0x0C); + WriteOneReg(0x0A, 0x09); + + return 0; +} +uint8_t RCO_Trim(uint8_t *rco) +{ + uint8_t ret = 0; + uint8_t value = 0, result = 0; + + TRIM_EN = 1; + + //==================First BAND=====================// + ChipInitReset(); + ret = WriteOneReg(0xED , 0x03); + ret = WriteOneReg(0xEC , 0x36); + ret = WriteOneReg(0x3D , 0xC0); + ret = WriteOneReg(0xE8 , 0x00); + ret = WriteOneReg(0xEA , 0x3F); + ret = WriteOneReg(0x3D , 0xC8); + ret = WriteOneReg(0xED , 0x83); + + wait_ms(1000); + + ret = ReadOneReg(0xFA, &value); + ret = ReadOneReg(0xFB, &result); + + if((result&0xC0) == 0xC0) + { + *rco = value; + ChipInitReset(); + TRIM_EN = 0; + return 0; + } + + //==================Second BAND=====================// + ChipInitReset(); + ret = WriteOneReg(0xED , 0x03); + ret = WriteOneReg(0xEC , 0x36); + ret = WriteOneReg(0x3D , 0xC0); + ret = WriteOneReg(0xE8 , 0x00); + ret = WriteOneReg(0xEA , 0x7F); + ret = WriteOneReg(0xEB , 0x40); + ret = WriteOneReg(0x3D , 0xC8); + ret = WriteOneReg(0xED , 0x83); + + wait_ms(1000); + + ret = ReadOneReg(0xFA, &value); + ret = ReadOneReg(0xFB, &result); + + if((result&0xC0) == 0xC0) + { + *rco = value; + ChipInitReset(); + TRIM_EN = 0; + return 0; + } + + //==================Third BAND=====================// + ChipInitReset(); + ret = WriteOneReg(0xED , 0x03); + ret = WriteOneReg(0xEC , 0x36); + ret = WriteOneReg(0x3D , 0xC0); + ret = WriteOneReg(0xE8 , 0x00); + ret = WriteOneReg(0xEA , 0xBF); + ret = WriteOneReg(0xEB , 0x80); + ret = WriteOneReg(0x3D , 0xC8); + ret = WriteOneReg(0xED , 0x83); + + wait_ms(1000); + + ret = ReadOneReg(0xFA, &value); + ret = ReadOneReg(0xFB, &result); + + if((result&0xC0) == 0xC0) + { + *rco = value; + ChipInitReset(); + TRIM_EN = 0; + return 0; + } + + //==================Fourth BAND=====================// + ChipInitReset(); + ret = WriteOneReg(0xED , 0x03); + ret = WriteOneReg(0xEC , 0x36); + ret = WriteOneReg(0x3D , 0xC0); + ret = WriteOneReg(0xE8 , 0x00); + ret = WriteOneReg(0xEA , 0xFF); + ret = WriteOneReg(0xEB , 0xC0); + ret = WriteOneReg(0x3D , 0xC8); + ret = WriteOneReg(0xED , 0x83); + + wait_ms(1000); + + ret = ReadOneReg(0xFA, &value); + ret = ReadOneReg(0xFB, &result); + + if((result&0xC0) == 0xC0) + { + *rco = value; + ChipInitReset(); + TRIM_EN = 0; + return 0; + } + + ChipInitReset(); + TRIM_EN = 0; + return 1; +} + +uint8_t BVD_Trim(uint8_t *bvd) +{ + uint8_t ret = 0; + uint32_t timeout = 0; + + WriteOneReg(0xC0, 0x00); + wait_ms(1); + + timeout = 600; + int_mark = 1; + WriteOneReg(0x0A, 0x08); + while(int_mark == 1 && timeout != 0) { + timeout--; + wait_ms(100); + } + //osDelay(80); + + ret = ReadOneReg(0xC0, bvd); + + if(timeout == 0) + return 1; + + return 0; +} + +uint8_t Pixel_Enable(uint8_t *buf) +{ + for(uint8_t i = 0; i < 18; i++) + { + WriteOneReg(0xC2 + i, buf[i]); + } + + return 0; +} + +