首页 > 解决方案 > ADE7953板上的SPI

问题描述

所以,我一直在尝试在开发板和我的 arduino 之间实现 SPI 通信。在板的手册中,它说需要发送两个字节以及我要读/写的地址和另一个字节来选择读或写(最高有效位告诉你哪个将适用)。但是,我的代码似乎没有运行。有人愿意帮忙吗?代码

标签: arduinospi

解决方案


我没有使用实际的 Arduino SPI 库,但我会为您提供一个 Arduino 代码片段,它会 bitbang SPI 代替。它将允许您发送一些字节以查看是否一切正常。尝试另一种方法以查看它是否有效可能会很有用。您将需要更改引脚和寄存器以匹配您的目标应用程序。

#define PIN_SPIDATA 16
#define PIN_SPICLK  17
#define PIN_SPILOAD 18

#define REG_DECODEMODE  0x09
#define REG_INTENSITY   0x0A
#define REG_SCANLIMIT   0x0B
#define REG_SHUTDOWN    0x0C
#define REG_DISPLAYTEST 0x0F

void setup() {

  // set ddr for sw spi pins
  pinMode(PIN_SPICLK, OUTPUT);
  pinMode(PIN_SPIDATA, OUTPUT);
  pinMode(PIN_SPILOAD, OUTPUT);

  setRegister(REG_INTENSITY, 0x04); 
  setRegister(REG_SCANLIMIT, 0x07);
  setRegister(REG_SHUTDOWN, 0x01);    // normal operation
  setRegister(REG_DECODEMODE, 0x00);  // pixels not integers
  setRegister(REG_DISPLAYTEST, 0x00); // not in test mode
}

// sends a single byte by sw spi (no latching)
void putByte(uint8_t data)
{
  uint8_t i = 8;
  uint8_t mask;
  while(i > 0) {
    mask = 0x01 << (i - 1);         // get bitmask
    digitalWrite(PIN_SPICLK, LOW);   // tick
    if (data & mask){               // choose bit
      digitalWrite(PIN_SPIDATA, HIGH); // set 1
    }else{
      digitalWrite(PIN_SPIDATA, LOW);  // set 0
    }
    digitalWrite(PIN_SPICLK, HIGH);  // tock
    --i;                            // move to lesser bit
  }
}

// sets register to the same byte value for all screens
void setRegister(uint8_t reg, uint8_t data)
{
  digitalWrite(PIN_SPILOAD, LOW); // begin
  for(uint8_t i = 0; i < numChips; ++i){
    putByte(reg);  // specify register
    putByte(data); // send data
  }
  digitalWrite(PIN_SPILOAD, HIGH);  // latch in data
  digitalWrite(PIN_SPILOAD, LOW); // end
}

推荐阅读