Я пытаюсь сопрягать IC многофазной энергии Mertering ADE7758
Используя STM32F411VET6
.Мой SPI работает на уровне до 16, скорости передачи 6,25 МБ / с и MODE 2, то есть CPOL = 1 и CPHA = 0. Вот снимок настроек.
Мои подключения такие.
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
Значение по умолчанию в регистре OPMODE: 0x04
Вот код 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
Пожалуйста, подскажите, где я ошибаюсь при чтении SPI из ADE7758?Это ошибка того, как я читаю SPI с использованием HAL, или ошибка синхронизации?
Будут благодарны за любые предложения.