完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
各位好:
参考官网的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个回答
|
|
找个逻辑分析仪或四通道的示波器把SPI通讯波形量一下,上图。
|
|
|
|
您好,我现在在调试ADE7880 的SPI通信,读取寄存器时得到的值为0XFF。通过示波器抓取ADE7880的 SPI引脚,发现ADE7880的SPI输出一直是高电平2.7V,所以,导致MCU读到的数据都是0XFF。 因此,我单独拿ADE7880 模块(不与MCU相连),当VDD(或REST)输入3.3V时,ADE7880 SPI引脚也是为高。 请问,ADE7880的SPI引脚,默认都是高电平吗? |
|
|
|
示波器抓时序了吗?发一下看看
|
|
|
|
|
|
|
|
ADE7858A外部的晶振没有起振,但SPI的时钟是没问题,包括AVDD,GVDD,VREF,PM0,PM1上的电平都是正确的,但就是外部晶振没有起振,请问可能的主要原因是什么?更换过晶振,电容也是按指导要求配的。。。 |
|
|
|
我现在也是碰到了和你一样的问题,请问你找到问题出在哪了吗?
|
|
|
|
之前也碰到和你一样的问题,发现:SPI 读写不成功的可能是通信波特率高了,降到0.56M就可以了(之前是1.125M,读到的是全1,其实就是读写没有成功)。另外看看寄存器的操作权限是不是允许写操作,以致读写失败。。。配合CCS,SCLK,SDI,SDO引脚的波形对照,会更容易理解很多细节。 但是读取特定的寄存器,验证SPI通信是否成功,仍然没有数据,全0.目前正在找原因,不解。。。考虑是不是需要增加读写延时
|
|
|
|
请问找到原因了吗?一样的问题
|
|
|
|
只有小组成员才能发言,加入小组>>
给ADUM4223 增加信号驱动15V电压就不正常, 波动很大会被烧是什么情况?
192 浏览 0 评论
ADP5092 SYS端口为2.09V,但是REG_OUT为0是什么原因?
1793 浏览 1 评论
ad7193差分输入ain1与ain2差是正值时,读到电压与实际值误差小,但为负值值,误差就变的很大
4175 浏览 2 评论
8894 浏览 1 评论
3087 浏览 1 评论
ADC3442采集,分析数据出现有规则毛刺,请问是哪方面的问题啊?
1257浏览 3评论
AD7190状态寄存器一直是0x80,连续转换模式下RDY不拉低
1564浏览 2评论
1490浏览 2评论
1293浏览 1评论
1097浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-10-1 18:05 , Processed in 0.581538 second(s), Total 58, Slave 52 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号