我正在尝试ADE7758
使用STM32F411VET6
.
我的 SPI 正在使用 16 的预分频器、6.25 MB/s 的波特率和 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) 寄存器。
首先,我正在编写默认值为 0x04 的 OPMODE 寄存器。
这是波形的快照。
我的寄存器地址是 0x13,我正在写,所以我必须对 0x13 和 0x80 进行逻辑“或”,即我的波形应该是 0x93
OPMODE 寄存器的默认值为 0x04
这是我用于写入 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 的时序特性的快照
请建议从 ADE7758 读取 SPI 时我哪里出错了?是我使用 HAL 读取 SPI 的方式的错误还是时间的错误?
任何建议将不胜感激。