arduino wemos D1 SPI与HT7038通信

以下博客只实现了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();
}

发布了20 篇原创文章 · 获赞 6 · 访问量 7497

猜你喜欢

转载自blog.csdn.net/armcsdn/article/details/103222531