历史上的今天
返回首页

历史上的今天

今天是:2024年09月08日(星期日)

2020年09月08日 | 如何通过stm32驱动电源检测芯片cs5463

2020-09-08 来源:eefocus

一、概述

CS5463 是一个包含两个ΔΣ模-数转换器( ADC)、 功率计算功能、电能到频率转换器和一个串行接口的完整的功率测量芯片。它可以精确测量瞬时电压,电流和计算IRMS、VRMS、瞬时功率、有功功率、无功功率,用于研制开发单相、 2线或3线电表。

CS5463可以使用低成本的分流器或互感器测量电流,使用分压电阻或电压互感器测量电压。


CS5463具有与微控制器通讯的双向串口,可编程的电能-脉冲输出功能。 CS5463还具有方便的片上系统校准功能。具有温度传感器电压下降检测,相位补偿功能。


二、cc5463的通讯接口spi

根据cc5463的datasheet查看相关spi的时序,时序图如下

根据该时序图,当CS=0的时候,通讯有效;当数据在时钟上升沿开始改变。然后CLK空闲时是低电平。由此判断CPOL=0,CPHA=1;

可是根据这个配置设置stm32的spi,却无法正常通讯,折腾很久还是无果。回想起这个芯片的驱动程序原来是在51单片机上面运行的,故打算用逻辑分析仪在51单片机上读取该芯片的通讯时序。  


三、逻辑分析仪时序分析

我使用的逻辑分析仪是salea logic16,抓协议之前必须事先配置好,配置图如下:

抓取的时序图如下

根据逻辑分析仪的数据,可以知道CPOL=1,CPHA=1,由此说明cc5463的时序图有误,导致stm32与cc5463无法正常通讯。按照这个配置我重新配置了stm32的spi,最后终于可以正常通讯了。stm32的spi配置如下:



void SPI2_Init(void)

{

     GPIO_InitTypeDef GPIO_InitStructure;

  SPI_InitTypeDef  SPI_InitStructure;

 

    RCC_APB2PeriphClockCmd(    RCC_APB2Periph_GPIOB, ENABLE );//PORTB时钟使能 

    RCC_APB1PeriphClockCmd(    RCC_APB1Periph_SPI2,  ENABLE );//SPI2时钟使能     

 

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PB13/14/15复用推挽输出 

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB

    

    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_14;   //MISO

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PB13/14/15复用推挽输出 

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB

    

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;    //MOSI

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PB13/14/15复用推挽输出 

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB

 

     GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);  //PB13/14/15上拉

 

    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工

    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;        //设置SPI工作模式:设置为主SPI

    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;        //设置SPI的数据大小:SPI发送接收8位帧结构

    SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;        //串行同步时钟的空闲状态为电平

    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;    //串行同步时钟的第二个跳变沿(上升或下降)数据被采样

    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;        //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制

    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;        //定义波特率预分频的值:波特率预分频值为256

    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;    //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始

    SPI_InitStructure.SPI_CRCPolynomial = 7;    //CRC值计算的多项式

    SPI_Init(SPI2, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器

 

    SPI_Cmd(SPI2, ENABLE); //使能SPI外设

    

    SPI2_ReadWriteByte(0xff);//启动传输         

}  

 

//SPIx 读写一个字节

//TxData:要写入的字节

//返回值:读取到的字节

u8 SPI2_ReadWriteByte(u8 TxData)

{        

    u8 retry=0;                     

    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位

        {

        retry++;

        if(retry>200)return 0;

        }              

    SPI_I2S_SendData(SPI2, TxData); //通过外设SPIx发送一个数据

    retry=0;

 

    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位

        {

        retry++;

        if(retry>200)return 0;

        }                                  

    return SPI_I2S_ReceiveData(SPI2); //返回通过SPIx最近接收的数据                        

}

与cc5463的通讯程序如下:


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

** 函数名称:CS5463CMD

** 函数功能:CS5463命令函数

** 函数参数:无

** 创建时间:2009-9-14

** 第一次修改时间:无

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

static void CS5463CMD(uint8 cmd)

{

 CS = 0;    

 SPI2_ReadWriteByte(cmd);    

 CS = 1;   

}

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

** 函数名称:CS5463WriteReg

** 函数功能:CS5463写寄存器函数

** 函数参数:无

** 创建时间:2009-9-14

** 第一次修改时间:无

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

void CS5463WriteReg(uint8 addr,uint8 *p)

{

    char i;

    CS = 0;

    

    SPI2_ReadWriteByte(addr);

    for(i = 0; i < 3; i++)

      SPI2_ReadWriteByte((*(p + i)));

    

    CS = 1;

}

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

** 函数名称:CS5463ReadReg

** 函数功能:CS5463读寄存器函数

** 函数参数:无

** 创建时间:2009-9-14

** 第一次修改时间:无

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

void CS5463ReadReg(uint8 addr,uint8 *p)

{  

    char i; 

    unsigned char data;

 

    CS = 0;

    SPI2_ReadWriteByte(addr);

    for(i = 0; i < 3; i++){

      data=SPI2_ReadWriteByte(0xff);

      (*(p + i)) = data;

    }

    CS = 1;

    return ;   

}


