This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

EK-TM4C123GXL: Issue with SPI communication

Part Number: EK-TM4C123GXL
Other Parts Discussed in Thread: BQ76PL536EVM-3, BQ76PL536, MSP-EXP430F5529LP

Good morning,

 

I’m contacting you in reference to a problem with the LaunchPad EK-TM4C123GXL and the SPI communication.

We are trying to establish SPI communication between the EK-TM4C123GXL and the bq76PL536EVM-3 but it is not working.

 

We are using the following pins from the EK-TM4C123GXL:          

  • MISO: PA_4
  • MOSI: PA_5
  • CS: PA_3
  • SCK: PA_2

 

And the attached code.

The code was implemented to perform and autoaddress procedures specific for the bq76PL536 chips. The problem is detected because the chips are not responding after a requested sended by the EK-TM4C123GXL.

We have tried the code with other LaunchPad like the MSP-EXP430F5529LP and it works.

 

We would very much appreciated if you could provide some help.

 

Regards,

//LLIBRERIES -------------------------------------
#include <SPI.h>


//VARIABLES ------------------------
int slaveSelectPin = 20;
bool r = true;
int n_devices = 0;


//FUNCIO ENVIAMENT_DADES_DEVICE ------------------------------------------
void ENVIAMENT_DADES_DEVICE (byte device, byte adress, byte dades) {    
  byte WRITE = ((int)device << 1) + 1;

  byte CRCINPUT[3] = {WRITE, adress, dades};

  digitalWrite(slaveSelectPin, LOW);
  SPI.transfer(WRITE);
  SPI.transfer(adress);
  SPI.transfer(dades);
  SPI.transfer(Pec(CRCINPUT));
  digitalWrite(slaveSelectPin, HIGH);

  Serial.println("WRITE");
  Serial.println("SDO: ");
  Serial.println(WRITE, HEX);
  Serial.println(adress, HEX);
  Serial.println(dades, HEX);
  Serial.println(Pec(CRCINPUT), HEX);
}

//FUNCIO CONSULTA_DADES --------------------------------------------
byte CONSULTA_DADES(byte device, byte adress) {
  byte answer;
  byte crc;

  byte READ = ((int)device << 1);
  byte l = 0b1;
    
  digitalWrite(slaveSelectPin, LOW);
  SPI.transfer(READ);
  SPI.transfer(adress);
  SPI.transfer(l);
  answer = SPI.transfer(0x00);
  crc = SPI.transfer(0x00);
  digitalWrite(slaveSelectPin, HIGH);

  Serial.println("READ");
  Serial.println("SDO: ");
  Serial.println(READ, HEX);
  Serial.println(adress, HEX);
  Serial.println(l, HEX);
  Serial.println("SDI: ");
  Serial.println(answer, HEX);
  Serial.println(crc, HEX);
  Serial.println();
  return answer;
}

//FUNCIO ENVIAMENT_DADES_BRODCAST -------------------------------
void ENVIAMENT_DADES_BRODCAST(byte adress, byte dades) {
  
  byte WRITE = 0b01111111;
  byte CRCINPUT[3] = {WRITE, adress, dades};

  digitalWrite(slaveSelectPin, LOW);
  SPI.transfer(WRITE);
  SPI.transfer(adress);
  SPI.transfer(dades);
  SPI.transfer(Pec(CRCINPUT));
  digitalWrite(slaveSelectPin, HIGH);

  Serial.println();
  Serial.println("BRODCAST");
  Serial.println("SDO: ");
  Serial.println(WRITE, HEX);
  Serial.println(adress, HEX);
  Serial.println(dades, HEX);
  Serial.println(Pec(CRCINPUT), HEX);
  Serial.println();
}

//crcTable --------------------------------
const byte crcTable[256] = {
  0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15, 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A,
  0x2D, 0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65, 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D,
  0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5, 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD, 0x90,
  0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85, 0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD, 0xC7, 0xC0,
  0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2, 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA, 0xB7, 0xB0, 0xB9,
  0xBE, 0xAB, 0xAC, 0xA5, 0xA2, 0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A, 0x27, 0x20, 0x29, 0x2E,
  0x3B, 0x3C, 0x35, 0x32, 0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A, 0x57, 0x50, 0x59, 0x5E, 0x4B,
  0x4C, 0x45, 0x42, 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A, 0x89, 0x8E, 0x87, 0x80, 0x95, 0x92,
  0x9B, 0x9C, 0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4, 0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB,
  0xEC, 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4, 0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C,
  0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44, 0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C, 0x21,
  0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34, 0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B, 0x76, 0x71,
  0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63, 0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B, 0x06, 0x01, 0x08,
  0x0F, 0x1A, 0x1D, 0x14, 0x13, 0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB, 0x96, 0x91, 0x98, 0x9F,
  0x8A, 0x8D, 0x84, 0x83, 0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB, 0xE6, 0xE1, 0xE8, 0xEF, 0xFA,
  0xFD, 0xF4, 0xF3
};

