Forum: Mikrocontroller und Digitale Elektronik XMEGA SPI Registerfehler


von kalf (Gast)


Lesenswert?

Hallo ich habe ein Problem mit meinem SPI Bus, denn er setzt egal ob 
beim simulieren, oder beim debuggen mittels mkII immer die InputRegister 
und nicht die out.

Hier der code für den ATXMEGA128A3:
1
int spi_init_master(unsigned char port)
2
{
3
4
    PORTC_DIR |= (1<<DD4); ///SS pin as in/out must be hold high
5
    PORTC_OUT |= (1<<DD4); //Driven high
6
7
    PORTC_DIR |= (1<<DD5); //MOSI pin as output
8
    PORTC_DIR &= ~(1<<DD6); //MISO pin as input
9
    PORTC_DIR |= (1<<DD7); //SCK pins as output
10
    
11
12
    SPIC.CTRL = 0x00;
13
14
    SPIC.CTRL|=(1<<SPI_CLK2X_bp);              //Doubles Frequency in Master Mode
15
    SPIC.CTRL|=(1<<SPI_DORD_bp);              //Data Order 1=LSB first
16
    SPIC.CTRL|=(1<<SPI_MASTER_bp);              //1=Master Mode
17
    SPIC.CTRL&=~((1<<SPI_MODE0_bp)|(1<<SPI_MODE1_bp));      //SPI Mode Rising Sample, Falling Setup
18
    SPIC.CTRL|=(1<<SPI_PRESCALER0_bp)|(1<<SPI_PRESCALER1_bp);  //11=clkper/64
19
    
20
    SPIC.INTCTRL|=(1<<SPI_INTLVL1_bp);    //interrupt level is middle
21
    SPIC.INTCTRL&=~(1<<SPI_INTLVL0_bp);
22
      SPIC.CTRL|=(1<<SPI_ENABLE_bp);  
23
24
int spi_master_send(unsigned char SPI_data, unsigned char port)
25
26
{
27
28
    if(!spi_master_busy(0,'C',1))
29
      {
30
      SPIC.DATA|=SPI_data;  // sende Daten
31
      spi_master_busy(1,'C',0);//SPI busy
32
      }
33
 }
34
35
36
bool spi_master_busy(bool write, unsigned char port, bool read) //wenn read 1 wird gelesen bei 0 wird write geschrieben
37
{
38
  static bool SPIC_busy=0;
39
      if(!read)
40
      {
41
      SPIC_busy=write;
42
      }
43
    else return SPIC_busy;
44
}

Vielen Dank im voraus

von Arc N. (arc)


Lesenswert?

> SPIC.DATA|=SPI_data;  // sende Daten

Was soll das werden?

von Fabian K. (kalf)


Lesenswert?

ok danke einmal für die Antwort,
eigentlich gehört
> SPIC.DATA=SPI_data;  // sende Daten
was er aber jetzt nicht macht..
Auch wenn ich
> SPIC.DATA=0x41;  // sende Daten
schreibe ändert sich das Register nicht

von Jörg G. (joergderxte)


Lesenswert?

Ist "SPIC.DATA" vielleicht zwei Register (Ist doch bei serieller 
Peripherie AFAIK üblich)?
D.h. du kannst die Daten, die du da rein schreibst, nicht auslesen, 
weil beim Lesen auf ein anderes Register/FIFO (üblicherweise das mit den 
empfangenen Daten) zugegriffen wird.

hth., Jörg

von Fabian K. (kalf)


Lesenswert?

Heißt das ich sehe nicht einmal bei der Simulation das writing DATA 
Register (es gibt nur eine Variable aber einen shift Register Receive 
buffer)

Nach dem Testen scheint das wirklich der fall zu sein da er die Register 
richtig am Input anzeigt (sehe wie er sie rausschiebt).
Wird dann wohl auch der gleiche fehler beim Port sein, nämlich das er 
die out register nicht anzeigt weil er sie nicht lesen kann. Kann das 
sein?

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.