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