资讯详情

CH32V103C8T6 与ht7038 SPI通讯

使用CH32V103C8T6的SPI与ht7038通讯。

波形

必须获取rChipID可以确认数据SPI通讯成功。

ht7038.h

/*  * HT7038.h  *  *  Created on: 2022年5月20日  *      Author: armxu  */  #ifndef USER_HT7038_H_ #define USER_HT7038_H_ #include "stdint.h" #include "ch32v10x_spi.h" #define CS_PIN_PORT  GPIOA #define CS_PIN       GPIO_Pin_4 #define CS(X)        GPIO_WriteBit(CS_PIN_PORT, CS_PIN, X) //=================================================== //          定义HT7038数据寄存器 //=================================================== #define rDeviceID   0x00    //7038 Device ID #define rPa         0x01    //A相有功功率 #define rPb         0x02    //B相有功功率 #define rPc         0x03    //C相有功功率 #define rPt         0x04    //合相有功功率  #define rQa         0x05    //A相无功功率 #define rQb         0x06    //B相无功功率 #define rQc         0x07    //C相无功功率 #define rQt         0x08    //合相无功功率  #define rSa         0x09    //A相视在功率 #define rSb         0x0A    //B相视在功率 #define rSc         0x0B    //C相视在功率 #define rSt         0x0C    //相视在功率上  #define rUaRms          0x0D    //A相电压有效值 #define rUbRms          0x0E    //B相电压有效值 #define rUcRms          0x0F    //C相电压有效值  #define rIaRms          0x10    //A相电流有效值 #define rIbRms          0x11    //B相电流有效值 #define rIcRms          0x12    //C相电流有效值 #define rItRms          0x13    //ABC相电流矢量和  #define rPfa        0x14    //A相功率因数 #define rPfb        0x15    //B相功率因数 #define rPfc        0x16    //C相功率因数 #define rPft        0x17    ///合相功率因数  #define rPga        0x18    //A相电流与电压相角 #define rPgb        0x19    //B相电流和电压相角功率因数 #define rPgc        0x1a    //C相电流与电压相角  #define rINTFlag    0x1b    //中断标志,读后清零 ☆  #define rFreq       0x1C    //线频率 #define rEFlag      0x1d    //电能寄存器的工作状态,读后清零☆  #define rEpa        0x1e    //A相有功电能 #define rEpb        0x1f    //B相有功电能 #define rEpc        0x20    //C相有功电能 #define rEpt        0x21    //合相有功电能  #define rEqa        0x22    //A相无功电能 #define rEqb        0x23    //B相无功电能 #define rEqc        0x24    //C相无功电能 #define rEqt        0x25    //合相无功电能  #define rYUaUb      0x26    //Ua与Ub的电压夹角            ☆ #define rYUaUc      0x27    //Ua与Uc的电压夹角            ☆ #define rYUbUc      0x28    //Ub与Uc的电压夹角            ☆  #define rTPSD       0x2a    ////温度传感器的输出 #define rURmst      0x2b    //ABC电压矢量和有效值  #define rS_Flag     0x2c    //存放断相、相序、SIG信号的有效值  #define rBackReg      0x2d  //☆ #define rComChksum  0x2e    ///通信验证和寄存器☆ #define rSampleIA   0x2f    //A相电流通道ADC采样数据☆ #define rSampleIB   0x30    //B相电流通道ADC采样数据☆ #define rSampleIC   0x31    //C相电流通道ADC采样数据☆  #define rSampleUA   0x32    //A相电压通道ADC采样数据☆ #define rSampleUB   0x33    //B相电压通道ADC采样数据☆ #define rSampleUC   0x34    //C相电压通道ADC采样数据☆  #define rEsa    0x35    //A相视在电能☆ #define rEsb    0x36    //B相视在电能☆ #define rEsc    0x37    //C相视在电能☆ #define rEst    0x38    ///在电能相视☆  #define rFstCntA        0x39    //A相快速脉冲计数☆ #define rFstCntB        0x40    //B相快速脉冲计数☆ #define rFstCntC        0x40    //C相快速脉冲计数☆ #define rFstCntT        0x41    ///☆  #define rPFlag      0x3d    //有功和无功功率方向,正向为0,负向为1  #define rChkSum 0x3e    //校表数据验证寄存器(三相四线模式为0x01D4CD;三相三线模式为0x01E0CD;)   #define rVrefgain       0x5c    //Vref自动补偿系数 #define rChipID       0x5d  //芯片版本指示器0X7026E0 #define rChkSum1        0x5e    //  //================================================================== //              HT703838校表寄存器 //================================================================== #define w_ModeCfg           0X01    //模式相关控制 #define w_PGACtrl           0X02    //ADC增益选择 #define w_EMUCfg                0X03    //EMU配置寄存器的模块 #define w_PgainA                0X04    //A相有功率增益 #define w_PgainB                0X05    //B相有功率增益 #define w_PgainC                0X06    //C相有功率增益 #define w_QgainA                0X07    //A相无功率增益 #define w_QgainB                0X08    //B相无功率增益 #define w_QgainC                0X09    //C相无功率增益 #define w_SgainA                0X0A    //A功率增益相视 #define w_SgainB                0X0B    //B功率增益相视 #define w_SgainC                0X0C    //C功率增益相视 #define w_PhSregApq0        0X0D    //A相相位校正0 #define w_PhSregBpq0        0X0E    //B相相位校正0 #define w_PhSregCpq0        0X0F    //C相相位校正0 #define w_PhSregApq1        0X10    //A相相位校正1 #define w_PhSregBpq1        0X11    //B相相位校正1 #define w_PhSregCpq1        0X12    //C相相位校正1 #define w_PoffsetA          0X13    //A相有功功率offset校正 #define w_PoffsetB          0X14    //B相有功功率offset校正 #define w_PoffsetC          0X15    //C相有功功率offset校正 #define w_QPhscal           0X16    ///无功相位校正 #define w_UgainA                0X17    //A相电压增益 #define w_UgainB                0X18    //B相电压增益 #defin w_UgainC                0X19    //C相电压增益
#define w_IgainA                0X1A    //A相电流增益
#define w_IgainB                0X1B    //B相电流增益
#define w_IgainC                0X1C    //C相电流增益
#define w_Istarup           0X1D    //起动电流阈值设置
#define w_Hfconst           0X1E    //高频脉冲输出设置
#define w_FailVoltage   0X1F    //失压阈值设置

