以下博客只实现了HT7038的计量寄存器的读取,校表寄存器的写入是存在问题的。没有删除的目的是保留波形图和实际串口输出图。
完整程序请参考 “arduino Wemos D 1HT7038调试笔记”
https://blog.csdn.net/armcsdn/article/details/103294388
先上可以执行代码
#include <SPI.h>
#include <BlynkSimpleEsp8266.h>
BlynkTimer timer;
#define HT7038_CS D8
#define rDeviceID 0x00 //7038 Device ID
#define rChipID 0x5d //芯片版本指示器0X7026E0
void SPIsendData()
{
Serial.print("rDeviceID=0x");
Serial.println(Read7038(rDeviceID),HEX);
Serial.print(" rChipID=0x");
Serial.println(Read7038(rChipID),HEX);
}
void HT7038_init()
{
digitalWrite(HT7038_CS, LOW);
Write7038(0xD3,0X000000);//软件复位
digitalWrite(HT7038_CS, HIGH);
}
unsigned long Read7038(unsigned char rCmd)
{
unsigned long buffer=0;
unsigned char dataLength=3;
unsigned char byteIndex=0 ;
unsigned char receiveBuffer = 0;
digitalWrite(HT7038_CS, LOW);
SPI.transfer(rCmd); //发送命令
//接收从站返回数据,SPI.transfer(0)一次带回1个byte数据
while(byteIndex < dataLength)
{
receiveBuffer = SPI.transfer(0);
buffer = (buffer << 8) + receiveBuffer;
byteIndex++;
}
digitalWrite(HT7038_CS, HIGH);
return buffer;
}
void Write7038(unsigned char wCmd,unsigned long Dat)
{
long send;
//32大端转小端原理
send = ((Dat>>24)&0xff) | // move byte 3 to byte 0
((Dat<<8)&0xff0000) | // move byte 1 to byte 2
((Dat>>8)&0xff00) | // move byte 2 to byte 1
((Dat<<24)&0xff000000); // byte 0 to byte 3
SPI.transfer(wCmd);
SPI.transfer(&send,4);
}
void setup()
{
Serial.begin(115200);
pinMode(HT7038_CS,OUTPUT);
digitalWrite(HT7038_CS, HIGH);
SPI.begin();
SPI.setClockDivider(SPI_CLOCK_DIV32);//时钟32分频,SPI时钟250kHz
SPI.setDataMode(SPI_MODE1);// 仅SPI_MODE1才可以接收到从站数据,其余模式均无法收到数据 SPI_MODE0 SPI_MODE2和SPI_MODE3无效
SPI.setBitOrder(MSBFIRST);
HT7038_init();
timer.setInterval(1000L, SPIsendData);
}
void loop() {
timer.run();
}