Forum: Mikrocontroller und Digitale Elektronik SPI kommunikation mit Inertial Sensor


von Aditya K. (stadkama)


Lesenswert?

Hallo,
Ich baue eine SPI Schnittstelle zwischen atsam4e8c(master) und
bmi160(slave). Es gibt 5 bmi160 sensoren.


Meine Fragen:
1. Wenn ich chip id  aus dem Sensor lese, dann kann ich nur ins
Oszillloskop als 0xd1 sehen. Ich sehe 0xff in SPI_RDR. Warum sehe ich
dieses Verhalten?
2. Es gibt kein Decoder zwischen atsam und bmi160. Datenblatt von atsam
sagt,wir können nur mit 4 slaves ohne decoder sprechen. Wie kann ich mit
5th Sensor sprechen?
3. Wenn ich accelerometer und gyroscope values lesen möchte, kann ich
nur von DATA registers von bmi160 benutzen ? oder muss ich "any motion
interrupt" oder jeder interrupt benutzen?

Bitte verzeihen Sie auf mein Deutsch.

Danke für ihre Hilfe.

Bitte finden Sie  die Quelle.

#include "sam.h"

#define NPCS0  PIO_PA11A_NPCS0
#define NPCS1  PIO_PA9B_NPCS1
#define NPCS2  PIO_PA10B_NPCS2
#define NPCS3  PIO_PA22B_NPCS3
#define SPCK   PIO_PA14A_SPCK
#define MISO   PIO_PA12A_MISO
#define MOSI   PIO_PA13A_MOSI

void spi_initialisation(void)
{
  Pio *p_pio;
  uint32_t pin;
  uint32_t ul_sr;
  uint32_t  i;

  //assign port A to the peripheral A and B
  p_pio = (Pio *)((uint32_t)PIOA);

  pin = SPCK | MISO | MOSI | NPCS0;
  ul_sr = p_pio->PIO_ABCDSR[0];
  p_pio->PIO_ABCDSR[0] = ~pin & ul_sr;
  p_pio->PIO_ABCDSR[0] |= NPCS3|NPCS1|NPCS2;

  ul_sr = p_pio->PIO_ABCDSR[1];
  p_pio->PIO_ABCDSR[1] = ~(pin | NPCS3|NPCS1|NPCS2) & ul_sr;
  p_pio->PIO_PUER = pin;   // Enable Pull up
  p_pio->PIO_OER = MOSI | SPCK | NPCS0 | NPCS3|NPCS1|NPCS2;
  p_pio->PIO_ODR = MISO;
  p_pio->PIO_PDR |= pin | NPCS3|NPCS1|NPCS2;

   SPI->SPI_CR = SPI_CR_SWRST | SPI_CR_SPIDIS;

   //variable peripheral mode.
   SPI->SPI_MR =   0x02<<24 | 0x0d<<16 | 0x00<<7 | 0x00<<5 |
SPI_MR_MODFDIS | 0x00<<2 | 0x01<<1 | SPI_MR_MSTR;


   // spi clock 1mhz.
   //polarity and phase 1.
   //16 bits per transfer.
   for(i=0;i<4;i++)
SPI->SPI_CSR[i] = 0x02<<24 | 0x0A<<16 | 0x78<<8 | 0x08<<4 | 0x01<<3 |
0x00<<2 | 0x01<<1 | 0x01<<0;

   // Enable SPI clock
   if ((PMC->PMC_PCSR0 & (0x01u << ID_SPI)) != (0x01u << ID_SPI))
    PMC->PMC_PCER0 = 0x01u << ID_SPI;
    // SPI enable
   SPI->SPI_CR = 0x01 << 0;
}

void spi_transfer(uint16_t byte)
{
  uint32_t value;
  static uint32_t reg_value;
  value = SPI_TDR_TD(byte) | SPI_TDR_PCS(1);
  SPI->SPI_TDR = value;
  while (!(SPI->SPI_SR & SPI_SR_TXEMPTY)) {}
  reg_value = SPI->SPI_RDR;

  byte=(uint16_t) (reg_value & SPI_RDR_RD_Msk);
  SPI->SPI_CR |= SPI_CR_LASTXFER;
}

int main(void)
{
  SystemInit();
  spi_initialisation();
  uint16_t byte;
  byte=0x80ff;
  while(1)
  {
    spi_transfer(byte);
  }
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.