• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

stm32HAL库控制TDC-GP22激光测距

武飞扬头像
飞飞飞~
帮助1

通信协议

学新通
SPI通信速率:在3.3V供电电压下,最大为20Mhz
SPI通信格式:时钟相位=1,时钟极性==0;
cubeMX的配置如下图所示:学新通

数据的写入与读取

对于EEPROM的写入与数据的写入与读取一般遵循:控制指令码 寄存器地址 数据
学新通

TDC-GP22与stm32之间的连接

CJ-MCU公司为tdc-gp22做了封装,在某宝中可以买到这个板子。
根据官方所提供的原理图,模式一脉冲激光测距的引脚对应图如下表所示:

stm32 tdc-gp22
3.3V vcc
GND GND
3.3V dis
gpiox intn
gpiox ssn
sck sck
mosi si
miso so
gpiox rtn
gpiox sta
gpiox sp1

stm32HAL库程序编写

void gp22_wr_config_reg(uint8_t opcode_address, uint32_t config_reg_data)   //配置寄存器
{
	uint8_t temp[5];
	temp[0] = opcode_address;
	temp[1] = (uint8_t) ((config_reg_data)>>24);
  temp[2] = (uint8_t) ((config_reg_data)>>16);
	temp[3] = (uint8_t) ((config_reg_data)>>8);
	temp[4] = (uint8_t) (config_reg_data);
	
	HAL_GPIO_WritePin(GPIOC,nss_tdc_Pin,GPIO_PIN_RESET);
	HAL_SPI_Transmit(&hspi2,temp,5,0xffff);
	HAL_GPIO_WritePin(GPIOC,nss_tdc_Pin,GPIO_PIN_SET);
	HAL_Delay(1);
} 

void gp22_send_1byte (uint8_t opcode)    //发送一个字节操作码
{
	uint8_t temp = opcode;
	HAL_GPIO_WritePin(GPIOC,nss_tdc_Pin,GPIO_PIN_RESET);
	HAL_SPI_Transmit(&hspi2,&temp,1,0xffff);
	HAL_GPIO_WritePin(GPIOC,nss_tdc_Pin,GPIO_PIN_SET);
	HAL_Delay(1);
}

void gp22_read_n_bytes(uint8_t opcode_address,uint8_t n_bytes,uint8_t* result)  //读取n个字节的数据到result数组中并打印
{
	uint8_t temp[5];
	temp[0] = opcode_address;
	switch(n_bytes)
	{
		case 1:
			HAL_GPIO_WritePin(GPIOC,nss_tdc_Pin,GPIO_PIN_RESET);
			HAL_SPI_TransmitReceive(&hspi2, temp, result, 1, 0xffff);
		  HAL_UART_Transmit(&huart1,result,1,0xffff);
		  HAL_GPIO_WritePin(GPIOC,nss_tdc_Pin,GPIO_PIN_SET);
			HAL_Delay(1);
		case 2:
			temp[1] = 0x00;
		  HAL_GPIO_WritePin(GPIOC,nss_tdc_Pin,GPIO_PIN_RESET);
			HAL_SPI_TransmitReceive(&hspi2, temp, result, 2, 0xffff);
		  HAL_UART_Transmit(&huart1,result,2,0xffff);
		  HAL_GPIO_WritePin(GPIOC,nss_tdc_Pin,GPIO_PIN_SET);
			HAL_Delay(1);
		case 3:
			temp[1] = 0x00;
		  HAL_GPIO_WritePin(GPIOC,nss_tdc_Pin,GPIO_PIN_RESET);
			HAL_SPI_TransmitReceive(&hspi2, temp, result, 3, 0xffff);
		  HAL_UART_Transmit(&huart1,result,3,0xffff);
		  HAL_GPIO_WritePin(GPIOC,nss_tdc_Pin,GPIO_PIN_SET);
			HAL_Delay(1);
		case 4:
			temp[1] = 0x00;
		  HAL_GPIO_WritePin(GPIOC,nss_tdc_Pin,GPIO_PIN_RESET);
			HAL_SPI_TransmitReceive(&hspi2, temp, result, 4, 0xffff);
		  HAL_UART_Transmit(&huart1,result,4,0xffff);
		  HAL_GPIO_WritePin(GPIOC,nss_tdc_Pin,GPIO_PIN_SET);
			HAL_Delay(1);
		
		case 5:
			temp[1] = 0x00;
		  HAL_GPIO_WritePin(GPIOC,nss_tdc_Pin,GPIO_PIN_RESET);
			HAL_SPI_TransmitReceive(&hspi2, temp, result, 5, 0xffff);
		  HAL_UART_Transmit(&huart1,result,5,0xffff);
		  HAL_GPIO_WritePin(GPIOC,nss_tdc_Pin,GPIO_PIN_SET);
			HAL_Delay(1);
	}
}

void gp22_config(void)
{
	//硬件复位
	HAL_GPIO_WritePin(GPIOC, tdc_reset_Pin, GPIO_PIN_SET);
  HAL_Delay(10);
  HAL_GPIO_WritePin(GPIOC, tdc_reset_Pin, GPIO_PIN_RESET);
  HAL_Delay(10);
  HAL_GPIO_WritePin(GPIOC, tdc_reset_Pin, GPIO_PIN_SET);
	//上电软件复位
	gp22_send_1byte (0x50);
	HAL_Delay(1);
	
	gp22_wr_config_reg(0x80,0x00242000);
	gp22_wr_config_reg(0x81,0x01410000);
	gp22_wr_config_reg(0x82,0xe0000000);
	gp22_wr_config_reg(0x83,0x00000000);
	gp22_wr_config_reg(0x84,0x20000000);
	gp22_wr_config_reg(0x85,0x08000000);
}
int main()
{
 	gp22_config();
 	while(1)
 	{
 		gp22_send_1byte (0x70);   //初始化测量
 		//这里是开始信号与停止信号触发
 		while(HAL_GPIO_ReadPin(GPIOA, tdc_intn_Pin) == 1);   //INTN引脚复位表示计算完成
 		gp22_read_n_bytes(0xb0,5,result);//这里的参数5代表发送一个字节的数据读取4个字节的数据(理解这句代码很重要) 		
 	}
}
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgkabbj
系列文章
更多 icon
同类精品
更多 icon
继续加载