SPI на плате ADE7953 - PullRequest
       30

SPI на плате ADE7953

0 голосов
/ 30 января 2020

Итак, я пытался использовать SPI-связь между платой и моим Arduino. В руководстве к плате говорится, что необходимо отправить два байта с адресом, который я хочу прочитать / записать, и еще один байт, чтобы выбрать чтение или запись (наиболее значимый бит сообщает, какой из них будет применяться). Тем не менее, мой код не работает. Кто-нибудь хочет помочь? код

1 Ответ

0 голосов
/ 31 января 2020

Я не использовал реальную библиотеку Arduino SPI, но я предложу вам фрагмент Arduino, который вместо этого будет использовать битовый 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
}
...