MS1002驱动兼容TDC-GP21

驱动C文件


//SPI 定义
#define GP22_SPI_CS_GPIO_Port    GPIOA
#define GP22_SPI_CS_Pin          LL_GPIO_PIN_10
                                 
#define GP22_SPI_CLK_GPIO_Port   GPIOA
#define GP22_SPI_CLK_Pin         LL_GPIO_PIN_9

#define GP22_SPI_DIN_GPIO_Port   GPIOC
#define GP22_SPI_DIN_Pin         LL_GPIO_PIN_1

#define GP22_SPI_DOUT_GPIO_Port  GPIOC
#define GP22_SPI_DOUT_Pin        LL_GPIO_PIN_9

#define GP22_SPI_CLK						 LL_AHB2_GRP1_PERIPH_GPIOA|LL_AHB2_GRP1_PERIPH_GPIOC

#define RESET_SPI_CS    LL_GPIO_ResetOutputPin(GP22_SPI_CS_GPIO_Port, GP22_SPI_CS_Pin)
#define SET_SPI_CS      LL_GPIO_SetOutputPin(GP22_SPI_CS_GPIO_Port, GP22_SPI_CS_Pin)

#define RESET_SPI_CLK   LL_GPIO_ResetOutputPin(GP22_SPI_CLK_GPIO_Port, GP22_SPI_CLK_Pin)
#define SET_SPI_CLK     LL_GPIO_SetOutputPin(GP22_SPI_CLK_GPIO_Port, GP22_SPI_CLK_Pin)

#define RESET_SPI_DIN   LL_GPIO_ResetOutputPin(GP22_SPI_DIN_GPIO_Port, GP22_SPI_DIN_Pin)
#define SET_SPI_DIN     LL_GPIO_SetOutputPin(GP22_SPI_DIN_GPIO_Port, GP22_SPI_DIN_Pin)

#define delay_cnt   (20)

double measbuf2[20];
uint16_t meas_index2 = 0;


//#define debug       (1)
/* 复位时默认寄存器数据 */
const uint32_t CFG_DEFAULT_BITMASKS[7] = { 0x22066800, 0x55400000, 0x20000000, 0x18000000, 0x20000000, 0x00000000,
        0x00000000 };
const uint32_t CFG_KEEP_DEFAULT_BITMASKS[7] = { 0x00000000, 0x00400000, 0x00000000, 0x00000000, 0x20000000, 0x00000000,
        0x00000000 };
/* 寄存器定义哪些要读取 */
const uint8_t READ_REGISTER_ADDRS[READ_MAX] = { 0, 1, 2, 3, 4, 5, 8 };
/* 对应寄存器需要读取多少二进制位 */
const uint8_t READ_REGISTER_LENGTHS[READ_MAX] = { 32, 32, 32, 32, 16, 8, 8 };
const int BYTE_DELAY_MICROSECONDS = 1;

uint32_t _configRegisters[CFG_REGISTER_MAX];
uint32_t _configRegistersTemp[CFG_REGISTER_MAX];

double measbuf[20];
uint16_t meas_index = 0;

int tdc_gp2_init(void)
{
	LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
	LL_AHB2_GRP1_EnableClock(GP22_SPI_CLK);
	/*so*/
	GPIO_InitStruct.Pin = GP22_SPI_DOUT_Pin;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_INPUT;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
  LL_GPIO_Init(GP22_SPI_DOUT_GPIO_Port, &GPIO_InitStruct);
	/*cs*/
	GPIO_InitStruct.Pin = GP22_SPI_CS_Pin;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
  LL_GPIO_Init(GP22_SPI_CS_GPIO_Port, &GPIO_InitStruct);
	/*clk*/
	GPIO_InitStruct.Pin = GP22_SPI_CLK_Pin;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
  LL_GPIO_Init(GP22_SPI_CLK_GPIO_Port, &GPIO_InitStruct);
	/*si*/
	GPIO_InitStruct.Pin = GP22_SPI_DIN_Pin;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
  LL_GPIO_Init(GP22_SPI_DIN_GPIO_Port, &GPIO_InitStruct);	
  SET_SPI_CS;
  return (0);
}

static void delay(int _us)
{
    for (int i = 0; i < _us; i++)
    {
        __asm("nop");
    }
}

//spi传输一个字节
uint8_t transfer(uint8_t _byte)
{
    uint8_t read_byte = 0;
    uint8_t i;
    for (i = 0; i < 8; i++)
    {
        //每次先移动读取的变量,确保读取的最后数据不移动。
        read_byte <<= 1;
        if (_byte & 0x80)
        {
            SET_SPI_DIN;
        }
        else
        {
            RESET_SPI_DIN;
        }
        delay(delay_cnt);
        SET_SPI_CLK;
        delay(delay_cnt);
        RESET_SPI_CLK;
        delay(delay_cnt);
        /*读数据*/
				if((GP22_SPI_DOUT_GPIO_Port->IDR & GP22_SPI_DOUT_Pin) != 0)
        {
            read_byte |= 0x01;
        }
        else
        {
            read_byte &= ~0x01;
        }
        _byte <<= 1;
    }
    return (read_byte);
}

