ADE7758 не может прочитать значения по умолчанию - PullRequest
0 голосов
/ 28 октября 2018

Я пытаюсь сопрягать IC многофазной энергии Mertering ADE7758 Используя STM32F411VET6.Мой SPI работает на уровне до 16, скорости передачи 6,25 МБ / с и 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).Сначала я пишу регистр OPMODE со значением по умолчанию 0x04.

Вот снимок формы волны.

Мой адрес регистра равен 0x13, и я пишу, поэтому мне нужно логически 'ИЛИ' 0x13 с 0x80, т.е. моя форма сигнала должна быть 0x93

ADDRESS_WRITE

Значение по умолчанию в регистре OPMODE: 0x04

DATA_WRITE

Вот код iиспользуется для записи в 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

Пожалуйста, подскажите, где я ошибаюсь при чтении SPI из ADE7758?Это ошибка того, как я читаю SPI с использованием HAL, или ошибка синхронизации?

Будут благодарны за любые предложения.

...