Problem: SPI zwischen Carambola Master und ATMEGA32 Slave

OP #2871985
Lesenswert?

Guten Tag,

ich versuche eine SPI Übertragung zwischen einem Carambola als Master:

http://www.8devices.com/uploads/downloads/Carambola.pdf

und einem ATMEGA32 als Slave herzustellen:

http://www.atmel.com/Images/doc2503.pdf

---

Problem: Beim ISP (von meinem AVR mkII) geht der ATMEGA32 auch in die 
ISR, aber nicht vom Carambola aus.
Ist vielleicht der SPI Clock zu schnell? Warum wird die ISR nicht 
aufgerufen? Oder der Modus falsch?

Situation:
- AVR Quarz 8 Mhz
- Alles 3,3V

Gemachte Tests:
1. Ich habe die Clock des AVRs von 8Mhz auf 1Mhz verlangsamt, dann kommt 
bei DIN nur Quatsch an, der AVR scheint die Daten also korrekt zu 
verarbeiten, oder? Also sollte der SPI Clock in Ordnung sein?

2. Abgestürzt ist der AVR nicht, ich lasse eine LED blinken, und bei 
Verbindung mit mkII geht er ja auch in die ISR.

3. Was könnte es sein?

---

Im Anhang auch ein paar Bilder vom Osci, und dem Schaltplan, und dem 
Quellcode vom Carambola und ATMEGA32.

---

Carambola-Firmware:
1
static struct spi_board_info carambola_spi_info[] = {
2
  {
3
    .bus_num  = 0, .mode = SPI_MODE_0,
4
    .chip_select  = 0,
5
    .max_speed_hz  = 1000000,
6
    .modalias  = "spidev",
7
  }
8
};
9

10
static void __init carambola_init(void)
11
{
12
  rt305x_gpio_init((RT305X_GPIO_MODE_GPIO << RT305X_GPIO_MODE_UART0_SHIFT) |
13
       RT305X_GPIO_MODE_I2C | RT305X_GPIO_MODE_SPI);
14
  carambola_register_gpiodev();
15
  platform_add_devices(carambola_devices, ARRAY_SIZE(carambola_devices));
16

17
  /* we want fixed partitions sizes for now */
18
  __rt305x_register_flash(0,
19
        carambola_partitions,
20
        ARRAY_SIZE(carambola_partitions));
21

22
  rt305x_esw_data.vlan_config = RT305X_ESW_VLAN_CONFIG_WLLLL;
23
  rt305x_register_ethernet();
24
  rt305x_register_wifi();
25
  rt305x_register_wdt();
26
  rt305x_register_spi(carambola_spi_info, ARRAY_SIZE(carambola_spi_info));
27
  rt305x_register_usb();
28
}
---

Carambola Lua Zugriff:
1
local SPI_TX_RX_DELAY_NS  = 2e9
2

3
local nixio = require 'nixio'
4
local SPI_DEV      = '/dev/spidev0.0'
5

6
local O_RDWR_NONBLOCK    = nixio.open_flags('rdwr', 'nonblock')
7

8
spidev = nixio.open(SPI_DEV, O_RDWR_NONBLOCK)
9
spidev:lock('lock') -- blocks until it can place a write lock on the spidev device
10

11
function writeread(ch)
12
  spidev:write(ch)
13
  
14
  for i=0, 1000 do        -- Control the transmit intermit here
15
    nixio.nanosleep(0, SPI_TX_RX_DELAY_NS)
16
  end
17
  
18
  buffer = spidev:read(1)
19
  print(string.byte(buffer,1))
20
end
21

22
writeread(string.char(3))
---

ATMEGA32:
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#include <avr/interrupt.h>
4

5
#include "my.h"
6
#include "spi.h"
7

8
ISR(SPI_STC_vect)
9
{
10
  //Dies wird nur bei Verbdinung mit mkII ausgeführt, aber nicht vom Carambola aus
11
  receive3(my_set_port_toggle, my_c, PC0);
12
}
13

14
int main()
15
{  
16
  receive3(my_set_out_ddr, my_c, DDC0);
17

18
  my_init();
19

20
  setup_spi(SPI_MODE_0, SPI_MSB, SPI_INTERRUPT, SPI_SLAVE);
21

22
  sei();
23

24
  while (1) {
25
    // Dieses Blinken functioniert!
26
    receive3(my_set_port_toggle, my_c, PC0);
27

28
    receive2(my_delay_s_byte, 2);
29
  }
30
}
 (weiteres in der Quellcodes.zip)
---

DANKE!

Gruß
David

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren