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);
|