0

我正在尝试ADE7758使用STM32F411VET6.
我的 SPI 正在使用 16 的预分频器、6.25 MB/s 的波特率和 MODE 2 即 CPOL = 1 和 CPHA = 0。这是设置的快照。

SPI_SETTINGS

我的人脉是这样的。

STM32         -    ADE7758
PE11(NSS)     -    Pin 21(CS)
PE12(SCK)     -    Pin 23(SCLK)
PE13(MISO)    -    Pin 24(DOUT)
PE14(MOSI)    -    Pin 23(DIN)

这是全局变量和定义

uint8_t aTxBuff[1] = {0};
uint8_t aRxBuff[1] = {0};
#define enableChip          HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port,SPI1_NSS_Pin,GPIO_PIN_RESET)
#define disableChip         HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port,SPI1_NSS_Pin,GPIO_PIN_SET)

我正在尝试读取 OPMODE(0x13) 寄存器。
首先,我正在编写默认值为 0x04 的 OPMODE 寄存器。

这是波形的快照。

我的寄存器地址是 0x13,我正在写,所以我必须对 0x13 和 0x80 进行逻辑“或”,即我的波形应该是 0x93

ADDRESS_WRITE

OPMODE 寄存器的默认值为 0x04

DATA_WRITE

这是我用于写入 ADE7758 的代码。

void ADE7758_write8(char reg, unsigned char data)
{
    enableChip;

    reg|=0x80;
    aTxBuff[0] = (unsigned char)reg;
    while(HAL_SPI_GetState(&hspi4) == HAL_SPI_STATE_BUSY_TX);
    HAL_SPI_Transmit(&hspi4, (uint8_t*)aTxBuff, 1, 1000);
    while(HAL_SPI_GetState(&hspi4) == HAL_SPI_STATE_BUSY_TX);
    aTxBuff[0] = (unsigned char)data;
    HAL_SPI_Transmit(&hspi4, (uint8_t*)aTxBuff, 1, 1000);

    disableChip;
}

使用 SPI 向 ADE7758 写入时,一切都显示正确。但是当我读回寄存器时会出现问题。

这是读取 SPI 的代码。

unsigned char ADE7758_read8(char reg)
{
    enableChip;

    aTxBuff[0] = (unsigned char)reg;
    HAL_SPI_TransmitReceive(&hspi4, (uint8_t*)aTxBuff, (uint8_t*)aRxBuff, 1, 1000);
    DWT_Delay_us(5);
    aTxBuff[0] = 0x00;
    HAL_SPI_TransmitReceive(&hspi4, (uint8_t*)aTxBuff, (uint8_t*)aRxBuff, 1, 1000);

    disableChip;

    return (unsigned char)aRxBuff[0];
}

我试图调试代码并不断监控值aRxBuff[0],该值是任意的(如 0xFF、0xFC、0xDF 等)。

我不知道这是读取时间的错误,但这里是 ADE7758 的时序特性的快照

TIMING_CHARACTERSTICS

请建议从 ADE7758 读取 SPI 时我哪里出错了?是我使用 HAL 读取 SPI 的方式的错误还是时间的错误?

任何建议将不胜感激。

4

0 回答 0