Discussion:
SPI slave ujra
(too old to reply)
Nemeth Szabolcs
2021-03-06 11:22:48 UTC
Permalink
Sziasztok!

Ugy tunhet mintha csak SPI szivasbol allna az eletem :)

Most egy olyan problemam van, hogy a master kikuldi az olvasas
parancsot, majd hagyja az SS-t alacsonyon, es addig olvas amig nem kap
egy magas bitet, de max 5 byte. Majd egybol elveszi az SS-t.

A tobbi parancs eseten minden parancs utan magasra megy az SS.

Ez tok jol mukodik a meglevo slave eseten, de ha az en procim szimulalja
a slave-et csak az elso 2 byte lesz az amit irok az SPDR-be. A maradek 3
byte a vett SPDR erteke lesz. Ez esetben FF FF FF, mert a master nem
kuld semmit.

A kovetkezo olvasas utan megint jo 2 byte 3 rossz.


Mit rontok el? Mar semmi nincs a megszakitas rutinban, csak kiolvassa az
SPDR-t, meg beirja 0x55-ot valasz gyanant, hogy lassam mit kuld. A MISO
nincs rakotve a masterre, az 0 kent veszi.

Proci ATmega2560.


Szabolcs
--
This email has been checked for viruses by Avast antivirus software.
https://www.avast.com/antivirus
Nemeth Szabolcs
2021-03-09 20:39:38 UTC
Permalink
Megoldodott a problema. A kuldendo adatot kell elobb beirni, majd
kiolvasni ami jott.

Fokozza az elvezetet, hogy elobb kell beirni az adatot mielott tudnam,
hogy a master mit kuldott.

De szerencsere az elso byte meg mukodik olvasas > iras sorrenben utana
meg csak kuldeni kell.


Szabolcs
Mar teljesen lecsupaszitottam a progit. Nincs benne semmi, csak az SPI
megszkitas.
Az SPI orajel nem sok, csak 200kHz. Az "1" 1us a "0" 4us.
Csinaltam egy fenykepet a jelekrol. Csak az SS es az MISO latszik.  A
MISO egyelore nincs bekotve sehova.
#include <avr/io.h>
#include <avr/interrupt.h>
volatile char teszt_dat;
ISR(SPI_STC_vect) //SPI interrupt
{
    teszt_dat=SPDR;
    SPDR=0x55;
}
void initall(void)
{
     PORTB=0xFF;
     DDRB|=1<<DDB3;
     SPCR |=  (1<<SPE) | (1<<DORD) | (1<<CPOL) | (1<<CPHA); //Enable
SPI module
     SPCR|= (1<<SPIE);
     sei();
}
int main(void)
{
    /* Replace with your application code */
    initall();
    while (1)
    {
    }
}
Sajna nem dupla bufferelt az spi, így ha van mellette másik
megszakításod/túl nagy az órajel/byte sebesség, akkor lehet belerondít.
Lassits a clk sebessegen, ha megoldódik a gond, akkor sztem ez lesz.
A.
On 2021. Mar 6., at 12:22, Nemeth Szabolcs
Sziasztok!
Ugy tunhet mintha csak SPI szivasbol allna az eletem :)
Most egy olyan problemam van, hogy a master kikuldi az olvasas
parancsot, majd hagyja az SS-t alacsonyon, es addig olvas amig nem
kap egy magas bitet, de max 5 byte. Majd egybol elveszi az SS-t.
A tobbi parancs eseten minden parancs utan magasra megy az SS.
Ez tok jol mukodik a meglevo slave eseten, de ha az en procim
szimulalja a slave-et csak az elso 2 byte lesz az amit irok az
SPDR-be. A maradek 3 byte a vett SPDR erteke lesz. Ez esetben FF FF
FF, mert a master nem kuld semmit.
A kovetkezo olvasas utan megint jo 2 byte 3 rossz.
Mit rontok el? Mar semmi nincs a megszakitas rutinban, csak
kiolvassa az SPDR-t, meg beirja 0x55-ot valasz gyanant, hogy lassam
mit kuld. A MISO nincs rakotve a masterre, az 0 kent veszi.
Proci ATmega2560.
Szabolcs
--
This email has been checked for viruses by Avast antivirus software.
https://www.avast.com/antivirus
-----------------------------------------
        elektro[-flame|-etc]
-----------------------------------------
           elektro[-flame|-etc]
Loading...