推荐阅读

史海拾趣

德崧电子(D-SWITCH)公司的发展小趣事

技术创新是德崧电子持续发展的核心动力。公司不断加大研发投入,引进先进的生产设备和技术人才,致力于开发具有竞争力的新产品。通过不断的技术创新,德崧电子在电子开关行业中取得了多项重要成果。例如,公司成功研发出了具有自动感应功能的智能开关,实现了对灯光、温度等环境因素的自动调节。这一技术的推出不仅提高了产品的智能化水平,也为公司赢得了更多的市场份额。

Arco Electronics公司的发展小趣事

Arco Electronics公司深知品牌建设对于企业发展的重要性。因此,公司投入大量资源用于品牌建设和市场推广。公司通过与知名企业合作、赞助行业展会等方式提升品牌知名度;同时,还积极运用新媒体进行线上推广,与消费者建立更紧密的联系。这些举措有效地提升了Arco的品牌形象和市场影响力。

Carroll & Meynell Transformers Ltd公司的发展小趣事

随着国内市场的饱和,Carroll & Meynell Transformers Ltd公司开始将目光投向国际市场。公司积极参与国际电子行业的交流与合作,学习借鉴国际先进经验和技术。同时,公司还加大了对海外市场的拓展力度,通过参加国际展览、建立海外销售网络等方式,将产品推向全球。这一国际化战略不仅为公司带来了更广阔的市场空间,也提升了公司的国际影响力。

HIT(日立)公司的发展小趣事
定期对电路进行检查和维护,及时发现并处理潜在问题,确保电路的安全性和稳定性。
高创科技(gotrend)公司的发展小趣事
选择具有良好性能和可靠性的元件,确保电路在长时间使用过程中不易损坏。
Colibrys SA公司的发展小趣事

Colibrys在MEMS技术方面拥有深厚的专业知识,这得益于公司长期的研发积累和不断创新的精神。许多客户委托公司建造最苛刻的航空航天、能源、铁路或汽车测试设备,这些成功案例进一步巩固了公司在行业内的领先地位。无论是用于汽车安全气囊的MEMS加速度计,还是用于引导钻头的高温加速度计,都体现了Colibrys在专业知识应用方面的卓越能力。

问答坊 | AI 解惑

友善之臂 MINI2440 用户手册

目 录 第一章 MINI2440 开发板介绍.........................................................................................................................- 11 - 1.1 MINI2440 开发板简介........................................... ...…

查看全部问答>

LED与荧光粉知识

replyreload += \',\' + 372208;Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答>

WinCE6.0下MFC程序开发error

各位大侠:     小弟定制WinCE6.0 平台,导出并安装SDK, 用VS2005创建一个智能设备的MFC设备应用程序,最简单的那种,基于对话框, 不做任何修改,直接编译,报错.... 错误信息如下,跟官方技术支持联系过,无果,望各位大侠路过留香 ...…

查看全部问答>

LPC2368 xmodem bootloader程序问题

做了一个LPC2368 xmodem的bootloader程序,设计思路是LPC2368的片内FLASH里面存放2个独立的工程,开机上电后运行第一个程序,存放于0-3扇区,也就是我自己编写的bootloader;第一个工程运行完,运行第二个程序,代码存于4-27扇区,这部分为应用程序 ...…

查看全部问答>

ST7565 串行驱动程序

/*   串行驱动方式,唯一要注意的一点就是WR和RD这两个引脚虽然用不到,但是要接地,否则无法正常显示; /**************************预处理*************************/ #include <reg52.h> #include <intrins.h> //============ ...…

查看全部问答>

STM8写了保护后,怎样用STVisualProgrammer重新烧录程序

                                 STM8 写了保护后,怎样用ST Visual Programmer重新烧录程序,请各位大虾指点下,不甚感激!…

查看全部问答>

单片机常用小工具

本帖最后由 paulhyde 于 2014-9-15 03:35 编辑 大家来下哦。 有AVR,51的非常有用的几个小工具哈 包括代码生成等等    …

查看全部问答>

问个小白的问题,MSP430F2013和CC1101EMK433

最近在做一个项目,想用MSP430F2013通过SPI和CC1101EMK433模块通信,可是2013的FLASH只有2KB,RAM只有128B。。就向问一下各位大牛,MSP430F2013够用么?谢谢! [ 本帖最后由 sphinz 于 2011-9-24 16:53 编辑 ]…

查看全部问答>

想试用TI Stellaris M3系列

最近开发一个新项目,关注到TI Stellaris M3 系列不错,性能不能,集成的开发库也非常的方便。从IAR中得知TI出了DK—LM3s这套评估板,特来申请。…

查看全部问答>

【视频分享】TMS320C64x网络课程七——CSL3.x

简介:TMS320C64x+网络课程6——CSL3.x,主要介绍CSL3的使用情况,CSL2-CSL3-PSP的逐步升级,CSL的层次,外设寄存器的结构和操作等详细讲解。 此网络培训针对C64x+,每次一个专题,由DSP高性能部门技术支持工程师为您全程指导,敬请期待。 $(\'s ...…

查看全部问答>