Невозможно получить результаты от связи SPI между акселерометром и EK-TM4C123GXL - PullRequest
0 голосов
/ 11 марта 2019

Я пытаюсь связать акселерометр (ADXL345 от Adafruit) с модулем микроконтроллера EK-TM4C123GXL.

Для этого у меня было две опции:

1> Использование связи SPI и

2> Использование связи I2C

Я пошел с SPI.Я уже реализовал то же самое с использованием Arduino UNO.Проводка была следующей:

http://www.tinyosshop.com/index.php?route=product/product&product_id=161 Кроме того, я использовал этот код:

    //Add the SPI library so we can communicate with the ADXL345 sensor
    #include <SPI.h>

    //Assign the Chip Select signal to pin 10 for Arduino Uno and 12 for TIVA Launchpad (tm4c123gxl).
    int CS=12;

    //This is a list of some of the registers available on the ADXL345.
    //To learn more about these and the rest of the registers on the ADXL345, read the datasheet!
    char POWER_CTL = 0x2D;    //Power Control Register
    char DATA_FORMAT = 0x31;
    char DATAX0 = 0x32;    //X-Axis Data 0
    char DATAX1 = 0x33;    //X-Axis Data 1
    char DATAY0 = 0x34;    //Y-Axis Data 0
    char DATAY1 = 0x35;    //Y-Axis Data 1
    char DATAZ0 = 0x36;    //Z-Axis Data 0
    char DATAZ1 = 0x37;    //Z-Axis Data 1

    //This buffer will hold values read from the ADXL345 registers.
    char values[10];
    //These variables will be used to hold the x,y and z axis accelerometer values.
    int x,y,z;

    void setup(){
      //Initiate an SPI communication instance.
      SPI.begin();
      //Configure the SPI connection for the ADXL345.
      SPI.setDataMode(SPI_MODE3);
      //Create a serial connection to display the data on the terminal.
      Serial.begin(9600);

      //Set up the Chip Select pin to be an output from the Arduino.
      pinMode(CS, OUTPUT);
      //Before communication starts, the Chip Select pin needs to be set high.
      digitalWrite(CS, HIGH);

      //Put the ADXL345 into +/- 4G range by writing the value 0x01 to the DATA_FORMAT register.
      writeRegister(DATA_FORMAT, 0x01);
      //Put the ADXL345 into Measurement Mode by writing 0x08 to the POWER_CTL register.
      writeRegister(POWER_CTL, 0x08);  //Measurement mode  
    }

    void loop(){
      //Reading 6 bytes of data starting at register DATAX0 will retrieve the x,y and z acceleration values from the ADXL345.
      //The results of the read operation will get stored to the values[] buffer.
      readRegister(DATAX0, 6, values);

      //The ADXL345 gives 10-bit acceleration values, but they are stored as bytes (8-bits). To get the full value, two bytes must be combined for each axis.
      //The X value is stored in values[0] and values[1].
      x = ((int)values[1]<<8)|(int)values[0];
      //The Y value is stored in values[2] and values[3].
      y = ((int)values[3]<<8)|(int)values[2];
      //The Z value is stored in values[4] and values[5].
      z = ((int)values[5]<<8)|(int)values[4];

      //Print the results to the terminal.
      Serial.print(x, DEC);
      Serial.print(',');
      Serial.print(y, DEC);
      Serial.print(',');
      Serial.println(z, DEC);      
      delay(10);
    }

    //This function will write a value to a register on the ADXL345.
    //Parameters:
    //  char registerAddress - The register to write a value to
    //  char value - The value to be written to the specified register.
    void writeRegister(char registerAddress, char value){
      //Set Chip Select pin low to signal the beginning of an SPI packet.
      digitalWrite(CS, LOW);
      //Transfer the register address over SPI.
      SPI.transfer(registerAddress);
      //Transfer the desired register value over SPI.
      SPI.transfer(value);
      //Set the Chip Select pin high to signal the end of an SPI packet.
      digitalWrite(CS, HIGH);
    }

    //This function will read a certain number of registers starting from a specified address and store their values in a buffer.
    //Parameters:
    //  char registerAddress - The register addresse to start the read sequence from.
    //  int numBytes - The number of registers that should be read.
    //  char * values - A pointer to a buffer where the results of the operation should be stored.
    void readRegister(char registerAddress, int numBytes, char * values){
      //Since we're performing a read operation, the most significant bit of the register address should be set.
      char address = 0x80 | registerAddress;
      //If we're doing a multi-byte read, bit 6 needs to be set as well.
      if(numBytes > 1)address = address | 0x40;

      //Set the Chip select pin low to start an SPI packet.
      digitalWrite(CS, LOW);
      //Transfer the starting register address that needs to be read.
      SPI.transfer(address);
      //Continue to read registers until we've read the number specified, 
       storing the results to the input buffer.
      for(int i=0; i<numBytes; i++){
        values[i] = SPI.transfer(0x00);
      }
      //Set the Chips Select pin high to end the SPI packet.
      digitalWrite(CS, HIGH);
      delay(200);
    }

Мне удалось заставить это работать.Теперь я попытался повторить этот процесс с помощью другого модуля микроконтроллера EK-TM4C123GXL (на основе tm4c123gh6pm от Texas Instruments), также известного как TIVA Launchpad.Программирование теперь должно было быть выполнено с использованием другой IDE: «Энергия».Также нужно было изменить проводку, поскольку панель запуска имеет 4 порта SPI, и (возможно) нет никаких условий для выбора конкретного порта SPI в Energia, который использует те же программы, что и Arduino.Итак, я выбрал использование SPI0.В соответствии с конфигурацией контактов enter image description here

я использовал PA_2, PA_3, PA_4 и PA_5 для SCK, CS, MISO и MOSI.В программировании все, что я изменил, было объявлением Pin CS с 10 (в UNO) до 12 (в Launchpad).

Но при компиляции и загрузке кода все, что я получил на последовательном мониторе, было (0, 0,0).

Может ли кто-нибудь пролить свет на происхождение необычного поведения панели запуска Tiva?Кроме того, было бы здорово, если бы было предоставлено решение, чтобы я мог получить три данных ускорения на последовательном мониторе, как и предполагалось.Спасибо, что вы достаточно терпеливы, чтобы прочитать этот длинный запрос.

...