廠家提供的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, ®_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]
在此感謝舍友無私的幫助,哈哈哈哈。