ESP8266通过SPI与ATT7053BU对话

时间:2018-07-10 19:47:17

标签: esp8266 spi

我需要从芯片ATT7053BU获取寄存器数据。芯片用于测量能量。但是,通过Arduino的标准功能(如SPI.transfer(register))来获取数据非常棘手。为了测试是否工作SPI,我读取了芯片的0x1B寄存器。根据数据表,它具有芯片的价值。但是使用esp8266的标准功能SPI会导致SCK信号中断。 要从芯片读取3个字节,我只需使用SPI标准功能的3次读取:

  SPI.setDataMode(SPI_MODE1);
  SPI.setBitOrder(MSBFIRST);
  SPI.setClockDivider(SPI_CLOCK_DIV16);
  digitalWrite(CS, LOW);
  SPI.transfer(0x1B);
  SPI.setDataMode(SPI_MODE0);
  val1 = SPI.transfer(0);
  val2 = SPI.transfer(0);
  val3 = SPI.transfer(0);

阅读结果如下 Time diagram of reading Info 但是根据数据表的时序图应该是这样的 ATT7053BU time diagram 从esp8266库中,我发现了在字节之间建立延迟的代码while(SPI1CMD&SPIBUSY){}

uint8_t transfer8Bits(uint8_t data) {
    while(SPI1CMD & SPIBUSY) {} //creates delay between sending data
    // reset to 8Bit mode
    setDataBits(8);
    SPI1W0 = data;
    SPI1CMD |= SPIBUSY;
   while(SPI1CMD & SPIBUSY) {}
    return (uint8_t) (SPI1W0 & 0xff);
}

问题是-如何防止字节传输之间的延迟? 也许存在其他库或代码示例。 任何帮助都是有用的,因为我真的很喜欢。 同样在ESP中,使用的寄存器会创建同步脉冲序列,该寄存器为SPI1U1。我不知道在哪里可以找到描述。库中的代码是

void setDataBits(uint16_t bits) {
    const uint32_t mask = ~((SPIMMOSI << SPILMOSI) | (SPIMMISO << SPILMISO));
    bits--;
    SPI1U1 = ((SPI1U1 & mask) | ((bits << SPILMOSI) | (bits << SPILMISO)));
}

对于解释此代码的工作方式也将很有用。

链接到ATT7053BU的用户手册 ATT7053BU datasheet

谢谢。

  

PS-此堆栈延迟了我的智能套接字的开发。

0 个答案:

没有答案