Forum: Mikrocontroller und Digitale Elektronik Problem: SPI zwischen Carambola Master und ATMEGA32 Slave


von David S. (gutmut)



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

von David S. (gutmut)


Lesenswert?

GELÖST!
Obwohl ich SPI_MODE_0 beim Carambola angab... sieht man ja in den Oszi 
Bildern deutlich, dass es sich um SPI_MODE_3 handelt... Und wenn ich das 
auf dem AVR einstelle, gehts:-)

Gruß

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.