/* 发送一个标准的opcode操作 */
void sendOpcode(uint8_t opcode)
{
    //  设置CS为低
    RESET_SPI_CS;
    transfer(opcode);
    //  设置CS为低
    SET_SPI_CS;
}
/* SPI写函数*/
/*先写opcode码,然后跟n个字节数据,n=0~4*/
void writeNBytes(uint8_t opcode, uint32_t data, uint8_t n)
{
	  int shift;
    //  设置CS为低
    RESET_SPI_CS;
    //发送 opcode
    transfer(opcode);
    //写剩下字节,先发低8为,再发送高位。
    for (shift = (n - 1) * 8; shift >= 0; shift -= 8)
    {
        transfer((uint8_t) (data >> shift));
    }
    //  设置CS为高
    SET_SPI_CS;
}

/* SPI 读函数,只读取4个字节。id无法正常读取。*/
/*先写opcode码,然后读取n个字节数据,n=1~4*/
uint32_t readNBytes(uint8_t opcode, uint8_t n)
{
    uint8_t buf = 0;
    uint32_t res = 0;
	  int shift;
    //  设置CS为低
    RESET_SPI_CS;
    //发送 opcode
    transfer(opcode);

    //读取寄存器
    for (shift = (n - 1) * 8; shift >= 0; shift -= 8)
    {
        buf = transfer(0x00);
        res |= ((uint32_t) buf << shift);
    }
    //  设置CS为高
    SET_SPI_CS;
#ifdef debug
    rt_kprintf("Read opcode %02x:%08x\r\n", opcode, res);
#endif
    return res;
}

/* 写数据到寄存器中 */
void writeRegister(uint8_t address, uint32_t data)
{
    writeNBytes(OPCODE_WRITE_ADDRESS + address, data, 4);
    /* 保存数据到配置寄存器 */
    _configRegisters[address] = data;
#ifdef debug
    rt_kprintf("Wrote to reg %02x:%08x\r\n", address, data);
#endif
}

/* 读取寄存器数据 */
uint32_t readRegister(uint32_t reg)
{
    return readNBytes(OPCODE_READ_ADDRESS | READ_REGISTER_ADDRS[reg], READ_REGISTER_LENGTHS[reg] / 8);
}

//定点浮点型转换为浮点数
float fixedPoint16ToFloat(uint32_t num)
{
    return (num / 65536.0);
}
//转整数
int fixedPoint16ToInt(uint32_t num)
{
    return (num / 65536);
}

/* 浮点型数据转换*/
float readResult(int address)
{
    return fixedPoint16ToFloat(readRegister((uint32_t) address));
}
/* 浮点型数据转换*/
float readResult2(int address)
{
    return fixedPoint16ToFloat(readUncalibratedResult((uint32_t) address));
}
/* 读取结果,2个字节 */
int16_t readUncalibratedResult(int address)
{
    return readNBytes(OPCODE_READ_ADDRESS | address, 2);
}

/*检查中断引脚*/
uint8_t checkInterrupt(void)
{
    return 1;
}

/* 等待中断引脚变为低电平 */
long waitForInterrupt(long timeout_us)
{
//    unsigned long start_time = rt_tick_get();
    unsigned long waited_us = 0;
//    while (!checkInterrupt())
//    {
//        waited_us = rt_tick_get() - start_time;
//        if (timeout_us && waited_us > timeout_us)
//        {
//            return -1;
//        }
//    }
    return waited_us;
}

/*读取ALU的状态寄存器, ALU_OP_PTR. */
int getALUPointer(void)
{
    return ((readRegister(READ_STAT) & STAT_ALU_OP_PTR * 0x7) / STAT_ALU_OP_PTR);
}

/*获取时钟参数 0,1,2,3*/
int8_t getClockFactor(void)
{
    int DIV_CLKHS = (_configRegisters[0] & CFG0_DIV_CLKHS_0 * 0x3) / CFG0_DIV_CLKHS_0;
    return (DIV_CLKHS < 3 ? (1 << DIV_CLKHS) : (1 << 2));
}

/* 校准测量*/
float getResonatorCycles(void)
{
    float res_meas = 0;
    uint32_t dat = (((uint32_t) _configRegistersTemp[3]) & (~CFG3_EN_AUTOCALC_MB2))
            | (uint32_t) (CFG3_SEL_TIMO_MB2_0 * 0x3);
    writeRegister(3, dat);
    sendOpcode(OPCODE_INIT);
    sendOpcode(OPCODE_START_CAL_RESONATOR);
		LL_mDelay(10);
	//等中断
		res_meas = readResult(READ_RES_1);
    return (res_meas);
}

