V1.1 For EVIC
Dependencies: SDFileSystem max32630fthr USBDevice
DUT_RegConfig.cpp
- Committer:
- china_sn0w
- Date:
- 2020-05-28
- Revision:
- 1:7530b7eb757a
- Child:
- 3:35b05d91568d
File content as of revision 1:7530b7eb757a:
#include "mbed.h" #include "cmsis_os.h" #include "max32630fthr.h" #include "USBSerial.h" #include "CmdHandler.h" #include "DUT_RegConfig.h" #include "ServoRun.h" #include "SDFileSystem.h" #include "Firmware.h" #include "RegTable.h" #include "CmdHandler.h" DUTREG dut_reg[DUT_REG_NUM]; uint8_t Firmware[8192]; uint8_t histogram[10][1024]; uint8_t dcr_matrix[17][9*2]; uint8_t int_mark = 0; uint8_t int_enable = 1; uint8_t histogram_mode = 0; uint8_t histogram_tdc = 0; Semaphore chip_int_semph(1); extern DigitalOut xSHUT; extern I2C i2c_v; uint16_t histogram_pos_num = 0; uint16_t histogram_per_pos = 0; extern const uint8_t reg_table[]; extern const uint8_t Firmware_Ranging[]; extern uint8_t _uart_send_pbuff[CMD_BUF_LEN] ; void ChipInitReset(void) { xSHUT = 0; wait_ms(30); xSHUT = 1; } void DUT_RegInit(void) { 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; } } void DUT_FirmwareInit(void) { WriteFW(LoadFirmware()); } void Enable_DUT_Interrupt(void) { int_enable = 1; } void Disable_DUT_Interrupt(void) { int_enable = 0; } void InterruptHandle(void) { if(int_enable == 0) return; if(int_mark == 1) { int_mark = 0; } else if(int_mark == 2) { chip_int_semph.release(); //发送信号量 } } void HistogramReport() { uint8_t ret = 0; uint16_t lsb, mili; uint16_t histogram_pos = 0; uint16_t histogram_num = 0; while(1) { if(histogram_mode == 1) { //ReadOneReg(REG_SYS_CFG, &sys_cfg_save); //WriteOneReg(REG_SYS_CFG, 0x00); ret = OneTimeMeasure(&lsb, &mili); if(ret != 0) { histogram_mode = 0; } else { ret = vangogh_ram_rd(histogram_tdc); if(ret != 0) { histogram_mode = 0; } else { HandleReadHistogram(histogram_tdc); } } //WriteOneReg(REG_SYS_CFG, sys_cfg_save); } else if(histogram_mode == 2) { //ReadOneReg(REG_SYS_CFG, &sys_cfg_save); //WriteOneReg(REG_SYS_CFG, 0x00); ret = OneTimeMeasure(&lsb, &mili); if(ret != 0) { histogram_mode = 0; } else { for(uint8_t i = 0; i < 10; i++) { ret = vangogh_ram_rd(i); if(ret != 0) { histogram_mode = 0; break; } else { HandleReadHistogram(i); wait_ms(1); } } } //WriteOneReg(REG_SYS_CFG, sys_cfg_save); } else if(histogram_mode == 3) { if(histogram_num >= histogram_per_pos) { histogram_num = 0; histogram_pos++; if(histogram_pos >= histogram_pos_num) { histogram_mode = 0; } ServoRun(1, 10); while(CheckUntil()) wait_ms(100); } //ReadOneReg(REG_SYS_CFG, &sys_cfg_save); //WriteOneReg(REG_SYS_CFG, 0x00); ret = OneTimeMeasure(&lsb, &mili); if(ret != 0) { histogram_mode = 0; } else { for(uint8_t i = 0; i < 10; i++) { ret = vangogh_ram_rd(i); if(ret != 0) { histogram_mode = 0; break; } else { StoreHistogram(histogram_pos, histogram_num, i); wait_ms(100); } } } //WriteOneReg(REG_SYS_CFG, sys_cfg_save); histogram_num++; } else if(histogram_mode == 4) { //ReadOneReg(REG_SYS_CFG, &sys_cfg_save); //WriteOneReg(REG_SYS_CFG, 0x00); ret = OneTimeMeasure(&lsb, &mili); if(ret != 0) { histogram_mode = 0; } else { for(uint8_t i = 0; i < 9; i++) { ret = vangogh_ram_rd(i); if(ret != 0) { histogram_mode = 0; break; } else { HandleReadHistogram(i); wait_ms(1); } } } //WriteOneReg(REG_SYS_CFG, sys_cfg_save); }else { histogram_num = 0; histogram_pos = 0; histogram_pos_num = 0; histogram_per_pos = 0; } wait(1); } } void ContinuousMeasureReport() { uint16_t lsb, milimeter; uint8_t int_flag = 0; uint16_t time_out = 0; while(1) { chip_int_semph.wait(); if(RaadContinuousMeasure(&lsb, &milimeter) == 0) { HandleContinuousMeasureReport(lsb, milimeter); } } } uint8_t WriteOneReg(uint8_t addr, uint8_t data) { uint8_t buf[2]; buf[0] = addr; buf[1] = data; i2c_v.write(DUT_DEV_ADDR, (char*)buf, 2); return 0; } uint8_t ReadOneReg(uint8_t addr, uint8_t *data) { uint8_t buf[2]; buf[0] = addr; i2c_v.write(DUT_DEV_ADDR, (char*)buf, 1); i2c_v.read (DUT_DEV_ADDR, (char*)data, 1); return 0; } uint8_t ReadAllRegToTable(void) { for(uint16_t i = 0; i < DUT_REG_NUM; i++) { ReadOneReg(dut_reg[i].addr, &(dut_reg[i].value)); } return 0; } uint8_t WriteFW(uint16_t size) { uint8_t ret = 0; uint8_t i; uint8_t reg_sys_cfg; uint8_t uart_rx_data; uint16_t fw_size = size; uint16_t fw_send = 0; ret = WriteOneReg(REG_PW_CTRL, 0x08); ret = WriteOneReg(REG_PW_CTRL, 0x0a); ret = WriteOneReg(REG_MCU_CFG, 0x02); ret = ReadOneReg (REG_SYS_CFG, ®_sys_cfg); ret = WriteOneReg(REG_SYS_CFG, reg_sys_cfg | (0x01<<0)); ret = WriteOneReg(REG_CMD, 0x01); ret = WriteOneReg(REG_SIZE, 0x02); ret = WriteOneReg(REG_SCRATCH_PAD_BASE+0x00, 0x00); ret = WriteOneReg(REG_SCRATCH_PAD_BASE+0x01, 0x00); while(fw_size >= 32) { ret = WriteOneReg(REG_CMD,0x03); ret = WriteOneReg(REG_SIZE,0x20); for(i=0; i<32; i++) { uart_rx_data = Firmware[fw_send++]; ret = WriteOneReg(REG_SCRATCH_PAD_BASE+i, uart_rx_data); wait_us(5); } fw_size -= 32; } if(fw_size > 0) { ret = WriteOneReg(REG_CMD,0x03); ret = WriteOneReg(REG_SIZE,(uint8_t)fw_size); for(i=0; i<fw_size; i++) { uart_rx_data = Firmware[fw_send++]; ret = WriteOneReg(REG_SCRATCH_PAD_BASE+i, uart_rx_data); wait_us(5); } } ret = WriteOneReg(REG_SYS_CFG, reg_sys_cfg & ~(0x01<<0)); ret = WriteOneReg(REG_MCU_CFG, 0x03); ret = WriteOneReg(REG_PW_CTRL, 0x02); //reset r_otp_ld_done, is a must ret = WriteOneReg(REG_PW_CTRL, 0x00); //reset r_otp_ld_done, exit low power mode return ret; } uint8_t vangogh_ram_rd(uint8_t tdc) //UART CMD foramt: CMD-1-byte|TDC-index-1-byte { uint8_t ret = 0; uint8_t i; uint8_t j; uint8_t reg_pw_ctrl; uint8_t reg_sys_cfg; uint8_t tdc_index = tdc; uint16_t ram_addr_base = 0x1000 + 0x0400 * tdc_index; ret = ReadOneReg (REG_SYS_CFG, ®_sys_cfg ); ret = WriteOneReg(REG_SYS_CFG, reg_sys_cfg | (0x01<<0)); 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_CMD, 0x01); ret = WriteOneReg(REG_SIZE, 0x02); ret = WriteOneReg(REG_SCRATCH_PAD_BASE+0x00, *((uint8_t*)(&ram_addr_base) )); ret = WriteOneReg(REG_SCRATCH_PAD_BASE+0x01, *((uint8_t*)(&ram_addr_base)+1)); wait_us(100); for(j=0; j<32; j++) { ret = WriteOneReg(REG_CMD,0x05); //Issue RAM read command ret = WriteOneReg(REG_SIZE,0x20); //Issue RAM read command wait_us(100); for(i=0; i<32; i++) { ret = ReadOneReg(0x0c+i, &histogram[tdc_index][32*j + i]); } } 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 return ret; } uint8_t OneTimeMeasure(uint16_t *lsb, uint16_t *milimeter) { uint8_t ret = 0; uint8_t reg_pw_ctrl; uint8_t reg_sys_cfg; uint32_t timeout = 0; int_mark = 1;//One Time Measure //ret = ReadOneReg (REG_SYS_CFG, ®_sys_cfg ); //ret = WriteOneReg(REG_SYS_CFG, reg_sys_cfg | (0x01<<0)); //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(REG_CMD, 0x0E); //ret = WriteOneReg(REG_SIZE, 0x00); timeout = 1000; while(int_mark == 1 && timeout != 0) { timeout--; wait_ms(5); } if(timeout == 0) { return 1; } else { ret = ReadOneReg(0x0d, (uint8_t*)lsb); ret = ReadOneReg(0x0e, (uint8_t*)lsb + 1); ret = ReadOneReg(0x18, (uint8_t*)milimeter); ret = ReadOneReg(0x19, (uint8_t*)milimeter + 1); } //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 return ret; } uint8_t ContinuousMeasure(void) { uint8_t ret = 0; uint8_t reg_pw_ctrl; uint8_t reg_sys_cfg; int_mark = 2;//Continuous Time Measure //ret = ReadOneReg (REG_SYS_CFG, ®_sys_cfg ); //ret = WriteOneReg(REG_SYS_CFG, reg_sys_cfg | (0x01<<0)); //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(REG_CMD, 0x0F); //ret = WriteOneReg(REG_SIZE, 0x00); //ret = WriteOneReg(REG_SYS_CFG, reg_sys_cfg & ~(0x01<<0)); //clear sc_en return ret; } uint8_t RaadContinuousMeasure(uint16_t *lsb, uint16_t *milimeter) { uint8_t ret = 0; uint8_t reg_pw_ctrl; uint8_t reg_sys_cfg; int_mark = 2;//Continuous Time Measure //ret = ReadOneReg (REG_SYS_CFG, ®_sys_cfg ); //ret = WriteOneReg(REG_SYS_CFG, reg_sys_cfg | (0x01<<0)); //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 = ReadOneReg(0x0d, (uint8_t*)lsb); ret = ReadOneReg(0x0e, (uint8_t*)lsb + 1); ret = ReadOneReg(0x18, (uint8_t*)milimeter); ret = ReadOneReg(0x19, (uint8_t*)milimeter + 1); //ret = WriteOneReg(REG_SYS_CFG, reg_sys_cfg & ~(0x01<<0)); //clear sc_en return ret; } uint8_t StopContinuousMeasure() { uint8_t ret = 0; uint8_t reg_pw_ctrl; uint8_t reg_sys_cfg; int_mark = 0;//Continuous Time Measure //ret = ReadOneReg (REG_SYS_CFG, ®_sys_cfg ); //ret = WriteOneReg(REG_SYS_CFG, reg_sys_cfg | (0x01<<0)); //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(REG_CMD, 0x00); ret = WriteOneReg(REG_SIZE, 0x00); //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 return ret; } void StoreHistogram(uint16_t histogram_pos, uint16_t histogram_num, uint8_t tdc) { /* char file_name[20]; //sprintf(file_name, "/sd/hist_%d_%d_tdc%d", histogram_pos, histogram_num, tdc); sprintf(file_name, "/sd/hello.txt"); FILE *fp = fopen(file_name, "w"); //for(uint32_t i = 0; i < 1024; i++) { // fseek(fp,0,SEEK_END); // fprintf(fp, "%02X ", histogram[tdc][i]); //} fprintf(fp, "hello "); fflush(fp); fclose(fp); */ _uart_send_pbuff[0] = histogram_pos; _uart_send_pbuff[1] = histogram_pos >> 8; _uart_send_pbuff[2] = tdc; _uart_send_pbuff[3] = histogram_num; _uart_send_pbuff[4] = histogram_num >> 8; memcpy(&_uart_send_pbuff[5], histogram[tdc], 1024); UART_CmdAckSend(READ_CMD | 0x80, VAN_STEP_HISTOGRAM_CMD, _uart_send_pbuff, 1024 + 1 + 2 + 2); //return 0; } uint8_t DCRTest(uint8_t vspad, uint8_t test_time) { 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); for(uint8_t group = 0; group < 9; group++) { WriteOneReg(0x0C, group); wait_ms(1); WriteOneReg(0x0D, test_time); wait_ms(1); timeout = 25; int_mark = 1; WriteOneReg(0x0A, 0x0C); while(int_mark == 1 && timeout != 0) { timeout--; wait_ms(100); } //osDelay(80); for(uint8_t pix = 0; pix < 17; pix++) { ret = ReadOneReg(0x82 + pix*2, &dcr_matrix[pix][group*2 + 1]); ret = ReadOneReg(0x82 + pix*2 + 1, &dcr_matrix[pix][group*2]); //osDelay(1); if(ret != 0) return ret; } } return 0; } uint8_t DelayLineTest(uint8_t phase, uint8_t* buf) { uint8_t ret = 0; uint32_t timeout = 0; WriteOneReg(0xE4, phase); wait_ms(10); for(uint8_t step = 0; step < 8; step++) { WriteOneReg(0xE1, 0x61 | (step << 1)); wait_ms(10); timeout = 50; int_mark = 1; WriteOneReg(0x0A, 0x0B); wait_ms(10); 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); } } return 0; } uint8_t GetTdcPhase(uint8_t* buf) { uint8_t ret = 0; uint32_t timeout = 0; memset(buf, 0x00, 10); WriteOneReg(0x0C, 0x0C); WriteOneReg(0x0A, 0x0A); wait_ms(1); timeout = 10; int_mark = 1; WriteOneReg(0x0A, 0x0B); while(int_mark == 1 && timeout != 0) { timeout--; wait_ms(100); } //osDelay(80); ret = ReadOneReg(0x0D, buf); ret = ReadOneReg(0xE4, buf + 1); if(ret != 0) return ret; return 0; }