驱动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
注意事项:使用的是未校准模式。可以自行校准