[应用相关] STM32的HAL库的SPI调试LD3320通信

[复制链接]
 楼主| 米多0036 发表于 2021-6-25 23:34 | 显示全部楼层 |阅读模式
厂家提供的STM32固件库程序移植到HAL库,程序修改完成,但SPI读写LD3320寄存器失败,一开始想各种原因,排除,上示波器,又买了逻辑分析仪抓取波形..........

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

最后发现原因是HAL库读写寄存器函数没有严格按照数据手册提供的SPI读写时序来。时序如下图。这个问题也算为自己积累了经验吧。
————————————————
版权声明:本文为CSDN博主「Surferqing_」的原创**,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_38405680/article/details/103837097

 楼主| 米多0036 发表于 2021-6-25 23:35 | 显示全部楼层
 楼主| 米多0036 发表于 2021-6-25 23:40 | 显示全部楼层
 楼主| 米多0036 发表于 2021-6-25 23:41 | 显示全部楼层
最后附上逻辑分析仪抓取的波形,如下图
448060d5f922c9557.png
图 I  LD3320读寄存器
 楼主| 米多0036 发表于 2021-6-25 23:43 | 显示全部楼层
7456060d5f953ba425.png
图 II   LD3320写寄存器
 楼主| 米多0036 发表于 2021-6-25 23:43 | 显示全部楼层
7915560d5f9b78225d.png  
图 III SPI配置
 楼主| 米多0036 发表于 2021-6-25 23:46 | 显示全部楼层
SPI读写寄存器代码如下。
  1. //主程序的部分代码,就是一直写读寄存器并打印读到的寄存器值。
  2. while(1){
  3.     ceshi(&LD3320_hw);
  4. }
  5. void ceshi(LD3320_hw_t * hw)
  6. {
  7.        
  8.         uint8 a,b,c;
  9.         LD_reset(hw);
  10.         a = LD_ReadReg(hw,0x35);
  11.         b = LD_ReadReg(hw,0x1b);
  12.         c =        LD_ReadReg(hw,0xb3);
  13.         printf("%02X\r\n",a);    //16进制打印
  14.         printf("%02X\r\n",b);
  15.         printf("%02X\r\n",c);
  16.         LD_WriteReg(hw,0x35,0x33);
  17.         LD_WriteReg(hw,0x1b,0x55);
  18.         LD_WriteReg(hw,0xb3,0xaa);
  19.         a = LD_ReadReg(hw,0x35);
  20.         b = LD_ReadReg(hw,0x1b);
  21.         c =        LD_ReadReg(hw,0xb3);
  22.         printf("%02X\r\n",a);
  23.         printf("%02X\r\n",b);
  24.         printf("%02X\r\n",c);

  25. }
 楼主| 米多0036 发表于 2021-6-25 23:48 | 显示全部楼层
  1. void LD_WriteReg(LD3320_hw_t * hw,uint8 data1,uint8 data2)//LD3320写寄存器
  2. {
  3.         uint8 cmdwrite = 0x04;
  4.         LD3320_hw_SetNSS(hw,0);
  5.         LD3320_hw_SetSPIS(hw,0);
  6.         HAL_SPI_Transmit(hw->spi, &cmdwrite, 1, 1000);
  7.         while (HAL_SPI_GetState(hw->spi) != HAL_SPI_STATE_READY);
  8.         HAL_SPI_Transmit(hw->spi, &data1, 1, 1000);
  9.         while (HAL_SPI_GetState(hw->spi) != HAL_SPI_STATE_READY);
  10.         HAL_SPI_Transmit(hw->spi, &data2, 1, 1000);
  11.         while (HAL_SPI_GetState(hw->spi) != HAL_SPI_STATE_READY);
  12.         LD3320_hw_SetNSS(hw,1);
  13. }

  14. uint8 LD_ReadReg(LD3320_hw_t * hw,uint8 reg_add)//LD3320读寄存器
  15. {       
  16.         uint8_t txByte = 0x11;//这个txByte随便一个数即可
  17.         uint8_t rxByte = 0x00;
  18.         uint8 cmdread=0x05;
  19.         LD3320_hw_SetNSS(hw,0);
  20.         LD3320_hw_SetSPIS(hw,0);
  21.         HAL_SPI_Transmit(hw->spi, &cmdread, 1, 1000);
  22.         while (HAL_SPI_GetState(hw->spi) != HAL_SPI_STATE_READY);
  23.         HAL_SPI_Transmit(hw->spi, &reg_add, 1, 1000);
  24.         while (HAL_SPI_GetState(hw->spi) != HAL_SPI_STATE_READY);
  25.         HAL_SPI_TransmitReceive(hw->spi, &txByte, &rxByte, 1, 1000);
  26.         while (HAL_SPI_GetState(hw->spi) != HAL_SPI_STATE_READY);
  27.         LD3320_hw_SetNSS(hw,1);
  28.         return rxByte;
  29.        
  30. }
 楼主| 米多0036 发表于 2021-6-25 23:49 | 显示全部楼层
串口打印如下:
开始运行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]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

136

主题

1429

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部

136

主题

1429

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部