SPI difficulty

Hi, I can't get the SPI function to work on my Nano. The code is here:

#include <SPI.h>

//Chip select for three DAC's
int CS1 = 10; 
int CS2 = 9;
int CS3 = 8;

// set up the speed, data order and data mode
SPISettings settings(10000000, MSBFIRST, SPI_MODE0); 

void setup() {
  pinMode (CS1, OUTPUT);
  digitalWrite(CS1, HIGH);
  pinMode (CS2, OUTPUT);
  digitalWrite(CS2, HIGH);
  pinMode (CS3, OUTPUT);
  digitalWrite(CS3, HIGH);

  // initialize SPI:
  SPI.begin();
}

void loop() {
  // SPI communication with DAC
  SPI.beginTransaction(settingsA);
  digitalWrite(CS1, LOW);
  digitalWrite(CS2, LOW);
  digitalWrite(CS3, LOW);
  SPI.transfer(127);
  SPI.transfer(127);
  digitalWrite(CS1, HIGH);
  digitalWrite(CS2, HIGH);
  digitalWrite(CS3, HIGH);
  SPI.endTransaction();
  
  delay(1000); 
}

I think it should be Mode0, but I've tried all modes and varying speeds also, and it still doesn't seem to work. The below code does work fine - does this way of doing it have disadvantages? Is it a lot slower for example?

Primarily though would appreciate if someone could point out what I am doing wrong in the above please

Many thanks

#define CS1 10
#define CS2 9
#define CS3 8
#define DIN 12
#define SCK 13

void setup() {
  // put your setup code here, to run once:
pinMode(CS1, OUTPUT);
pinMode(CS2, OUTPUT);
pinMode(CS3, OUTPUT);
pinMode(DIN, OUTPUT);
pinMode(SCK, OUTPUT);

digitalWrite(CS1, HIGH);
digitalWrite(CS2, HIGH);
digitalWrite(CS3, HIGH);
}

void loop() {
  // DAC1
digitalWrite(CS1, LOW);
delay(100);
//1011001100110011
//1
digitalWrite(DIN, HIGH);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);
//0
digitalWrite(DIN, LOW);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);
//1
digitalWrite(DIN, HIGH);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);
//1
digitalWrite(DIN, HIGH);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);

//0
digitalWrite(DIN, LOW);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);
//0
digitalWrite(DIN, LOW);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);
//1
digitalWrite(DIN, HIGH);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);
//1
digitalWrite(DIN, HIGH);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);

//0
digitalWrite(DIN, LOW);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);
//0
digitalWrite(DIN, LOW);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);
//1
digitalWrite(DIN, HIGH);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);
//1
digitalWrite(DIN, HIGH);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);

//0
digitalWrite(DIN, LOW);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);
//0
digitalWrite(DIN, LOW);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);
//1
digitalWrite(DIN, HIGH);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);
//1
digitalWrite(DIN, HIGH);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);

digitalWrite(CS1, HIGH);

//DAC2
digitalWrite(CS2, LOW);
delay(100);
//1011001100110011
//1
digitalWrite(DIN, HIGH);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);
//0
digitalWrite(DIN, LOW);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);
//1
digitalWrite(DIN, HIGH);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);
//1
digitalWrite(DIN, HIGH);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);

//0
digitalWrite(DIN, LOW);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);
//0
digitalWrite(DIN, LOW);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);
//1
digitalWrite(DIN, HIGH);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);
//1
digitalWrite(DIN, HIGH);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);

//0
digitalWrite(DIN, LOW);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);
//0
digitalWrite(DIN, LOW);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);
//1
digitalWrite(DIN, HIGH);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);
//1
digitalWrite(DIN, HIGH);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);

//0
digitalWrite(DIN, LOW);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);
//0
digitalWrite(DIN, LOW);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);
//1
digitalWrite(DIN, HIGH);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);
//1
digitalWrite(DIN, HIGH);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);

digitalWrite(CS2, HIGH);

//DAC3
digitalWrite(CS3, LOW);
delay(100);
//1011001100110011
//1
digitalWrite(DIN, HIGH);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);
//0
digitalWrite(DIN, LOW);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);
//1
digitalWrite(DIN, HIGH);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);
//1
digitalWrite(DIN, HIGH);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);

//0
digitalWrite(DIN, LOW);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);
//0
digitalWrite(DIN, LOW);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);
//1
digitalWrite(DIN, HIGH);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);
//1
digitalWrite(DIN, HIGH);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);

//0
digitalWrite(DIN, LOW);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);
//0
digitalWrite(DIN, LOW);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);
//1
digitalWrite(DIN, HIGH);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);
//1
digitalWrite(DIN, HIGH);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);

//0
digitalWrite(DIN, LOW);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);
//0
digitalWrite(DIN, LOW);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);
//1
digitalWrite(DIN, HIGH);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);
//1
digitalWrite(DIN, HIGH);
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);

digitalWrite(CS3, HIGH);

delay(1000);
}

AFAIK you can only talk to one SPI slave at a time and to do that you should only set one of the CS lines LOW

...R

A Nano can't go over 8MHz SPI frequency. If you activate more than one SPI device at the same time (by pulling it's CS low) you might create a short circuit on the MISO line which can destroy the device.

As noted, 8000000 is the max speed for a Nano with a 16 MHz system clock.

Try moving this to After SPI.begin();

// set up the speed, data order and data mode
SPISettings settings(10000000, MSBFIRST, SPI_MODE0);

You might even try leaving it out altogether, the defaults are speed of 4000000, MSBFIRST, and SPI Mode 0. With the delay(1000); I doubt you'd notice the difference between 4000000 and 8000000.

I've never used these 2 lines, is that something new?
SPI.beginTransaction(settingsA);
and
SPI.endTransaction();

The MISO comment is not a concern as you do not appear to have MISO connected.

Yea, problem sorted, thanks for the help!

Mickey_blu_eyes:
Yea, problem sorted, thanks for the help!

Good idea, and very helpful to those in the future searching the forums, if you explainded what you did to sort the problem.

Sorry but I'd actually just got it wrongly connected. One of the first pinout diagrams that pops up on google for 'nano spi connections' is this one - which shows the mosi pin as D12, when it should be D11!!

Still, useful info about max speed and risks of talking to multiple slaves simlutaneously - thanks a lot!