cse7761电能计量芯片驱动程序

本文档详述了如何使用STM32编写CSE7761电能计量芯片的SPI驱动程序,涉及引脚配置、SPI读写、电能芯片的读写及寄存器配置,以及电压读取等关键步骤。
摘要由CSDN通过智能技术生成

stm32+CSE7761电能芯片驱动

这篇文章介绍CSE7761电能计量芯片的驱动和应用的部分程序,如需要完整解决方案(电压、电流、功率、电量、过载、过零、漏电),请私信。

spi引脚配置

GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(SPI_PIN_MISO_PORT_CLK | SPI_PIN_MOSI_PORT_CLK |
                           SPI_PIN_SCK_PORT_CLK,
                       ENABLE);
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = SPI_PIN_SCK;
GPIO_Init(SPI_PIN_SCK_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = SPI_PIN_MOSI;
GPIO_Init(SPI_PIN_MOSI_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin = SPI_PIN_MISO;
GPIO_Init(SPI_PIN_MISO_PORT, &GPIO_InitStructure);

spi读写

static uint8_t SpiInOut(uint8_t outData, BOOL w_or_r)
{
	uint8_t i;
        uint8_t vpdata = 0;
        if (w_or_r) //spi软件模拟写
        {
            for (i = 0; i < 8; i++)
            {
                if (outData & (0x80 >> i))
                    MOSI_H;
                else
                    MOSI_L;
                CLK_H;
                CLK_L;
            }
        }
        else //spi软件模拟读
        {
            for (i = 0; i < 8; i++)
            {
                CLK_H;                
                (vpdata) <<= 1;
                if (ReadMISO != Bit_SET)
                    (vpdata) |= 1;
                CLK_L;
            }
            vpdata = (~vpdata);
        }
        return vpdata;
}

电能芯片读写

Error_code_t spi_read(u8 addr, u8 *dat, u8 len, u8 channel, u8 check)
{
	CS_ENABLE(channel);//片选
	SpiInOut(addr & 0x7f,TRUE);//写待读寄存器地址
	CS_DISABLE(channel);
	return RET_POW_SUC;
}
Error_code_t spi_write(u8 addr, u8 *dat, u8 len, const u8 channel)
{
	 CS_ENABLE(channel);
	 //写使能命令,使能写操作
    SpiInOut(0xea, TRUE);
    SpiInOut(0xe5, TRUE);
    CS_DISABLE(channel);
    
    CS_ENABLE(channel);
    SpiInOut(addr | 0x80, TRUE);
    for (char i = len-1; i >=0; i--)
        SpiInOut(dat[i], TRUE);
    CS_DISABLE(channel);
	
	spi_read(addr,(u8*)&temp_read,2,channel);
	return RET_POW_SUC;
}

电能芯片寄存器配置

Error_code_t set_powercheck_ic(CPowerCheck *c_ics, const u32 m_ch)
{
	//系统控制寄存器
	//计量控制寄存器
	//中断配置
}

电压读取

Error_code_t read_ch_vol(u16 *Vol, u8 ch)
{
    u32 temp_vol = 0;
    u32 check_data = 0;
    spi_read(RMSU_CFG, (u8 *)&temp_vol, 3, ch);    //读取电压值
    spi_read(RDATA_CFG, (u8 *)&check_data, 3, ch); //读取校验值
    if (temp_vol == check_data)
    {
        temp_vol = (temp_vol & 0x800000) ? 0 : temp_vol;//最高位为1时,作为0处理
        *Vol = (u16)((((uint64_t)temp_vol * m_para[ch - 1].vol_para)) >> 22)/100;//单位V
        return RET_POW_SUC;
    }
    else
    {
        return RET_POW_FAL;
    }
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Hello_WXY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值