Forum: Mikrocontroller und Digitale Elektronik Raspberry Pi 2 + SPI + ADS8332 sendet keine Daten


von auron2008 (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

hab wieder ein Problem mit dem Raspberry Pi 2. Und zwar möchte ich einen 
AD Wandler (ADS8332 , TI, http://www.ti.com/product/ads8332) mittels SPI 
ansprechen.

Leider sendet mein Raspberry zwar Daten die scheinbar auch beim ADC 
ankommen, nur sendet dieser nix zurück bzw die MISO Leitung geht 
lediglich auf high.

Habe mir das ganze mal auf dem Oszi angesehen :
Bild 1 : MOSI + SCLK
Bild 2 : MOSI + CS
BILD 3 : MOSI + MISO

Habe das ganz mal mit einem Atmel versucht und da funktioniert das 
wunderbar.
Bild 4 : MOSI + MISO

Bei beiden Programmen (AVR, Raspberry) habe ich 0xd000 gesendet.

Der AVR scheint die MOSI Leitung standardmäßig auf High zu ziehen was 
der Raspberry Pi nicht macht. Desweiteren ist mir aufgefallen, dass der 
AVR zwischen den zwei Bytes nochmal kurz auf High geht.

Habe mich bei dem ganzen nach spidev_test.c 
(https://www.kernel.org/doc/Documentation/spi/spidev_test.c) gerichtet.
1
int spi_open_device()
2
{
3
  int fd, ret;
4
5
  fd = open("/dev/spidev0.0", O_RDWR);
6
  mode = SPI_MODE_2;
7
8
  if(fd<0) {
9
    output_error("SPI : Kein Zugriff \n");
10
    return -1;
11
  }
12
13
  ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);
14
  if(ret < 0) {
15
    output_error("SPI : can't set mode SPI_IOC_WR_MODE \n");
16
    return -1;
17
  }
18
19
  ret = ioctl(fd, SPI_IOC_RD_MODE, &mode);
20
  if(ret < 0) {
21
      output_error("SPI : can't set mode SPI_IOC_RD_MODE \n");
22
      return -1;
23
    }
24
25
  ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &mode);
26
  if(ret < 0) {
27
      output_error("SPI : can't set mode SPI_IOC_WR_BITS_PER_WORD\n");
28
      return -1;
29
    }
30
  ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &mode);
31
  if(ret < 0) {
32
      output_error("SPI : can't set mode SPI_IOC_RD_BITS_PER_WORD \n");
33
      return -1;
34
    }
35
  ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
36
  if(ret < 0) {
37
      output_error("SPI : can't set speed SPI_IOC_WR_MAX_SPEED_HZ\n");
38
      return -1;
39
    }
40
  ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
41
  if(ret < 0) {
42
      output_error("SPI : can't set speed SPI_IOC_RD_MAX_SPEED_HZ\n");
43
      return -1;
44
    }
45
  printf("SPI Mode : %d   Speed : %d \n", mode, speed);
46
47
  return fd;
48
}[c/]
49
50
und das senden mittels 
51
52
[c]
53
uint8_t tx[2], rx[2];
54
  tx[0] = 0xd0;
55
  tx[1] = 0x00;
56
  struct spi_ioc_transfer tr =
57
  {
58
  .tx_buf = (unsigned long)tx,
59
  .rx_buf = (unsigned long)rx,
60
  .len = 2,
61
  .delay_usecs = 100,
62
  .speed_hz = speed,
63
  .bits_per_word = 8,
64
};
65
66
ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);

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.