STM32的HAL庫的SPI調試LD3320通信

廠家提供的STM32固件庫程序移植到HAL庫,程序修改完成,但SPI讀寫LD3320寄存器失敗,一開始想各種原因,排除,上示波器,又買了邏輯分析儀抓取波形..........

一通操作猛如虎,從19年改代碼到20年,哈哈哈哈。

最後發現原因是HAL庫讀寫寄存器函數沒有嚴格按照數據手冊提供的SPI讀寫時序來。時序如下圖。這個問題也算爲自己積累了經驗吧。

最後附上邏輯分析儀抓取的波形,如下圖

                                                                      圖 I  LD3320讀寄存器

                                                                        圖 II   LD3320寫寄存器

                       圖 III SPI配置

SPI讀寫寄存器代碼如下。

//主程序的部分代碼,就是一直寫讀寄存器並打印讀到的寄存器值。
while(1){
    ceshi(&LD3320_hw);
 }
void ceshi(LD3320_hw_t * hw)
{
	
	uint8 a,b,c;
	LD_reset(hw);
	a = LD_ReadReg(hw,0x35);
	b = LD_ReadReg(hw,0x1b);
	c =	LD_ReadReg(hw,0xb3);
	printf("%02X\r\n",a);    //16進制打印
	printf("%02X\r\n",b);
	printf("%02X\r\n",c);
	LD_WriteReg(hw,0x35,0x33);
	LD_WriteReg(hw,0x1b,0x55);
	LD_WriteReg(hw,0xb3,0xaa);
	a = LD_ReadReg(hw,0x35);
	b = LD_ReadReg(hw,0x1b);
	c =	LD_ReadReg(hw,0xb3);
	printf("%02X\r\n",a);
	printf("%02X\r\n",b);
	printf("%02X\r\n",c);

}
 void LD_WriteReg(LD3320_hw_t * hw,uint8 data1,uint8 data2)//LD3320寫寄存器
{
	uint8 cmdwrite = 0x04;
	LD3320_hw_SetNSS(hw,0);
	LD3320_hw_SetSPIS(hw,0);
	HAL_SPI_Transmit(hw->spi, &cmdwrite, 1, 1000);
	while (HAL_SPI_GetState(hw->spi) != HAL_SPI_STATE_READY);
	HAL_SPI_Transmit(hw->spi, &data1, 1, 1000);
	while (HAL_SPI_GetState(hw->spi) != HAL_SPI_STATE_READY);
	HAL_SPI_Transmit(hw->spi, &data2, 1, 1000);
	while (HAL_SPI_GetState(hw->spi) != HAL_SPI_STATE_READY);
	LD3320_hw_SetNSS(hw,1);
}

 uint8 LD_ReadReg(LD3320_hw_t * hw,uint8 reg_add)//LD3320讀寄存器
{	
	uint8_t txByte = 0x11;//這個txByte隨便一個數即可
	uint8_t rxByte = 0x00;
	uint8 cmdread=0x05;
	LD3320_hw_SetNSS(hw,0);
	LD3320_hw_SetSPIS(hw,0);
	HAL_SPI_Transmit(hw->spi, &cmdread, 1, 1000);
	while (HAL_SPI_GetState(hw->spi) != HAL_SPI_STATE_READY);
	HAL_SPI_Transmit(hw->spi, &reg_add, 1, 1000);
	while (HAL_SPI_GetState(hw->spi) != HAL_SPI_STATE_READY);
	HAL_SPI_TransmitReceive(hw->spi, &txByte, &rxByte, 1, 1000);
	while (HAL_SPI_GetState(hw->spi) != HAL_SPI_STATE_READY);
	LD3320_hw_SetNSS(hw,1);
	return rxByte;
	
}
串口打印如下: 
開始運行LD3320測試程序 [2020-01-03 10:31:59.403]
80[2020-01-03 10:31:59.444]
00[2020-01-03 10:31:59.444]
FF[2020-01-03 10:31:59.444]
33[2020-01-03 10:31:59.444]
55[2020-01-03 10:31:59.444]
AA[2020-01-03 10:31:59.444]

在此感謝舍友無私的幫助,哈哈哈哈。

 

 

 

 

 

發佈了48 篇原創文章 · 獲贊 204 · 訪問量 34萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章