Forum: Mikrocontroller und Digitale Elektronik FXOS8700CQ via SPI am Raspberry Pi antwortet nicht


von Tomas Schmidt (Gast)


Lesenswert?

Hallo,

Ich habe 2 SPI Slaves am Raspberry Pi 3 Model B. Die CS-Pins haben 
jeweils einen Pullup Widerstand. Das eine Slave funktioniert, das andere 
ist der FXOS8700CQ Beschleunigungs- und Magnetfeldsensor und antwortet 
nicht.

Im Datenblatt https://www.nxp.com/docs/en/data-sheet/FXOS8700CQ.pdf 
Kapitel 10.2.3 steht, dass der SA0/MISO Pin beim Einschalten hochohmig 
sein muss, um den SPI-Modus zu aktivieren. Nach meinem Wissen und 
Verständnis sollten die GPIO's inklusive der SPI Pins beim Einschalten 
hochohmig sein.


Ich könnte mir vorstellen, dass der Fehler darin liegt, dass ich das 
Kapitel 10.2.2 SPI read/write operations falsch verstanden habe: Das 
zweite Byte in Fig. 8 besteht aus ADDR[7] und 7 don't care bits. Da aber 
die größte Adresse 0x79 ist, würde das zweite Byte immer eine 0 mit 7 
don't care bits sein... klingt irgendwie falsch.

Als Test soll die Device ID ausgegeben werden.
1
#include <stdio.h>
2
#include <fcntl.h>
3
#include <sys/ioctl.h>
4
#include <linux/spi/spidev.h>
5
#include <inttypes.h>
6
#include <stdlib.h>
7
#include <stdint.h>
8
#include <errno.h>
9
#include <string.h>
10
#include <asm/ioctl.h>
11
#include <wiringPiSPI.h>
12
#include <linux/spi/spidev.h>
13
#include "wiringPi.h"
14
15
16
int main()
17
{
18
  unsigned char buffer [32];
19
  int i =0;
20
  wiringPiSetup();
21
  if(wiringPiSPISetup(0, 500000)==-1)  // fd=0: FXOS
22
  {
23
    printf("Could not initialise SPI\n");
24
    return 0;
25
  }
26
  
27
  // Read device id (0x0D)
28
  buffer[0]=0x0d;
29
  buffer[1]=0;
30
  buffer[2]=0;
31
  
32
  wiringPiSPIDataRW(0, buffer, 3);
33
  
34
  printf("Device ID: %x\n", ((char*)buffer)[2]);
35
  for(i=0;i<3;i++)
36
  {
37
    printf("%x ", ((char*)buffer)[i]);
38
  }
39
  
40
  return 0;
41
}

Es kommen aber leider nur Nullen zurück. Erkennt jemand einen Fehler?

Vielen Dank im Voraus!

von WiringPiSPI (Gast)


Lesenswert?

Hi,

Tomas Schmidt schrieb:
> Ich habe 2 SPI Slaves am Raspberry Pi 3 Model B. Die CS-Pins haben
> jeweils einen Pullup Widerstand. Das eine Slave funktioniert, das andere
> ist der FXOS8700CQ Beschleunigungs- und Magnetfeldsensor und antwortet
> nicht.

Das würde ich nicht unbedingt machen, wenn im Datenblatt des FXOS8700CQ 
steht: "Do not connect more than one master and one slave device on the 
SPI bus."

Das Programm ist ja recht überschaubar. Was sollte darin falsch sein? 
Möglicherweise funktioniert ja die SPI auto detection des FXOS8700CQ 
nicht. Also versuchsweise mal den SA0/MISO Pin wärend des "power up" 
offen lassen.

Denn: "Please note that when SPI interface mode is desired, care must be 
taken to ensure that no other slave  device drives the common SA0/MISO 
pin during the 1 ms period after a hard or soft reset or powerup event".

von Tomas Schmidt (Gast)


Lesenswert?

Hallo WiringPiSPI,

auf die Idee wär ich nie gekommen, dass ein SPI-Slave kein anderes Slave 
akzeptiert.

Leider kann ich den Pin nicht ohne weiteres offen hängen lassen, das das 
ganze auf einer recht feinen SMD Platine gelötet ist. Auch der Reset Pin 
ist fest auf Masse.

Da das andere Slave (FXAS21002) funktioniert, vermute ich mal, dass 
dieses bereits den MISO Pin des FXOS8700Q durchgebrannt hat.

Wie auch immer, so funktioniert das ganze nicht. Dann muss ich wohl 
nochmal die Platine anpassen.

Vielen Dank für deine Hilfe!

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.