ADI 技术
直播中

h1654155275.5916

7年用户 993经验值
私信 关注
[问答]

请教关于 ADE7878 SPI通讯问题

各位好:
     参考官网的ADE7878示例代码,然后发现SPI读任何寄存器都全是0XFFFFFFFF,感觉应该是没通讯上,但是又不知道问题在哪,有哪位用过的可以帮忙看下吗? 附上示例代码, 诚心请教! 有好心人可以加我的QQ:79444528或者微信solo_wen,求指导. 已经弄了两周了. 下面是我的一些详细信息:

1.硬件原理图:

已经量VREF(C28)两端电压为1.19V

2.软件:
SPI配置:
void MX_SPI1_Init(void)
{
  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64; // 80M/64
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 7;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
}
然后CLKPolarity  HIGH,LOW都试过, CLKPhase 1,2EDGE也都试过,都没用.

ADE78XX_SPI.C

/************************************************************************************************


Author        : CAC (China Applications Support Team)         


Date          : October 2012


File          : ADE7878_SPI.h


Hardware      : ADE7878, ADuC7060


Description   : Test with ADE7878
       Config ADE7878 to read phase A current rms, voltage rms, energy, period, in linecycle mode


*************************************************************************************************/
#include "ADE78xx_spi.h"
#include "extern.h"


//extern unsigned char szTxData[7];
unsigned char DummyRd;
SPI_HandleTypeDef* ADE_hspi =  &hspi1;


uint8_t SPI_comm(uint8_t s_byte);


/******************************************************************************
**  Abstract:   
** short delay
**  Parameters:
** none  
**  Returns:
** none
*******************************************************************************/
void SPIDelay(void)
{
int i;
for(i=0; i<20; i++);
}


/******************************************************************************
**  Abstract:   
** write 4 bytes to ADE7878
**  Parameters:
** unsigned int address: register address
** long int sendtemp   : configuration value  
**  Returns:
** none
*******************************************************************************/
void SPIWrite4Bytes(unsigned int address , long int sendtemp)
{
char i;
unsigned char szTxData[7];
CLR_PIN00();
szTxData[0] = 0x00;
szTxData[1] = (char)(address>>8);
szTxData[2] = (char)(address);
szTxData[3] = (char)(sendtemp>>24);
szTxData[4] = (char)(sendtemp>>16);
szTxData[5] = (char)(sendtemp>>8);
szTxData[6] = (char)(sendtemp);
for(i=0;i<7;i++)
{
SPI_comm(szTxData);
SPIDelay();
}
SET_PIN00();
}


/******************************************************************************
**  Abstract:   
** write 2 bytes to ADE7878
**  Parameters:
** unsigned int address: register address
** long int sendtemp   : configuration value  
**  Returns:
** none
*******************************************************************************/
void SPIWrite2Bytes(unsigned int address , int sendtemp)
{
char i;
unsigned char szTxData[7];
CLR_PIN00();
szTxData[0] = 0x00;
szTxData[1] = (char)(address>>8);
szTxData[2] = (char)(address);
szTxData[3] = (char)(sendtemp>>8);
szTxData[4] = (char)(sendtemp);


for(i=0;i<5;i++)
{
SPI_comm(szTxData);
SPIDelay();
}
SET_PIN00();


}


/******************************************************************************
**  Abstract:   
** write 1 byte to ADE7878
**  Parameters:
** unsigned int address: register address
** long int sendtemp   : configuration value  
**  Returns:
** none
*******************************************************************************/
void SPIWrite1Byte(unsigned int address , char sendtemp)
{
char i;
unsigned char szTxData[7];
CLR_PIN00();
szTxData[0] = 0x00;
szTxData[1] = (char)(address>>8);
szTxData[2] = (char)(address);
szTxData[3] = sendtemp;


for(i=0;i<4;i++)
{
SPI_comm(szTxData);
SPIDelay();
}

SET_PIN00();
}