/* 测试SPI通信是否正好,写寄存器1,读寄存5,READ_REG_1,实际为寄存器5*/
uint32_t testCommunication(void)
{
    uint32_t ok = 1;

    // 获取寄存器1的高8位。
    uint8_t initialReg1 = readRegister(READ_REG_1) >> 24;

    // 修改数据。
    uint8_t testInput = (initialReg1 ^ 0xff) + 123;

    // 写到寄存器1中,并读取是否改变。
    writeRegister(1, (uint32_t) (testInput) << 24);
    uint8_t testResult = readRegister(READ_REG_1);

    if (testResult != testInput)
    {
      SendErrorCode(ERRORCODE_TdcError1);
			
        //如果改变了,则通信失败。比较的是修改后的数据是否与写入一致。
        ok = 0;
#ifdef  debug
        rt_kprintf("test:error 1.\r\n");
#endif
    }
    // 写入修改之前的数据,看前后是否一致
    writeRegister(1, (uint32_t) initialReg1 << 24);
    uint8_t testResult2 = readRegister(READ_REG_1);

    if (testResult2 != initialReg1)
    {
			//Mcu_Uart2_Send_Data((uint8_t *)ms1022_err2,strlen(ms1022_err2));
			SendErrorCode(ERRORCODE_TdcError2);
        ok = 0;
#ifdef  debug
        rt_kprintf("test:error 2.\r\n");
#endif
    }
		else
		{
			
		}
    return ok;
}

#ifdef  debug
/* 打印设备ID */
void printid(void)
{
    uint64_t ids = readNBytes(OPCODE_READ_ID, 7);
    rt_kprintf("IDs:%02x %02x %02x %02x %02x %02x %02x\r\n", (ids >> 0) & 0xff, (ids >> 8) & 0xff, (ids >> 16) & 0xff,
            (ids >> 24) & 0xff, (ids >> 32) & 0xff, (ids >> 40) & 0xff, (ids >> 48) & 0xff);
}
#endif

/* 读取状态寄存器数据 */
uint16_t read_stat(void)
{
    uint16_t stat = readRegister(READ_STAT);
    return (stat);
}

#define MEAS_BUF_LEN  (100)


int test_gp2(void)
{
	  tdc_gp2_init();
    sendOpcode(OPCODE_POWER_ON_RESET);
    sendOpcode(OPCODE_INIT);
    testCommunication();
    {
        sendOpcode(OPCODE_INIT);
        writeRegister(0, CFG_KEEP_DEFAULT_BITMASKS[0]
                          | CFG0_DIV_CLKHS_0 * 0
                          | CFG0_START_CLKHS_START_0 * 1
                          | CFG0_NO_CAL_AUTO * 1
                          | CFG0_NEG_STOP1 * 0
                          | CFG0_MESSB2 * 0
                         ); 
        writeRegister(1, CFG_KEEP_DEFAULT_BITMASKS[1]
                          | CFG1_HITIN1_0 * 1
                          | CFG1_HITIN2_0 * 0
                          | CFG1_HIT1_0 * 1
                          | CFG1_HIT2_0 * 0
                          | CFG1_EN_FAST_INIT * 1
                         );
        writeRegister(6, CFG_KEEP_DEFAULT_BITMASKS[6]
                          | CFG6_DOUBLE_RES * 1              // 关闭测量提高。在测量模式2中,将测量精度提高到45ps。
                          | CFG6_EN_INT_END                  // 1=EEPROM 操作结束时中断
                          | 0x3c                             // 低8为未用,保持该数值即可。
                          | CFG6_START_CLKHS_END* 0
                );
        sendOpcode(OPCODE_INIT);
    }
    return (1);		
}


double get_tdc_phase_err(void)
{
    double ress,res,res2; 
		sendOpcode(OPCODE_INIT);
		ress  = readUncalibratedResult(0);
		res = (ress*45.0/1000);
	  if(sys_str.tdc_cail_en == 1)
		{
			res2 = res;
		}
		else
		{
			res2 = res - (TDC_DELAY*TIMER_MIN);
		}	  
	  measbuf[(meas_index++)%20] = res2;
	  if(meas_index>20)
		{
			meas_index = 0;
		}		
		return res2;
}

头文件

#ifndef MS1022_H_
#define MS1022_H_

