Синхронизация фазы Arduino SPI с данными для всех 4 режимов, что не так? - PullRequest
0 голосов
/ 20 марта 2020

Я пытаюсь управлять LTC1664 DA C от Arduino ( Mega 2560 ). Данные и тактовые импульсы SPI, поступающие из Arduino, всегда синхронизируются ( подъем и спад ) для всех 4 режимов, когда в листе данных DA C указано фазирование

Я перепробовал все режимы , линия SS на чипе снижается во время записи (, как следует ), и я пробовал разные скорости и shiftOut (), setClockDivider (), setDataMode (), beginTransaction ( ) и endTransaction () .

Это ошибка в Arduino SPI, что-то конкретное c для Mega 2560, следует ли мне попробовать Uno или Due? Помогите, пожалуйста! Код ниже трассировки o-scope.

Кстати: 16-битное слово, которое я пытаюсь передать, это 0x3600 ( усечение трассировки o-scope ) .

/*
  Test DAC Control

  created 18 Mar 2020 (Covid-19, oppsies)
  by Danny Holstein

*/


// inslude the SPI library:
#include <SPI.h>

void DAC(unsigned short value, unsigned char channel, int SS_Pin, int model);
enum models{LTC1664};
enum models model;

// set pin 10 as the slave select for the digital pot:
const int DAC_SS_Pin = 22;

void setup() {
  // set the DAC_SS_Pin as an output:
  // initialize SPI:
  Serial.begin(115200);
  SPI.begin();
  Serial.println("SPI.begin");
  pinMode(DAC_SS_Pin, OUTPUT);

}

void loop() {
  // go through the six channels of the digital pot:
    for (int channel = 1; channel < 6; channel++) {
        delay(500);
        DAC(128*channel, channel, DAC_SS_Pin, LTC1664);
    }
    delay(1000);
 Serial.println("new loop");
}

/*
  DAC Control

  This function controls an LTC1664 Micropower Quad 10-Bit DAC.

 The LTC1664 is SPI-controlled,and to command it, you send one 16 bit word,
  A3 A2 A1 A0 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 X1 X0
  |  ADDR   |         INPUT CODE           | DON'T CARE

 The circuit:
  * CS - to digital pin 22  (SS pin)
  * SDI - to digital pin 51 (MOSI pin)
  * SDO - to digital pin 50 (MISO pin, not used in this function)
  * CLK - to digital pin 52 (SCK pin)

 created 18 Mar 2020 (Covid-19, oppsies)
 by Danny Holstein

*/

void DAC(unsigned short value, unsigned char channel, int SS_Pin, int model) {
  // take the SS pin low to select the chip:
    digitalWrite(SS_Pin, LOW); delay(100);
    unsigned short buf, b16;
    unsigned char *c, b; c = (unsigned char *) &buf;
    switch (model)
    {
        case LTC1664:
            if (channel > 4) channel = 0xF;
            buf = (channel << 12) | ((value & 0x3FF) << 2);
            SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
            b16 = SPI.transfer16(buf);
            Serial.print("0x" + String(buf, HEX)); Serial.println("\t0x" + String(b16, HEX) + "\t");
            SPI.endTransaction();
            break;
        default:
            break;
    }   
    delay(100);
  // take the SS pin high to de-select the chip:
    digitalWrite(SS_Pin, HIGH);
    // printf("value = 0x%04x", buf);
}

1 Ответ

0 голосов
/ 20 марта 2020

Оказывается, это не было связано с функцией Arduino SPI или проблемами фазирования, LTC1664 имеет вывод CLR, который я подключил к GPIO, но не смог подать команду HIGH, он был плавающим и блокировал чип, команда HIGH и теперь все хорошо.

...