/******************************************************************************
**  Abstract:   
** read 4 bytes from ADE7878
**  Parameters:
** unsigned int address: register address
**  Returns:
** readout             : read value
*******************************************************************************/
long int SPIRead4Bytes(unsigned int address)
{
long int readout;
unsigned char szTxData[7];
char spireadbuf[4];
char i;


CLR_PIN00();
szTxData[0] = 0x01;
szTxData[1] = (char)(address>>8);
szTxData[2] = (char)(address);

for(i=0;i<3;i++)
{
SPI_comm(szTxData);
SPIDelay();
}
// SPICON |= BIT12; // Flush Rx FIFO
// SPICON &= ~BIT12;


// DummyRd = SPI_comm(0x00);
for(i=0;i<4;i++)
{
SPIDelay();
spireadbuf = SPI_comm(0x00);
}

readout = (spireadbuf[0]<<24)+(spireadbuf[1]<<16)+(spireadbuf[2]<<8)+spireadbuf[3];


SET_PIN00();
return(readout);
}


/******************************************************************************
**  Abstract:   
** read 2 bytes from ADE7878
**  Parameters:
** unsigned int address: register address
**  Returns:
** readout             : read value
*******************************************************************************/
int SPIRead2Bytes(unsigned int address)
{
int readout;
unsigned char szTxData[7];
char i;
char spireadbuf[2];


CLR_PIN00();
szTxData[0] = 0x01;
szTxData[1] = (char)(address>>8);
szTxData[2] = (char)(address);

for(i=0;i<3;i++)
{
SPI_comm(szTxData);
SPIDelay();
}


// SPICON |= BIT12; // Flush Rx FIFO
// SPICON &= ~BIT12;
DummyRd = SPI_comm(0x00);
for(i=0;i<2;i++)
{
// SPITX = 0x00;
SPIDelay();
spireadbuf = SPI_comm(0x00);
}

readout = (spireadbuf[0]<<8)+spireadbuf[1];


SET_PIN00();
return(readout);
}


/******************************************************************************
**  Abstract:   
** read 1 byte from ADE7878
**  Parameters:
** unsigned int address: register address
**  Returns:
** readout             : read value
*******************************************************************************/
char SPIRead1Byte(unsigned int address)
{
char readout;
unsigned char szTxData[7];
char i;


CLR_PIN00();
szTxData[0] = 0x01;
szTxData[1] = (char)(address>>8);
szTxData[2] = (char)(address);

for(i=0;i<3;i++)
{
SPI_comm(szTxData);
SPIDelay();
}
// SPICON |= BIT12; // Flush Rx FIFO
// SPICON &= ~BIT12;
DummyRd = SPI_comm(0x00);
// SPITX = 0x00;
SPIDelay();
readout = SPI_comm(0x00);


SET_PIN00();

return(readout);
}




uint8_t SPI_comm(uint8_t s_byte)
{
  uint8_t ret = 0;
  HAL_SPI_TransmitReceive(ADE_hspi, &s_byte, &ret, 1, 0xfff);
  
  return ret;
}

以上基本参考的示例程序, 只把发送和接收这里改成了我的库函数.

ADE7878.C就是示例程序一模一样了.

然后我在Main里面函数这样调用的.
  MX_SPI1_Init();
  ADE7878Reset();
  ADE7878SPICfg();
然后最后执行读写寄存器,如下图:


附件

回帖(8)

沈汝

2018-8-7 08:47:34
找个逻辑分析仪或四通道的示波器把SPI通讯波形量一下,上图。
举报

王鑫

2018-8-7 09:02:23
引用: 色色隐隐 发表于 2018-8-7 08:47
找个逻辑分析仪或四通道的示波器把SPI通讯波形量一下,上图。

您好,我现在在调试ADE7880 的SPI通信,读取寄存器时得到的值为0XFF。通过示波器抓取ADE7880的 SPI引脚,发现ADE7880的SPI输出一直是高电平2.7V,所以,导致MCU读到的数据都是0XFF。
 
因此,我单独拿ADE7880 模块(不与MCU相连),当VDD(或REST)输入3.3V时,ADE7880 SPI引脚也是为高。
 
请问,ADE7880的SPI引脚,默认都是高电平吗?
举报

高淑贤

2018-8-7 09:11:37
示波器抓时序了吗?发一下看看
举报

高淑贤

2018-8-7 09:27:12
ADE7878外部的晶振起振没?SPI接口电平测了吗?还有芯片有没有更换过?是不是芯片坏了?
你都做了那些实验?
举报

更多回帖

×
20
完善资料,
赚取积分