//Calcul CRC ------------------------------------------------
byte Pec(byte crcBuffer[]){
  byte crc = 0;
  int temP = 0;
  for (int i = 0; i < sizeof(crcBuffer) + 1; i++){
    temP = crc ^ crcBuffer[i];
    crc = crcTable[temP];
  }
  return crc;
}

//AUTOMATIC ADDRESSING:
int ADDRESSING(){
  Serial.println("--------------------------------");
  Serial.println("-----------AUTOADDRESS----------");
  Serial.println("--------------------------------");
  Serial.println();
  
  Serial.println("brodcast resert inicial");
  delay(500);
  ENVIAMENT_DADES_BRODCAST (0x3c,0xa5);                     //Brodcast RESET inicial
  Serial.println();

  
  int i = 1;                                                //nombre de slaves adre�ades en cada iteracio
  int n = 0;                                                //nombre de slaves trobades
  while (r){                                                //TRUE = ha trobat slave a adre�ar
    i = 1;
    while (i<=n){
     CONSULTA_DADES (0x00, 0x00);
     ENVIAMENT_DADES_DEVICE(0x00, 0x3b, i);
     i++;
    }
    
    if (CONSULTA_DADES (0x00, 0x00) != 0){
      n++;
      Serial.println ("Nova slave trobada");
      ENVIAMENT_DADES_DEVICE(0x00, 0x3b, n);
      ENVIAMENT_DADES_BRODCAST (0x3c, 0xa5);
    }
    else{
      r = false;
    }
  }

  Serial.println("RESULTAT:");
  Serial.print("Nombre de slaves trobades: ");
  Serial.println(n);
  Serial.println();
  i = 0;
  while (i < n){
    Serial.print("Slave ");
    Serial.println(i+1);
    i++;
  }
  return n;
}



//SETUP --------------------------------
void setup() {
  
  SPI.begin();
  SPI.setModule(2);
  SPI.setBitOrder(MSBFIRST); 
  SPI.setDataMode(SPI_MODE1);
  SPI.setClockDivider(SPI_CLOCK_DIV8);

  Serial.begin(9600);
  
  pinMode(slaveSelectPin, OUTPUT);

  delay(1000);

  int n_devices = ADDRESSING();                   //Crida funci� d'acre�ament

  SPI.end();
}



//MAIN LOOP -----------------------------------
void loop() {}

  • Hi Manel,
    Can you please use a scope to find out what is transmitted by the TM4C MCU? Is the data correct?
  • Hello,

    Attached you could find the MOSI signals generated by an Arduino UNO and the TM4C123GXL.

    The code used in both boards is the same.

    It's seems that there is a problem with the voltage reference (-5.00 V instead 0 V)?

    Thank you,

    Manel

     

  • Manel,
    - You say "the code is the same". There is very little chance that a code for Arduino will work on SPI communication in a TM4C...
    - Did you download, install and learn about the Tivaware drivers? Are you using Tivaware drivers for the SPI comm?
    - Assuming the "S" mark on your scope is the GND reference for both devices, the pulse on the second image makes more sense (low is ~zero, high is ~3V - although it should still be a bit higher, at 3.3V) - but I'd expect to see the low signal closer to zero, you may be using too strong pull-ups? Or is there something else weird on your electric setup? If the white line is the GND reference, then how come you are reading -3V out of a TM4C? Care to share the schematics and maybe a picture of where these signals are being taken from?
    - You are obviously not sending serial pulses on bottom images - why? Where is the MOSI command?
    Regards
    Bruno
  • Bruno Saraiva said:
    Assuming the "S" mark on your scope is the GND reference for both devices

    Perhaps not!      That "S" mark - appearing upon top & bottom scope traces - is (instead) defined as -3.68V - and is the bottom reference for the "Voltage Measurement Cursor."     (the right side of the top trace details)

    It is (almost) as if the TM4C board's "3V3" is tied to the "Target board's ground" - while TM4C's ground "floats" - and thus an output LOW from the TM4C would appear (near) -3V !     (which of course - can never succeed in this application...)

    It is not that hard to miss (or butcher) ground interconnects when prototyping...

  • Hi,
    As suggested by Bruno and cb1 you obvious may have both the hardware and software problem. There is not valid SPI transaction coming out of the MCU. I will suggest you first try out TivaWare SPI examples to get familiar with the module.