STM32F4 HAL库 调试TDC-GP22[测试SPI通信]

摘要

STM32;HAL库;SPI;TDC-GP22;

SPI 配置

注意事项

TDC-GP22只支持以下 SPI 模式:
Clock Phase Bit = 1
Clock Polarity Bit = 0

在3.0V时,TDC clk最大为20MHZ,因此时钟频率要限制在20MHZ以下。SPI2挂载在APB1下,最大时钟为42/2 = 21MHZ,分频选择64即可。

TDC - GP22复位引脚低电平有效;

TDC - GP22 INT 为输出引脚,高电平时表示有新的数据到来;

SPI初始化

使用cubemx一键配置,配置完状态如下

  hspi2.Instance = SPI2;
  hspi2.Init.Mode = SPI_MODE_MASTER;
  hspi2.Init.Direction = SPI_DIRECTION_2LINES;
  hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi2.Init.CLKPhase = SPI_PHASE_2EDGE;
  hspi2.Init.NSS = SPI_NSS_SOFT;
  hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;
  hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi2.Init.CRCPolynomial = 10;

配置CS引脚

#define ENABLE_TDC HAL_GPIO_WritePin(TDC_SPI_CS_GPIO_Port,TDC_SPI_CS_Pin,GPIO_PIN_RESET);
#define DISABLE_TDC HAL_GPIO_WritePin(TDC_SPI_CS_GPIO_Port,TDC_SPI_CS_Pin,GPIO_PIN_SET);

配置复位

void Tdc_reset(void)
{
   HAL_GPIO_WritePin(TDC_RESET_GPIO_Port, TDC_RESET_Pin, GPIO_PIN_SET);
   HAL_Delay(10);
   HAL_GPIO_WritePin(TDC_RESET_GPIO_Port, TDC_RESET_Pin, GPIO_PIN_RESET);
     HAL_Delay(10);
     HAL_GPIO_WritePin(TDC_RESET_GPIO_Port, TDC_RESET_Pin, GPIO_PIN_SET);

}

SPI IO

传输

hal库spi传输有阻塞,中断,DMA等方式,一般采用阻塞式即可。

单字节传输

void Spi_send_byte(uint8_t data)
{
	while(HAL_OK!=HAL_SPI_Transmit(TDC_SPI,&data,1,0xffff));	
};	

接收

hal库spi接收也有多种方式,常用的有HAL_SPI_Receive,该函数会自动传输上一轮Transmit的数据以提供时钟,而标准库需要手动发送数据以提供;同时还有HAL_SPI_TransmitReceive,通过此函数可以实现边收边发,一般用于连续读写。

uint8_t Spi_read_byte(void)
{
	uint8_t ch;
	while(HAL_OK!=HAL_SPI_Receive(TDC_SPI,&ch,1,0xffff));
	return ch;
};	

测试通信

TDC -GP22提供了两种测试通信的方式,一种是写寄存器1,读寄存器5,会返回寄存器1的高8位;另外一种是写任意寄存器ID,读寄存器7,会依次返回ID0~ID7。选择一种即可。

如果遇到读取数据始终为0的情况,检查复位引脚是否处于高电平状态,被复位卡了两天。

void Tdc_test(void)
{

	int reset = 0x50;
	
	int ret = 1;

	Tdc_reset();//硬件复位
	HAL_Delay(10);	
	ENABLE_TDC;
	Spi_send_byte(reset);//软件复位
	DISABLE_TDC;

	
	ENABLE_TDC;
	Spi_send_byte(0x81);
	Spi_send_byte(0x11);
	Spi_send_byte(0x22);	
	Spi_send_byte(0x33);
	Spi_send_byte(0x44);
	DISABLE_TDC;
	
	HAL_Delay(10);
	
	ENABLE_TDC;
	Spi_send_byte(0xB5);	
	ret=Spi_read_byte();
	DEBUG("0x%x\r\n",ret);//读取到0x11则表示SPI通讯正常。
	DISABLE_TDC;	
	
	
};
posted @ 2022-03-03 17:39  USTHzhanglu  阅读(1477)  评论(0编辑  收藏  举报