#define w_QoffsetA          0X21    //A相无功功率offset校正
#define w_QoffsetB          0X22    //B相无功功率offset校正
#define w_QoffsetC          0X23    //C相无功功率offset校正
#define w_UaRmsoffse        0X24    //A相电压有效值offset校正
#define w_UbRmsoffse        0X25    //B相电压有效值offset校正
#define w_UcRmsoffse        0X26    //C相电压有效值offset校正
#define w_IaRmsoffse        0X27    //A相电流有效值offset校正
#define w_IbRmsoffse        0X28    //B相电流有效值offset校正
#define w_IcRmsoffse        0X29    //C相电流有效值offset校正
#define w_UoffsetA          0X2A    //A相电压通道ADC offset校正
#define w_UoffsetB          0X2B    //B相电压通道ADC offset校正
#define w_UoffsetC          0X2C    //C相电压通道ADC offset校正
#define w_IoffsetA          0X2D    //A相电流通道ADC offset校正
#define w_IoffsetB          0X2E    //B相电流通道ADC offset校正
#define w_IoffsetC          0X2F    //C相电流通道ADC offset校正
#define w_EMUIE                 0X30    //中断使能
#define w_ModuleCFG         0X31    //电路模块配置寄存器
#define w_AllGain           0X32    //全通道增益,用于校正ref自校正
#define w_HFDouble          0X33    //脉冲常数加倍选择
#define w_LineGain          0X34    //基波增益校正
#define w_PinCtrl           0X35    //数字pin上下拉电阻选择控制
#define w_Pstartup          0X36    //起动功率阈值设置
#define w_Iregion0          0X37    //相位补偿区域设置寄存器
#define w_Iregion1          0X60    //相位补偿区域设置寄存器1
#define w_PhSregApq2        0X61    //A相相位校正2
#define w_PhSregBpq2        0X62    //B相相位校正2
#define w_PhSregCpq2        0X63    //C相相位校正2
#define w_PoffsetAL         0X64    //A相有功功率offset校正低字节
#define w_PoffsetBL         0X65    //B相有功功率offset校正低字节
#define w_PoffsetCL         0X66    //C相有功功率offset校正低字节
#define w_QoffsetAL         0X67    //A相无功功率offset校正低字节
#define w_QoffsetBL         0X68    //B相无功功率offset校正低字节
#define w_QoffsetCL         0X69    //C相无功功率offset校正低字节
#define w_ItRmsoffset       0X6A    //电流矢量和offset校正寄存器
#define w_TPSoffset         0X6B    //TPS初值校正寄存器
#define w_TPSgain           0X6C    //TPS斜率校正寄存器
#define w_TCcoffA           0X6D    //Vrefgain的二次系数
#define w_TCcoffB           0X6E    //Vrefgain的一次系数
#define w_TCcoffC           0X6F    //Vrefgain的常数项
#define w_EMCfg             0X70    //新增算法控制寄存器


