我需要从芯片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);
阅读结果如下 但是根据数据表的时序图应该是这样的 从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-此堆栈延迟了我的智能套接字的开发。