- Labornetzteil AliExpress         
Ergebnis 1 bis 2 von 2

Thema: ATXMega64A3 SPI - keine Signale auf Pins

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578

    ATXMega64A3 SPI - keine Signale auf Pins

    Anzeige

    E-Bike
    Hi,

    ich versuche gerade, die SPI Schnittstelle eines XMega64A3 zum laufen zu bekommen. Wenn ich Daten senden will und die Pins mit dem Oszi messe, tut sich allerdings nichts. Lediglich auf dem SCK Pin ist kurzzeitig etwas zu sehen. Ich hab mir schon die APP Note und den dazugehörigen Source Code von ATMEL angesehen, kann jedoch keine gravierenden Unterschiede erkennen. Am anderen Ende der Leitung hängt übrigens ein funktionsfähiger MPU6000 (3-Achs Gyro & Acc), getestet über I2C. Die Pins vom XMega funktionieren auch, hab sie toggln lassen zum überprüfen.
    Hier mal mein Code:
    Code:
    /*
     * MPU6000_SPI.c
     *
     * Created: 08.01.2014 19:35:10
     *  Author: Chris
     */ 
    
    
    #define F_CPU 32000000UL
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>
    #include <string.h>
    #include <util/twi.h>
    #include <math.h>
    #include <avr/eeprom.h>
    
    
    #define SpiCWaitReceive while(!(SPIC.STATUS & SPI_IF_bm))
    
    
    void InitClock(void);
    void InitUart(USART_t *usart);
    void WaitMs(uint16_t ms);
    void SendUart(char data[], USART_t *usart, uint8_t crlf);
    
    void InitSpi(SPI_t *spi);
    void SpiWriteByte(uint8_t sendbyte , SPI_t *spi);
    uint8_t SpiReadByte(SPI_t *spi);
    uint8_t SpiTransceiveByte(SPI_t *spi , uint8_t TXSend);
    
    void InitMpu(SPI_t *spi);
    void ReadWhoIAm(SPI_t *spi);
    
    
    uint8_t WhoIAm = 0;
    
    char debug1[10];
    char debug2[10];
    
    
    int main(void)
    {
        
        InitClock();
        PORTC.DIRSET = 0x08;
        InitUart(&USARTC0);
        InitSpi(&SPIC);
        
        //InitMpu(&SPIC);
        
        while(1)
        {
            SpiWriteByte(117,&SPIC);
            //ReadWhoIAm(&SPIC);
            itoa((int16_t)WhoIAm,debug1,10);
            itoa((int16_t)SPIC.CTRL,debug2,2);
            SendUart(debug1,&USARTC0,0);
            SendUart(" : ",&USARTC0,0);
            SendUart(debug2,&USARTC0,1);
            WaitMs(250);
        }
    }
    
    uint8_t SpiTransceiveByte(SPI_t *spi , uint8_t TXSend)
    {
        spi->DATA = TXSend;
        SpiCWaitReceive;
        return SpiReadByte(spi);
    }
    
    void InitMpu(SPI_t *spi)
    {
        spi->DATA = 25;
        spi->DATA = 0;
        
        spi->DATA = 26; //Configuration Register
        spi->DATA = 0x03;
    }
    
    void ReadWhoIAm(SPI_t *spi)
    {
        WhoIAm = SpiTransceiveByte(&SPIC,117);
    }
    
    void SpiWriteByte(uint8_t sendbyte , SPI_t *spi)
    {
        spi->DATA = sendbyte;
    }
    
    uint8_t SpiReadByte(SPI_t *spi)
    {
        return spi->DATA;
    }
    
    void InitSpi(SPI_t *spi)
    {
        PORTC.DIRSET = 0xD0;
        //
        spi->CTRL = 0b01010010; //0b0101_00_10;
        spi->INTCTRL = 0x00;
        spi->STATUS = 0x00;
        //
        spi->CTRL |= 0x10; //set MasterBit
        //
        PORTC.DIRSET = 0xD0;    
    }
    
    void InitClock(void)
    {
        OSC.CTRL |= OSC_RC32MEN_bm;
        while(!(OSC.STATUS & OSC_RC32MRDY_bm));
        CCP = CCP_IOREG_gc;
        CLK.CTRL = CLK_SCLKSEL_RC32M_gc;
    }
    
    void InitUart(USART_t *usart)
    {
        usart->BAUDCTRLB = 0;
        usart->BAUDCTRLA = 0x11;
        usart->CTRLB = USART_TXEN_bm | USART_RXEN_bm;
        usart->CTRLC = 0x03;
        usart->CTRLA = 0;
    }
    
    void WaitMs(uint16_t ms)
    {
        for(ms;ms>=1;ms--)
        {
            _delay_ms(1);
        }
    }
    
    void SendUart(char data[], USART_t *usart, uint8_t crlf)
    {
        char Counter = 0x00;
        char lenght = 0x00;
    
        lenght = strlen(data);
    
        while(Counter < lenght)
        {
            while (!(usart->STATUS & USART_DREIF_bm));
            usart->DATA = data[Counter];
            Counter++;
        }
    
        Counter = 0x00;
        if(crlf==1)
        {
            while (!( usart->STATUS & USART_DREIF_bm));
            usart->DATA = 0x0D;
            while (!( usart->STATUS & USART_DREIF_bm));
            usart->DATA = 0x0A;
        }
    }
    Vielleicht hat jemand von euch ja schonmal damit gearbeitet und kann mir helfen?!

    Vielen Dank & Gruß
    Chris

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    Hi,

    also ich hab jetzt den Fehler gefunden, ich hatte ausversehen MOSI auf Input und MISO auf Output gestellt...
    Allerdings bräuchte ich wohl trotzdem noch ein paar Starthilfen, hab noch nie was mit SPI gemacht. Wie lese ich den jetzt ein Register aus? Ich dachts mir so:
    Erst SS low machen, dann die Register Nummer senden (117), dann ein Dummy-Byte (0x00) und nun steht der Rückgabewert im DATA Register?
    So funktionierts anscheinend nicht, muss ich wohl noch einwenig suchen.

    Gruß
    Chris
    Geändert von Che Guevara (09.01.2014 um 16:42 Uhr)

Ähnliche Themen

  1. DMA und ADC auf ATXMega64A3
    Von Che Guevara im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 21.05.2012, 18:03
  2. AVR kaptt? Keine ausgabe an 3 pins...
    Von Maverick89 im Forum AVR Hardwarethemen
    Antworten: 8
    Letzter Beitrag: 25.05.2007, 22:11
  3. USBasp und gleichzeitig SPI-Pins belegen?
    Von Stefan090 im Forum AVR Hardwarethemen
    Antworten: 0
    Letzter Beitrag: 15.04.2007, 09:55
  4. Zwei getrennt regelbare PWM-Signale an zwei Pins von PortC
    Von Hender im Forum C - Programmierung (GCC u.a.)
    Antworten: 12
    Letzter Beitrag: 10.02.2006, 11:44
  5. pins auf dem paralell port auf high schalten. Problem!
    Von guigis im Forum PC-, Pocket PC, Tablet PC, Smartphone oder Notebook
    Antworten: 0
    Letzter Beitrag: 28.01.2005, 21:42

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen