TDC-GP22(SSP1922)高精度时间测量

SSP1922头文件

#ifndef _SSP1922_H_
#define _SSP1922_H_

#include "gd32f3x0_gpio.h"
#include "systick.h"
//#include "core_cmInstr.h"

extern uint8_t ALU_INT_FLAG;
//extern uint8_t	count;

	//TDC_RST	--	PA1
	//SPI_SCLK	--	PA5
	//SPI_MOSI	--	PA7	
	
	//SPI_CS	--	PB0
	//EN_START	--	PB3		//START信号使能	
	
	//TDC_INTN	--	PA3		//ALU计算中断输入
	//SPI_MISO	--	PA6	 	//SPI数据输入
#define TDC_RST_H		gpio_bit_set(GPIOA, GPIO_PIN_1)
#define TDC_RST_L		gpio_bit_reset(GPIOA, GPIO_PIN_1)

#define SPI_SCLK_H		gpio_bit_set(GPIOA, GPIO_PIN_5)
#define SPI_SCLK_L		gpio_bit_reset(GPIOA, GPIO_PIN_5)

#define SPI_MOSI_H		gpio_bit_set(GPIOA, GPIO_PIN_7)
#define SPI_MOSI_L		gpio_bit_reset(GPIOA, GPIO_PIN_7)

#define SPI_CS_H		gpio_bit_set(GPIOB, GPIO_PIN_0)	
#define SPI_CS_L		gpio_bit_reset(GPIOB, GPIO_PIN_0)

#define EN_START_H		gpio_bit_set(GPIOB, GPIO_PIN_3)
#define EN_START_L		gpio_bit_reset(GPIOB, GPIO_PIN_3)

#define SPI_MISO_IN		gpio_input_bit_get(GPIOA, GPIO_PIN_6)


#define Init()					Write_Order(0x70)
#define Power_on_Reset()		Write_Order(0X50)
#define Start_TOF()				Write_Order(0X01)
#define Start_Temp()			Write_Order(0X02)
#define Start_Cal_Resonator()	Write_Order(0X03)
#define Start_Cal_TDC()			Write_Order(0X04)
#define Start_TOF_Restart()		Write_Order(0X05)
#define Start_Temp_Restart()	Write_Order(0X06)

void GPIO_Config(void);
void RST_TDC(void);
void SPI_Init(void);
void SPI_ENABLE(void);
void SPI_DISABLE(void);
void SEND_0(void);
void SEND_1(void);
void SPI_WRITE8(uint8_t wbuf8);
uint8_t SPI_READ8(void);
void SPI_WRITE32(uint32_t wbuf32);
uint32_t SPI_READ32(void);
uint16_t SPI_READ16(void);
void Write_Reg(uint8_t RegNum,uint32_t RegData);
uint32_t Read_Reg(uint8_t RegNum);
uint16_t Read_STAT(void);
uint8_t Read_PW1ST(void);
uint8_t Read_REG_1(void);
void Write_Order(uint8_t Order);
void ssp1922_Config(void);

SSP1922.c文件

#include "ssp1922.h"

uint8_t ALU_INT_FLAG; 


void GPIO_Config(void)
{
	
	//TDC_RST	--	PA1
	//SPI_SCLK	--	PA5
	//SPI_MOSI	--	PA7	
	
	//SPI_CS	--	PB0
	//EN_START	--	PB3		//START信号使能	
	
	//TDC_INTN	--	PA3		//ALU计算中断输入
	//SPI_MISO	--	PA6	 	//SPI数据输入
	
	
	rcu_periph_clock_enable(RCU_GPIOA);
    /* configure led GPIO port */ 
    gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_1|GPIO_PIN_5|GPIO_PIN_7);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_1|GPIO_PIN_5|GPIO_PIN_7);

	rcu_periph_clock_enable(RCU_GPIOB);
    /* configure led GPIO port */ 
    gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_0|GPIO_PIN_3);
    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0|GPIO_PIN_3);	
	
	
	rcu_periph_clock_enable(RCU_GPIOA);
    gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_3|GPIO_PIN_6);
	
    rcu_periph_clock_enable(RCU_CFGCMP);
    /* enable and set key EXTI interrupt to the lowest priority */
    nvic_irq_enable(EXTI2_3_IRQn, 0, 2);

    /* connect key EXTI line to key GPIO pin */
    syscfg_exti_line_config(EXTI_SOURCE_GPIOA, EXTI_SOURCE_PIN3);

    /* configure key EXTI line */
    exti_init(EXTI_3, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
    exti_interrupt_flag_clear(EXTI_3);	
	
	//TDC_RST	--	PA1
	//SPI_SCLK	--	PA5
	//SPI_MOSI	--	PA7	
	
	//SPI_CS	--	PB0
	//EN_START	--	PB3		//START信号使能	
	
	//TDC_INTN	--	PA3		//ALU计算中断输入
	//SPI_MISO	--	PA6	 	//SPI数据输入	

    TDC_RST_H;
	SPI_SCLK_L;
	SPI_MOSI_L;
	SPI_CS_H;
	EN_START_L;
}

void RST_TDC(void)
{
	TDC_RST_L;
	delay_1ms(20);
	TDC_RST_H;
	EN_START_H;
	
}

void SPI_Init(void)
{
	
	SPI_CS_H;
	SPI_MOSI_L;
	SPI_SCLK_L;
	__NOP;
	__NOP;
	__NOP;
}

void SPI_ENABLE(void)
{
	SPI_CS_L;
	__NOP;
	__NOP;
	__NOP;	
}

void SPI_DISABLE(void)
{
	SPI_CS_L;
	__NOP;
	__NOP;
	__NOP;
	SPI_CS_H;
	__NOP;
	__NOP;
	__NOP;	
}

void SEND_0(void)
{
	SPI_MOSI_L;
	__NOP;
	SPI_SCLK_H;
	__NOP;
	SPI_SCLK_L;
	__NOP;
}

void SEND_1(void)
{
	SPI_MOSI_H;
	__NOP;
	SPI_SCLK_H;
	__NOP;
	SPI_SCLK_L;
	__NOP;
}

void SPI_WRITE8(uint8_t wbuf8)
{
	uint8_t cnt,MSB8 = 0x80;
	
	SPI_SCLK_L;
	__NOP;
	for(cnt = 8; cnt>0; cnt--)
	{
		if(wbuf8&MSB8)
		{
			SEND_1();
		}
		else
		{
			SEND_0();
		}
		wbuf8 <<= 1;
	}

}

uint8_t SPI_READ8(void)
{
	uint8_t cnt;
	uint8_t	LSB8 = 0x01;
	uint8_t	rbuf8 = 0x00;

	SPI_SCLK_L;
	__NOP;	
	for(cnt = 8; cnt > 0 ;cnt--)
	{
		rbuf8 <<= 1;
		SPI_SCLK_H;
		__NOP;
		
		if(SPI_MISO_IN)
		{
			rbuf8 |= LSB8;
		}
		SPI_SCLK_L;
		__NOP;	
	}
	return rbuf8;
	
}

void SPI_WRITE32(uint32_t wbuf32)
{
	uint8_t  cnt;
	uint32_t MSB32 = 0x80000000;
	
	SPI_SCLK_L;
	__NOP;
	for(cnt=32;cnt>0;cnt--)
	{
		if(wbuf32 & MSB32)
		   SEND_1();
		else
		   SEND_0();
		wbuf32 <<= 1;
	}
}

uint32_t SPI_READ32(void)
{
	uint8_t cnt;
	uint32_t LSB32 = 0x00000001;
	uint32_t rbuf32 = 0x00000000;

	SPI_SCLK_L;
	__NOP;
	
	for(cnt=32;cnt>0;cnt--)
	{
		rbuf32 <<=1;
		SPI_SCLK_H;
		__NOP;
		
		if(SPI_MISO_IN)
		{
			rbuf32 |= LSB32;
		}
		SPI_SCLK_L;
		__NOP;
	}
	return rbuf32;	
	
}

uint16_t SPI_READ16(void)
{
	uint8_t cnt;
	uint16_t LSB16 = 0x0001;
	uint16_t rbuf16 = 0x0000;

	SPI_SCLK_L;
	__NOP;
	for(cnt=16;cnt>0;cnt--)
	{
		rbuf16 <<=1;
		SPI_SCLK_H;
		__NOP;
		
		if( SPI_MISO_IN )
		   rbuf16 |= LSB16;
		
		SPI_SCLK_L;
		__NOP;
	}
	return rbuf16;	
	
}
void Write_Reg(uint8_t RegNum,uint32_t RegData)
{
	SPI_Init();
	SPI_ENABLE();
	SPI_WRITE8(0x80|RegNum);
	SPI_WRITE32(RegData);
	SPI_DISABLE();
	
}
uint32_t Read_Reg(uint8_t RegNum)
{
	uint32_t ReadData = 0;
	SPI_Init();
	SPI_ENABLE();
	SPI_WRITE8(0xB0|RegNum);
	ReadData = SPI_READ32();
	SPI_DISABLE();
	return ReadData;	
}

uint16_t Read_STAT(void)
{
	uint16_t ReadData = 0;
	SPI_Init();
	SPI_ENABLE();
	SPI_WRITE8(0xB4);
	ReadData = SPI_READ16();
	SPI_DISABLE();
	return ReadData;	
}

uint8_t Read_PW1ST(void)
{
	uint8_t ReadData = 0;
	SPI_Init();
	SPI_ENABLE();
	SPI_WRITE8(0xB8);
	ReadData = SPI_READ8();
	SPI_DISABLE();
	return ReadData;
}

uint8_t Read_REG_1(void)
{
	uint8_t ReadData = 0;
	SPI_Init();
	SPI_ENABLE();
	SPI_WRITE8(0xB5);
	ReadData = SPI_READ8();
	SPI_DISABLE();
	return ReadData;
}


void Write_Order(uint8_t Order)
{
        SPI_Init();
        SPI_ENABLE();
        SPI_WRITE8(Order);
        SPI_DISABLE();
}

void ssp1922_Config(void)
{
	uint32_t REG0,REG1,REG2,REG3,REG4,REG5,REG6;
	
	REG0 = 0x00342400;
	//bit31-bit28		ANZ_FIRE[3:0] = 0  关闭 设置fire端口发射的脉冲个数
	//bit27-bit24		DIV_FIRE = 0	不分频	设置内部时钟信号产生脉冲的分频因数
	//bit23-bit22		ANZ_PER_CALRES(CALRES#)
	//bit10	= 1			STOP通道2下降沿
	REG1 = 0x01490000;	//上升沿测量	ALU = 1.Stop Ch1 - START
	
	//REG1 = 0x09490000;	//ALU = 1.Stop Ch2 - START	下降沿测量
//	REG1 = 0x19490000;		//ALU = 1.Stop Ch2 - 1.Stop Ch1	脉宽测量
	//bit31-bit28		HIT2 = 0 = START	HIT2 = 1 = 1.Stop Ch1
	//bit27-bit24		HIT1 = 1 = 1.Stop Ch1	HIT1 = 9 = 1.Stop Ch2
	//bit21-bit19		HITIN2 = 1	在STOP通道2的预期脉冲数		1=1个脉冲
	//bit18-bit16		HITIN1 = 1	在STOP通道1的预期脉冲数		1=1个脉冲
	
	REG2 = 0xA0000000;
	//bit29 = 1 	ALU中断触发位
	
	REG3 = 0x00000000;
	REG4 = 0x20000000;
	//默认配置
	REG5 = 0x08000000;
	REG6 = 0x00200000;
	
	Write_Reg(0,REG0);
	Write_Reg(1,REG1);
	Write_Reg(2,REG2);
	Write_Reg(3,REG3);
	Write_Reg(4,REG4);
	Write_Reg(5,REG5);
	Write_Reg(6,REG6);
}

mian函数

int main(void)
{
	uint32_t	res0 = 0x00;
	uint8_t		datbuf0=0x00,datbuf1=0x00,datbuf2=0x00,datbuf3=0x00;
	uint8_t		txdat[15];
	uint32_t	reg1 = 0x00;
	uint16_t	STAT = 0x00;
	float	time_float = 0;
	uint32_t	time_int = 0x00;
		
//	uint8_t		test_dat = 0x00;	
	systick_config();

	txdat[0] = 0x5A;
	txdat[1] = 0x03;
	txdat[2] = 0x0A;
	txdat[3] = 0x00;
	txdat[4] = 0x0C;
	
	usart0_init();		//串口0初始化
	
	GPIO_Config();		//SSP1922IO初始化
	
	RST_TDC();			//SSP1922复位
	ssp1922_Config();	//SSP1922的7个寄存器配置
	delay_1ms(10);
	Init();
	delay_1ms(1);	

    while(1){	
//SPI通信测试 读配置寄存器RES1的高8位
//		test_dat = Read_REG_1();
//		usart0_send_ch(test_dat);
		
		if(ALU_INT_FLAG == 1)
		{
			ALU_INT_FLAG = 0;
			
			STAT = Read_STAT();
			
			if((STAT & 0x0200) == 0x0000)
			{
				res0 = Read_Reg(0x00);
				
				datbuf0 = (res0>>24) & 0xFF;
				datbuf1 = (res0>>16) & 0xFF;
				datbuf2 = (res0>>8) & 0xFF;
				datbuf3 = res0 & 0xFF;	
				time_float = HEX_FLOAT(datbuf0,datbuf1,datbuf2,datbuf3);
				time_int = (uint32_t)(time_float*100000);
				
				datbuf0 = (time_int>>16) & 0xFF;
				datbuf1 = (time_int>>8) & 0xFF;
				datbuf2 = time_int & 0xFF;
				
				txdat[5] = datbuf2;
				txdat[6] = datbuf1;
				txdat[7] = datbuf0;		

				reg1 = 0x09490000;
				Write_Reg(1,reg1);
				delay_1ms(1);
//				delay_us(10);
				
				res0 = Read_Reg(0x01);
				
				datbuf0 = (res0>>24) & 0xFF;
				datbuf1 = (res0>>16) & 0xFF;
				datbuf2 = (res0>>8) & 0xFF;
				datbuf3 = res0 & 0xFF;	
				time_float = HEX_FLOAT(datbuf0,datbuf1,datbuf2,datbuf3);
				time_int = (uint32_t)(time_float*100000);
				
				datbuf0 = (time_int>>16) & 0xFF;
				datbuf1 = (time_int>>8) & 0xFF;
				datbuf2 = time_int & 0xFF;
				
				txdat[8] = datbuf2;
				txdat[9] = datbuf1;
				txdat[10] = datbuf0;	
				
				
				reg1 = 0x19490000;
				Write_Reg(1,reg1);
				delay_1ms(1);
//				delay_us(10);

				res0 = Read_Reg(0x02);

				datbuf0 = (res0>>24) & 0xFF;
				datbuf1 = (res0>>16) & 0xFF;
				datbuf2 = (res0>>8) & 0xFF;
				datbuf3 = res0 & 0xFF;	
				time_float = HEX_FLOAT(datbuf0,datbuf1,datbuf2,datbuf3);
				time_int = (uint32_t)(time_float*100000);
				
				datbuf0 = (time_int>>16) & 0xFF;
				datbuf1 = (time_int>>8) & 0xFF;
				datbuf2 = time_int & 0xFF;
				
				txdat[11] = datbuf2;
				txdat[12] = datbuf1;
				txdat[13] = datbuf0;	
				txdat[14] = Check_Sum(&txdat[1],13);
				
				uart0_Send_Array(txdat,15);			
			}
			
			ssp1922_Config();
			delay_1ms(10);
			Init();			
			delay_1ms(1);
			
		}
    }
}
TDC-GP22 是一款专为时差法管路流量测量设计的高精度芯片,特别适用于小管径流量测量。该芯片通过内置脉冲发生器,无需额外驱动电路即可驱动换能器,显著降低成本并简化设计[^2]。为了更好地使用 TDC-GP22 并充分发挥其性能优势,以下是技术手册和使用指南的关键信息。 ### 技术手册内容概要 1. **核心功能** TDC-GP22 提供高精度时间测量,保障测量结果的准确性。其内部的脉冲发生器能够在不增加额外驱动电路的情况下,使换能器正常工作,大大降低了成本,简化了设计。 2. **芯片特点** - **精度高**:TDC-GP22 提供高精度时间测量,保障测量结果的准确性。 - **功耗低**:芯片具有较低的功耗,适用于节能型应用。 - **封装小**:小巧的封装便于集成到各种尺寸的设备中。 - **集成度高**:高度集成的芯片设计,有助于降低系统复杂性[^5]。 3. **应用场景** TDC-GP22 特别适合对精度和成本敏感的工业应用场景,尤其是在超声波水表等小管径流量测量中表现尤为出色[^2]。 ### 使用指南 1. **开始之前的准备** 在使用 TDC-GP22 之前,务必仔细阅读《TDC-GP22 用户手册》,以了解其基本特性。对照官方寄存器配置说明,结合 STM32 驱动程序,理解每一行代码背后的逻辑,实现对 TDC-GP22 的精准控制。接线图应作为实际布线的直接依据,确保硬件层面无误[^1]。 2. **注意事项文档** 注意事项文档包含了实践中遇到的关键点和建议,避免常见错误,优化开发过程中的效率与效果。文档中的每一条都是前人踩过的坑,认真阅读可以节省大量调试时间[^1]。 3. **资源下载** 用户可以通过以下链接下载 TDC-GP22 的用户手册和相关资源: - [TDC-GP22 用户手册下载](https://gitcode.com/Open-source-documentation-tutorial/dacbc)[^2] - [TDC-GP22 用户手册资源下载](https://gitcode.com/Open-source-documentation-tutorial/dacbc) 4. **超声波水表应用指南** TDC-GP22 用户手册资源下载是一个专为超声波水表用户设计的下载仓库。在这个仓库中,用户可以获取到一份详尽的手册,涵盖了 TDC-GP22 超声波水表的应用、操作方法以及实际应用场景。这份手册对于想要深入理解并高效使用 TDC-GP22 超声波水表的用户来说,无疑是一份宝贵的资源[^4]。 ### 示例代码 以下是一个简单的示例代码,展示如何通过 STM32 驱动程序TDC-GP22 进行通信: ```c #include "stm32f4xx_hal.h" // 初始化 TDC-GP22 void TDC_GP22_Init(void) { // 配置 GPIO 和 SPI // ... } // 发送命令到 TDC-GP22 void TDC_GP22_SendCommand(uint8_t command) { HAL_SPI_Transmit(&hspi1, &command, 1, HAL_MAX_DELAY); } // 接收数据从 TDC-GP22 uint8_t TDC_GP22_ReceiveData(void) { uint8_t data; HAL_SPI_Receive(&hspi1, &data, 1, HAL_MAX_DELAY); return data; } ``` 以上代码仅为示例,具体实现需根据实际硬件和项目需求进行调整。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值