Teensy 3.x / SPI communication with "Wifly Shield" by "Sparkfun"

Status
Not open for further replies.

vinbob

Member
Hello there,

I am trying to connect a WiFly Shield from Sarkfun to a Teensy 3.1 using a Serial Peripheral Interface (SPI). ( https://www.sparkfun.com/products/9954 )
For this i use the SPI.h lib and the SPI pins on Teensy (10-13 | SS-CLK) connected to the SPI Pins on the WiFly Shield (10-13 | SS-CLK).
The WiFly uses a Uart-Bridge chip by "NXP" called "SC16IS750". The datasheet as well as all sample sketches for the Arduino Uno show the following specs:


  • 14 MHz crystal
  • SPI_MODE0
  • 4MHz
  • MSBFIRST
( https://www.sparkfun.com/datasheets/Components/SMD/SC16IS740_750_760.pdf )

Now alway when i try to perform a simple test by writing to and reading from a register (0x07 << 3) I read a 255 in every case.
When i switch the SPI setting to mode2 I get more or less random Numbers between 128 and 255 by reading from the Register.
What am i doing wrong ?! I tried nearly everything to find a way to get the SPI working but failed anytime.
Here is a sketch I use for testing:

Code:
#include <SPI.h>


SPISettings TeensySettings(4000000, MSBFIRST, SPI_MODE0);


void setup() {
  
  pinMode(SS, OUTPUT);
  digitalWrite(SS, LOW);
  pinMode(MOSI, OUTPUT);
  digitalWrite(MOSI, LOW);
  pinMode(MISO, INPUT_PULLUP);
  pinMode(SCK, OUTPUT);
  digitalWrite(SCK, LOW);
    
  SPI.begin();
  
  Serial.begin(9600);
  while(!Serial);    // waiting for Serial port to be opened 


  Serial.println("START SPI TEST \n\n");
  
}


void loop(){
 
  const byte value = 0xAA;     // Value to be written 0xff 0=>255 // 0xee => 246 // 0x10 => 128
  const byte adress = 0x07; // Register adress
  
  writeRegister(adress, value);    // write a value into register with adress "adress"


  readRegister(adress);   // read value stored in register with adress "adress" 
  
  delay(500);
  
  Serial.println();
  Serial.println("------");
  Serial.println();
}


void writeRegister(uint8_t registerAddress, uint8_t data) {
    
  SPI.beginTransaction(TeensySettings);
  digitalWrite(10,LOW);
  delay(100);
  
  SPI.transfer(registerAddress << 3);
  SPI.transfer(data);


  delay(100);
  digitalWrite(10,HIGH);
  SPI.endTransaction();
  
}


uint8_t readRegister(uint8_t registerAddress) {


  uint8_t result;


  SPI.beginTransaction(TeensySettings);
  digitalWrite(10,LOW);
  delay(100);
  
  SPI.transfer( 0x80 | (registerAddress << 3) );
  result = SPI.transfer(0xFF);
  
  delay(100);
  digitalWrite(10,HIGH);
  SPI.endTransaction();
  
  Serial.print("result: ");Serial.println(result); 
  return result;             // in mode0 the result is 255 in any case !! // in mode2 the result is between 128 and 255  
  
}

I also tried using the datatype "byte" instead of "uint8_t" and got the same results in both cases.
i have no idea what i am doing wrong.
Would be very pleased for any hints and advices ! :)

best, vinc

ps.: here is a thread to a similar problem. But there was no answer which neither solved this nor mine problem.
https://forum.pjrc.com/threads/26418-DMA-Modes?goto=nextoldest
 
your input numbers suggest that possibly
  • MISO input not connected to the device
  • SS output is not connected to device's NSS or CS* pin
  • Device has no power/ground
 
Thanks for the immediate replay.
I double-checked the wiring. I connected all four SPI pins as following:

(* Teensy --> WiFly )
* pin 10 (CS) --> pin 10 (SS)
* pin 11 (DOUT) --> pin 11 (MOSI)
* pin 12 (DIN) --> pin 12 (MISO)
* pin 13 (SCK) --> pin 11 (SCLK)

as well as the power supply:

* WiFly pin Vin to a 5V source
* WiFly pin Gnd (right next to Vin) to a ground

the WiFly Shield blinks in the right pattern, therefore all wiring should be fine as far as i am concerned.
 
Status
Not open for further replies.
Back
Top