//------------------------------------函数--------------------------------
/* 测试SPI通信是否正好,写寄存器1,读寄存5,READ_REG_1,实际为寄存器5*/
uint32_t testCommunication(void);
//spi传输一个字节
uint8_t transfer(uint8_t _byte);
/* 发送一个标准的opcode操作 */
void sendOpcode(uint8_t opcode);
/* SPI写函数*/
/*先写opcode码,然后跟n个字节数据,n=0~4*/
void writeNBytes(uint8_t opcode, uint32_t data, uint8_t n);
/* SPI 读函数,只读取4个字节。id无法正常读取。*/
/*先写opcode码,然后读取n个字节数据,n=1~4*/
uint32_t readNBytes(uint8_t opcode, uint8_t n);
/* 写数据到寄存器中 */
void writeRegister(uint8_t address, uint32_t data);
//定点浮点型转换为浮点数
float fixedPoint16ToFloat(uint32_t num);
//转整数
int fixedPoint16ToInt(uint32_t num);
/* 读取寄存器数据 */
uint32_t readRegister(uint32_t reg);
/* 读取结果 */
int16_t readUncalibratedResult(int address);
/*读取ALU的状态寄存器, ALU_OP_PTR. */
int getALUPointer(void);
/* 读取状态寄存器数据 */
uint16_t read_stat(void);
/*设备校准*/
uint32_t cail(void);

int test_gp2(void);

double get_tdc_phase_err(void);

#define     BITMASK(n)          ((uint32_t)((uint32_t)1 << n))
#define     CFG_REGISTER_MAX    (7)

#define     CFG0_ID0_0                    BITMASK(0)
#define     CFG0_ID0_1                    BITMASK(1)
#define     CFG0_ID0_2                    BITMASK(2)
#define     CFG0_ID0_3                    BITMASK(3)
#define     CFG0_ID0_4                    BITMASK(4)
#define     CFG0_ID0_5                    BITMASK(5)
#define     CFG0_ID0_6                    BITMASK(6)
#define     CFG0_ID0_7                    BITMASK(7)
#define     CFG0_NEG_START                BITMASK(8)
#define     CFG0_NEG_STOP1                BITMASK(9)
#define     CFG0_NEG_STOP2                BITMASK(10)
#define     CFG0_MESSB2                   BITMASK(11)
#define     CFG0_NO_CAL_AUTO              BITMASK(12)
#define     CFG0_CALIBRATE                BITMASK(13)
#define     CFG0_SEL_ECLK_TMP             BITMASK(14)
#define     CFG0_ANZ_FAKE                 BITMASK(15)
#define     CFG0_TCYCLE                   BITMASK(16)
#define     CFG0_ANZ_PORT                 BITMASK(17)
#define     CFG0_START_CLKHS_START_0      BITMASK(18)
#define     CFG0_START_CLKHS_START_1      BITMASK(19)
#define     CFG0_DIV_CLKHS_0              BITMASK(20)
#define     CFG0_DIV_CLKHS_1              BITMASK(21)
#define     CFG0_ANZ_PER_CALRES_0         BITMASK(22)
#define     CFG0_ANZ_PER_CALRES_1         BITMASK(23)
#define     CFG0_DIV_FIRE_0               BITMASK(24)
#define     CFG0_DIV_FIRE_1               BITMASK(25)
#define     CFG0_DIV_FIRE_2               BITMASK(26)
#define     CFG0_DIV_FIRE_3               BITMASK(27)
#define     CFG0_ANZ_FIRE_START_0         BITMASK(28)
#define     CFG0_ANZ_FIRE_START_1         BITMASK(29)
#define     CFG0_ANZ_FIRE_START_2         BITMASK(30)
#define     CFG0_ANZ_FIRE_START_3         BITMASK(31)
#define     CFG1_ID1_0                    BITMASK(0)
#define     CFG1_ID1_1                    BITMASK(1)
#define     CFG1_ID1_2                    BITMASK(2)
#define     CFG1_ID1_3                    BITMASK(3)
#define     CFG1_ID1_4                    BITMASK(4)
#define     CFG1_ID1_5                    BITMASK(5)
#define     CFG1_ID1_6                    BITMASK(6)
#define     CFG1_ID1_7                    BITMASK(7)
#define     CFG1_SEL_TSTO1_0              BITMASK(8)
#define     CFG1_SEL_TSTO1_1              BITMASK(9)
#define     CFG1_SEL_TSTO1_2              BITMASK(10)
#define     CFG1_SEL_TSTO2_0              BITMASK(11)
#define     CFG1_SEL_TSTO2_1              BITMASK(12)
#define     CFG1_SEL_TSTO2_2              BITMASK(13)
#define     CFG1_SEL_START_FIRE           BITMASK(14)
#define     CFG1_CURR32K                  BITMASK(15)
#define     CFG1_HITIN1_0                 BITMASK(16)
#define     CFG1_HITIN1_1                 BITMASK(17)
#define     CFG1_HITIN1_2                 BITMASK(18)
#define     CFG1_HITIN2_0                 BITMASK(19)
#define     CFG1_HITIN2_1                 BITMASK(20)
#define     CFG1_HITIN2_2                 BITMASK(21)
#define     CFG1_KEEP_DEFAULT             BITMASK(22)
#define     CFG1_EN_FAST_INIT             BITMASK(23)
#define     CFG1_HIT1_0                   BITMASK(24)
#define     CFG1_HIT1_1                   BITMASK(25)
#define     CFG1_HIT1_2                   BITMASK(26)
#define     CFG1_HIT1_3                   BITMASK(27)
#define     CFG1_HIT2_0                   BITMASK(28)
#define     CFG1_HIT2_1                   BITMASK(29)
#define     CFG1_HIT2_2                   BITMASK(30)
#define     CFG1_HIT2_3                   BITMASK(31)
#define     CFG2_ID2_0                    BITMASK(0)
#define     CFG2_ID2_1                    BITMASK(1)
#define     CFG2_ID2_2                    BITMASK(2)
#define     CFG2_ID2_3                    BITMASK(3)
#define     CFG2_ID2_4                    BITMASK(4)
#define     CFG2_ID2_5                    BITMASK(5)
#define     CFG2_ID2_6                    BITMASK(6)
#define     CFG2_ID2_7                    BITMASK(7)
#define     CFG2_DELVAL1_0                BITMASK(8)
#define     CFG2_DELVAL1_1                BITMASK(9)
#define     CFG2_DELVAL1_2                BITMASK(10)
#define     CFG2_DELVAL1_3                BITMASK(11)
#define     CFG2_DELVAL1_4                BITMASK(12)
#define     CFG2_DELVAL1_5                BITMASK(13)
#define     CFG2_DELVAL1_6                BITMASK(14)
#define     CFG2_DELVAL1_7                BITMASK(15)
#define     CFG2_DELVAL1_8                BITMASK(16)
#define     CFG2_DELVAL1_9                BITMASK(17)
#define     CFG2_DELVAL1_10               BITMASK(18)
#define     CFG2_DELVAL1_11               BITMASK(19)
#define     CFG2_DELVAL1_12               BITMASK(20)
#define     CFG2_DELVAL1_13               BITMASK(21)
#define     CFG2_DELVAL1_14               BITMASK(22)
#define     CFG2_DELVAL1_15               BITMASK(23)
#define     CFG2_DELVAL1_16               BITMASK(24)
#define     CFG2_DELVAL1_17               BITMASK(25)
#define     CFG2_DELVAL1_18               BITMASK(26)
#define     CFG2_RFEDGE1                  BITMASK(27)
#define     CFG2_RFEDGE2                  BITMASK(28)
#define     CFG2_EN_INT_ALU               BITMASK(29)
#define     CFG2_EN_INT_HITS              BITMASK(30)
#define     CFG2_EN_INT_TDC_TIMEOUT       BITMASK(31)
#define     CFG3_ID3_0                    BITMASK(0)
#define     CFG3_ID3_1                    BITMASK(1)
#define     CFG3_ID3_2                    BITMASK(2)
#define     CFG3_ID3_3                    BITMASK(3)
#define     CFG3_ID3_4                    BITMASK(4)
#define     CFG3_ID3_5                    BITMASK(5)
#define     CFG3_ID3_6                    BITMASK(6)
#define     CFG3_ID3_7                    BITMASK(7)
#define     CFG3_DELVAL2_0                BITMASK(8)
#define     CFG3_DELVAL2_1                BITMASK(9)
#define     CFG3_DELVAL2_2                BITMASK(10)
#define     CFG3_DELVAL2_3                BITMASK(11)
#define     CFG3_DELVAL2_4                BITMASK(12)
#define     CFG3_DELVAL2_5                BITMASK(13)
#define     CFG3_DELVAL2_6                BITMASK(14)
#define     CFG3_DELVAL2_7                BITMASK(15)
#define     CFG3_DELVAL2_8                BITMASK(16)
#define     CFG3_DELVAL2_9                BITMASK(17)
#define     CFG3_DELVAL2_10               BITMASK(18)
#define     CFG3_DELVAL2_11               BITMASK(19)
#define     CFG3_DELVAL2_12               BITMASK(20)
#define     CFG3_DELVAL2_13               BITMASK(21)
#define     CFG3_DELVAL2_14               BITMASK(22)
#define     CFG3_DELVAL2_15               BITMASK(23)
#define     CFG3_DELVAL2_16               BITMASK(24)
#define     CFG3_DELVAL2_17               BITMASK(25)
#define     CFG3_DELVAL2_18               BITMASK(26)
#define     CFG3_SEL_TIMO_MB2_0           BITMASK(27)
#define     CFG3_SEL_TIMO_MB2_1           BITMASK(28)
#define     CFG3_EN_ERR_VAL               BITMASK(29)
#define     CFG3_EN_FIRST_WAVE            BITMASK(30)
#define     CFG3_EN_AUTOCALC_MB2          BITMASK(31)
#define     CFG4_ID4_0                    BITMASK(0)
#define     CFG4_ID4_1                    BITMASK(1)
#define     CFG4_ID4_2                    BITMASK(2)
#define     CFG4_ID4_3                    BITMASK(3)
#define     CFG4_ID4_4                    BITMASK(4)
#define     CFG4_ID4_5                    BITMASK(5)
#define     CFG4_ID4_6                    BITMASK(6)
#define     CFG4_ID4_7                    BITMASK(7)
#define     CFG4_DELVAL3_0                BITMASK(8)
#define     CFG4_DELVAL3_1                BITMASK(9)
#define     CFG4_DELVAL3_2                BITMASK(10)
#define     CFG4_DELVAL3_3                BITMASK(11)
#define     CFG4_DELVAL3_4                BITMASK(12)
#define     CFG4_DELVAL3_5                BITMASK(13)
#define     CFG4_DELVAL3_6                BITMASK(14)
#define     CFG4_DELVAL3_7                BITMASK(15)
#define     CFG4_DELVAL3_8                BITMASK(16)
#define     CFG4_DELVAL3_9                BITMASK(17)
#define     CFG4_DELVAL3_10               BITMASK(18)
#define     CFG4_DELVAL3_11               BITMASK(19)
#define     CFG4_DELVAL3_12               BITMASK(20)
#define     CFG4_DELVAL3_13               BITMASK(21)
#define     CFG4_DELVAL3_14               BITMASK(22)
#define     CFG4_DELVAL3_15               BITMASK(23)
#define     CFG4_DELVAL3_16               BITMASK(24)
#define     CFG4_DELVAL3_17               BITMASK(25)
#define     CFG4_DELVAL3_18               BITMASK(26)
#define     CFG4_KEEP_DEFAULT_0           BITMASK(27)
#define     CFG4_KEEP_DEFAULT_1           BITMASK(28)
#define     CFG4_KEEP_DEFAULT_2           BITMASK(29)
#define     CFG4_KEEP_DEFAULT_3           BITMASK(30)
#define     CFG4_KEEP_DEFAULT_4           BITMASK(31)
#define     CFG3FW_ID3_0                    BITMASK(0)
#define     CFG3FW_ID3_1                    BITMASK(1)
#define     CFG3FW_ID3_2                    BITMASK(2)
#define     CFG3FW_ID3_3                    BITMASK(3)
#define     CFG3FW_ID3_4                    BITMASK(4)
#define     CFG3FW_ID3_5                    BITMASK(5)
#define     CFG3FW_ID3_6                    BITMASK(6)
#define     CFG3FW_ID3_7                    BITMASK(7)
#define     CFG3FW_DELREL1_0                BITMASK(8)
#define     CFG3FW_DELREL1_1                BITMASK(9)
#define     CFG3FW_DELREL1_2                BITMASK(10)
#define     CFG3FW_DELREL1_3                BITMASK(11)
#define     CFG3FW_DELREL1_4                BITMASK(12)
#define     CFG3FW_DELREL1_5                BITMASK(13)
#define     CFG3FW_DELREL2_0                BITMASK(14)
#define     CFG3FW_DELREL2_1                BITMASK(15)
#define     CFG3FW_DELREL2_2                BITMASK(16)
#define     CFG3FW_DELREL2_3                BITMASK(17)
#define     CFG3FW_DELREL2_4                BITMASK(18)
#define     CFG3FW_DELREL2_5                BITMASK(19)
#define     CFG3FW_DELREL3_0                BITMASK(20)
#define     CFG3FW_DELREL3_1                BITMASK(21)
#define     CFG3FW_DELREL3_2                BITMASK(22)
#define     CFG3FW_DELREL3_3                BITMASK(23)
#define     CFG3FW_DELREL3_4                BITMASK(24)
#define     CFG3FW_DELREL3_5                BITMASK(25)
#define     CFG3FW_KEEP_DEFAULT             BITMASK(26)
#define     CFG3FW_SEL_TIMO_MB2_0           BITMASK(27)
#define     CFG3FW_SEL_TIMO_MB2_1           BITMASK(28)
#define     CFG3FW_EN_ERR_VAL               BITMASK(29)
#define     CFG3FW_EN_FIRST_WAVE            BITMASK(30)
#define     CFG3FW_EN_AUTOCALC_MB2          BITMASK(31)
#define     CFG4FW_ID4_0                    BITMASK(0)
#define     CFG4FW_ID4_1                    BITMASK(1)
#define     CFG4FW_ID4_2                    BITMASK(2)
#define     CFG4FW_ID4_3                    BITMASK(3)
#define     CFG4FW_ID4_4                    BITMASK(4)
#define     CFG4FW_ID4_5                    BITMASK(5)
#define     CFG4FW_ID4_6                    BITMASK(6)
#define     CFG4FW_ID4_7                    BITMASK(7)
#define     CFG4FW_OFFS_0                   BITMASK(8)
#define     CFG4FW_OFFS_1                   BITMASK(9)
#define     CFG4FW_OFFS_2                   BITMASK(10)
#define     CFG4FW_OFFS_3                   BITMASK(11)
#define     CFG4FW_OFFS_4                   BITMASK(12)
#define     CFG4FW_OFFSRNG1                 BITMASK(13)
#define     CFG4FW_OFFSRNG2                 BITMASK(14)
#define     CFG4FW_EDGE_FW                  BITMASK(15)
#define     CFG4FW_DIS_PW                   BITMASK(16)
#define     CFG4FW_KEEP_DEFAULT_0           BITMASK(17)
#define     CFG4FW_KEEP_DEFAULT_1           BITMASK(18)
#define     CFG4FW_KEEP_DEFAULT_2           BITMASK(19)
#define     CFG4FW_KEEP_DEFAULT_3           BITMASK(20)
#define     CFG4FW_KEEP_DEFAULT_4           BITMASK(21)
#define     CFG4FW_KEEP_DEFAULT_5           BITMASK(22)
#define     CFG4FW_KEEP_DEFAULT_6           BITMASK(23)
#define     CFG4FW_KEEP_DEFAULT_7           BITMASK(24)
#define     CFG4FW_KEEP_DEFAULT_8           BITMASK(25)
#define     CFG4FW_KEEP_DEFAULT_9           BITMASK(26)
#define     CFG4FW_KEEP_DEFAULT_10          BITMASK(27)
#define     CFG4FW_KEEP_DEFAULT_11          BITMASK(28)
#define     CFG4FW_KEEP_DEFAULT_12          BITMASK(29)
#define     CFG4FW_KEEP_DEFAULT_13          BITMASK(30)
#define     CFG4FW_KEEP_DEFAULT_14          BITMASK(31)
#define     CFG5_ID5_0                    BITMASK(0)
#define     CFG5_ID5_1                    BITMASK(1)
#define     CFG5_ID5_2                    BITMASK(2)
#define     CFG5_ID5_3                    BITMASK(3)
#define     CFG5_ID5_4                    BITMASK(4)
#define     CFG5_ID5_5                    BITMASK(5)
#define     CFG5_ID5_6                    BITMASK(6)
#define     CFG5_ID5_7                    BITMASK(7)
#define     CFG5_PHFIRE_0                 BITMASK(8)
#define     CFG5_PHFIRE_1                 BITMASK(9)
#define     CFG5_PHFIRE_2                 BITMASK(10)
#define     CFG5_PHFIRE_3                 BITMASK(11)
#define     CFG5_PHFIRE_4                 BITMASK(12)
#define     CFG5_PHFIRE_5                 BITMASK(13)
#define     CFG5_PHFIRE_6                 BITMASK(14)
#define     CFG5_PHFIRE_7                 BITMASK(15)
#define     CFG5_PHFIRE_8                 BITMASK(16)
#define     CFG5_PHFIRE_9                 BITMASK(17)
#define     CFG5_PHFIRE_10                BITMASK(18)
#define     CFG5_PHFIRE_11                BITMASK(19)
#define     CFG5_PHFIRE_12                BITMASK(20)
#define     CFG5_PHFIRE_13                BITMASK(21)
#define     CFG5_PHFIRE_14                BITMASK(22)
#define     CFG5_PHFIRE_15                BITMASK(23)
#define     CFG5_REPEAT_FIRE_0            BITMASK(24)
#define     CFG5_REPEAT_FIRE_1            BITMASK(25)
#define     CFG5_REPEAT_FIRE_2            BITMASK(26)
#define     CFG5_DIS_PHASESHIFT           BITMASK(27)
#define     CFG5_EN_STARTNOISE            BITMASK(28)
#define     CFG5_CON_FIRE_0               BITMASK(29)
#define     CFG5_CON_FIRE_1               BITMASK(30)
#define     CFG5_CON_FIRE_2               BITMASK(31)
#define     CFG6_ID6_0                    BITMASK(0)
#define     CFG6_ID6_1                    BITMASK(1)
#define     CFG6_ID6_2                    BITMASK(2)
#define     CFG6_ID6_3                    BITMASK(3)
#define     CFG6_ID6_4                    BITMASK(4)
#define     CFG6_ID6_5                    BITMASK(5)
#define     CFG6_ID6_6                    BITMASK(6)
#define     CFG6_ID6_7                    BITMASK(7)
#define     CFG6_ANZ_FIRE_END_0           BITMASK(8)
#define     CFG6_ANZ_FIRE_END_1           BITMASK(9)
#define     CFG6_ANZ_FIRE_END_2           BITMASK(10)
#define     CFG6_TEMP_PORTDIR             BITMASK(11)
#define     CFG6_DOUBLE_RES               BITMASK(12)
#define     CFG6_QUAD_RES                 BITMASK(13)
#define     CFG6_FIREO_DEF                BITMASK(14)
#define     CFG6_HZ60                     BITMASK(15)
#define     CFG6_CYCLE_TOF_0              BITMASK(16)
#define     CFG6_CYCLE_TOF_1              BITMASK(17)
#define     CFG6_CYCLE_TEMP_0             BITMASK(18)
#define     CFG6_CYCLE_TEMP_1             BITMASK(19)
#define     CFG6_START_CLKHS_END          BITMASK(20)
#define     CFG6_EN_INT_END               BITMASK(21)
#define     CFG6_TW2_0                    BITMASK(22)
#define     CFG6_TW2_1                    BITMASK(23)
#define     CFG6_EMPTY_0                  BITMASK(24)
#define     CFG6_DA_KORR_0                BITMASK(25)
#define     CFG6_DA_KORR_1                BITMASK(26)
#define     CFG6_DA_KORR_2                BITMASK(27)
#define     CFG6_DA_KORR_3                BITMASK(28)
#define     CFG6_EMPTY_1                  BITMASK(29)
#define     CFG6_NEG_STOP_TEMP            BITMASK(30)
#define     CFG6_EN_ANALOG                BITMASK(31)

/* 读寄存器 */
#define READ_RES_0  (0)
#define READ_RES_1  (1)
#define READ_RES_2  (2)
#define READ_RES_3  (3)
#define READ_STAT   (4)
#define READ_REG_1  (5)
#define READ_PW1ST  (6)
#define READ_MAX    (7)

/* Opcodes 操作码*/
#define OPCODE_WRITE_ADDRESS        (0x80) //3 LSB are the address to write
#define OPCODE_READ_ADDRESS         (0xB0) //3 LSB are the address to read
#define OPCODE_READ_ID              (0xB7)
#define OPCODE_READ_PW1ST           (0xB8)
#define OPCODE_EEPROM_SAVE          (0xC0) //Write configuration registers into EEPROM
#define OPCODE_EEPROM_RESTORE       (0xF0) //Transfer EEPROM content into configuration registers
#define OPCODE_EEPROM_COMPARE       (0xC6) //Compare configuration registers with EEPROM
#define OPCODE_INIT                 (0x70)
#define OPCODE_POWER_ON_RESET       (0x50)
#define OPCODE_START_TOF            (0x01)
#define OPCODE_START_TEMP           (0x02)
#define OPCODE_START_CAL_RESONATOR  (0x03)
#define OPCODE_START_CAL_TDC        (0x04)
#define OPCODE_START_TOF_RESTART    (0x05)
#define OPCODE_START_TEMP_RESTART   (0x06)

#define STAT_ALU_OP_PTR             (1 << 0)
#define STAT_HITS_CH1               (1 << 3)
#define STAT_HITS_CH2               (1 << 6)
#define STAT_TIMEOUT_TDC            (1 << 9)
#define STATUS_TIMEOUT_PRECOUNTER   (1 << 10)
#define STAT_ERROR_OPEN             (1 << 11)
#define STAT_ERROR_SHORT            (1 << 12)
#define STAT_EEPROM_ERROR           (1 << 13)
#define STAT_EEPROM_DED             (1 << 14)
#define STAT_EEPROM_EQ_CREG         (1 << 15)

/* 复位时默认寄存器数据 */
extern const uint32_t CFG_DEFAULT_BITMASKS[];
extern const uint32_t CFG_KEEP_DEFAULT_BITMASKS[];
/* 寄存器定义哪些要读取 */
extern const uint8_t READ_REGISTER_ADDRS[];
/* 对应寄存器需要读取多少二进制位 */
extern const uint8_t READ_REGISTER_LENGTHS[];
extern const int BYTE_DELAY_MICROSECONDS;

#define HS_CLK_FREQ_HZ   (5000000) // External 4 Mhz resonator
#define REF_CLK_FREQ_HZ   (32768) // Internal 32 kHz clock
#define HS_CLK_PERIOD_NS   (1000000000 / HS_CLK_FREQ_HZ) // Period of 4 MHz resonator, aka Tref
#define  DEFAULT_ANZ_PER_CALRES   (3)// use 16 periods, 488.281 us
#endif 

注意事项:使用的是未校准模式。可以自行校准

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值