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