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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.