Arduino SPI clock phase synched with data for all 4 modes, what's wrong?

I'm trying to drive the LTC1664 DAC from an Arduino (Mega 2560). The SPI data and clock coming out of the Arduino is always synched (rise and falls) for all 4 modes when the DAC data sheet indicates phasing

I've tried all modes, the SS line on the chip is being brought low during the writes (as it should) and I've tried different speeds and
** **shiftOut(), setClockDivider(), setDataMode(), beginTransaction()** **
and
** **endTransaction()** **
.

Is this a bug in Arduino SPI, something specific to the Mega 2560, should I try an Uno or Due? Help please! Code below o-scope traces.

BTW: The 16 bit word I'm trying to transmit is, 0x3600 (o-scope trace truncated).


#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");
  SPI.setClockDivider(SPI_CLOCK_DIV16); SPI.setDataMode(SPI_MODE0);
  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(16000000, 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);
}

I'm trying to drive the LTC1664 DAC from an Arduino (Mega 2560). The SPI data and clock coming out of the Arduino is always synched (rise and falls) for all 4 modes when the DAC data sheet indicates phasing

What's the problem? What do you mean by phasing? SPI data is read at an edge (either rising or falling). As long as the data is valid at that edge, everything is OK. When exactly the master is changing it's data lines (at the other edge or somewhere in between) is completely irrelevant as long as you keep the timing. Usually syncing at the other edge is almost optimal as it ensures you keep the timing of almost all devices.

Main problem is, the chip isn't doing what it's supposed to do. Reading the chip documentation, it should be SPI mode 0, where the data is available before the rising edge of the clock, not in-phase or synchronized with the clock, which should be mode 1. As I zoom in with the oscilloscope, it looks perfectly in synch.

With that said, I wrote a bit-banging function to more closely match LTC1664 which was similarly unsuccessful.

Turns out it wasn't related to the Arduino SPI function or phasing issues, the LTC1664 has a CLR pin that I had attached to a GPIO but had failed to command HIGH, it had been floating and inhibiting the chip, command HIGH and everything is good now.