//===================================================================================
extern void HT7038_init();                          //初始化HT7038
extern uint32_t Read7038(uint8_t rCmd);        //读HT703824位寄存器
extern void Write7038(uint8_t wCmd,uint32_t Dat);//写HT703824位寄存器


//====================================================================================


#endif /* USER_HT7038_H_ */

 ht7038.c

/*
 * HT7038.C
 *
 *  Created on: 2022年5月20日
 *      Author: armxu
 */


#include "HT7038.h"


//=================================================================
/*******************************************************************************
* Function Name  : SPI1_ReadWriteByte
* Description    : SPI1 read or write one byte.
* Input          : TxData: write one byte data.
* Return         : Read one byte data.
*******************************************************************************/
uint8_t SPI1_ReadWriteByte(uint8_t TxData)
{
    u8 i=0;
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET)
    {
        i++;
        if(i>50)return 0;
    }
    SPI_I2S_SendData(SPI1, TxData);
    i=0;
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET)
    {
        i++;
        if(i>50)return 0;
    }
    return SPI_I2S_ReceiveData(SPI1);
}
void HT7038_init()
{
   Write7038(0xD3,0X000000);//软件复位
   Delay_Us(100);           //100us的低电平
}
//=================================================================
//名称: long Read7038(Cmd)
//说明: 读ATT7022B24位寄存器
//注意:
//=================================================================
uint32_t Read7038(uint8_t rCmd)
{
    uint8_t Dat[3];//
    u32 iRet=0;
    CS(0);
    SPI1_ReadWriteByte(rCmd);
    Dat[0]=SPI1_ReadWriteByte(0xff);
    Dat[1]=SPI1_ReadWriteByte(0xff);
    Dat[2]=SPI1_ReadWriteByte(0xff);
    iRet= (Dat[0]<<16)|(Dat[1]<<8)|(Dat[2]);
    CS(1);

    return iRet;                //返回数据
}
//=================================================================
//名称: Write7038(unsigned char wCmd,long Dat)
//说明: 写ATT7022B 24位寄存器
//注意:
//=================================================================
void Write7038(uint8_t wCmd,uint32_t Dat)
{
    uint8_t Ddat[2];
    //提前拆分数据
    Ddat[1]=(Dat >> 16) & 0xff;
    Ddat[0]=(Dat >> 8) & 0xff;
    CS(0);

    SPI1_ReadWriteByte(wCmd);
    //32位拆分成3个8字节数据发送
    SPI1_ReadWriteByte(Ddat[1]);//高位先发送
    SPI1_ReadWriteByte(Ddat[0]);
    SPI1_ReadWriteByte(Dat);

    CS(1);
}


main.c

/********************************** (C) COPYRIGHT *******************************
 * File Name          : main.c
 * Author             : WCH
 * Version            : V1.0.0
 * Date               : 2020/04/30
 * Description        : Main program body.
 * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
 * SPDX-License-Identifier: Apache-2.0
 *******************************************************************************/

/*
 *@Note
 串口打印调试例程:
 USART1_Tx(PA9)。
 本例程演示使用 USART1(PA9) 作打印调试口输出。

*/

#include "debug.h"
#include "HT7038.h"
/* Global typedef */

/* Global define */
uint32_t result;
/* Global Variable */
/*******************************************************************************
* Function Name  : SPI_FullDuplex_Init
* Description    : Configuring the SPI for full-duplex communication.
* Input          : None
* Return         : None
*******************************************************************************/
void SPI_Master_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    SPI_InitTypeDef SPI_InitStructure;

    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1, ENABLE );

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    GPIO_SetBits(GPIOA, GPIO_Pin_4);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init( GPIOA, &GPIO_InitStructure );

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init( GPIOA, &GPIO_InitStructure );

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init( GPIOA, &GPIO_InitStructure );


    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;;
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
    SPI_InitStructure.SPI_NSS =  SPI_NSS_Soft;
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_Init( SPI1, &SPI_InitStructure );
//    SPI_SSOutputCmd( SPI1, DISABLE );
    SPI_Cmd( SPI1, ENABLE );
}

/*********************************************************************
 * @fn      main
 *
 * @brief   Main program.
 *
 * @return  none
 */
int main(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    Delay_Init();
    USART_Printf_Init(115200);
    SPI_Master_Init();
    HT7038_init();
    printf("SystemClk:%d\r\n", SystemCoreClock);

    printf("This is sssprintf example\r\n");

    while(1)
    {

        result=Read7038(rChipID);
        printf("  rChipID=0x%lx\r\n",result);
        result=Read7038(rDeviceID); //0x00
        printf("rDeviceID=0x%lx\r\n",result);
        Delay_Ms(160);
    }

}

标签: 传感器输出5v10v36v三线传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台