打印
[应用相关]

STM32的HAL库的SPI调试LD3320通信

[复制链接]
4043|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
厂家提供的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 | 只看该作者
最后附上逻辑分析仪抓取的波形,如下图

图 I  LD3320读寄存器

使用特权

评论回复
5
米多0036|  楼主 | 2021-6-25 23:43 | 只看该作者

图 II   LD3320写寄存器

使用特权

评论回复
6
米多0036|  楼主 | 2021-6-25 23:43 | 只看该作者
 
图 III SPI配置

使用特权

评论回复
7
米多0036|  楼主 | 2021-6-25 23:46 | 只看该作者
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);

}

使用特权

评论回复
8
米多0036|  楼主 | 2021-6-25 23:48 | 只看该作者
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;
       
}

使用特权

评论回复
9
米多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]

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

98

主题

1336

帖子

0

粉丝