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;	
	
	
};


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM