logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[C]komunikacja atmega128-atmega168 SPI

arikadiusz 23 Sty 2010 22:18 1591 6
REKLAMA
  • #1 7581197
    arikadiusz
    Poziom 12  
    Mam problem z ustawieniem SPI dla tych dwoch prockow... atmega128 pracuje na 11.0592 Mhz a atmega168 na 10 Mhz. Dziala to tak ze mega128 jest w trybie slave i sluzy tylko do wyswietlania przychodzacych danych (wyrzucam na 16x2 lcd) a mega 168 w trybie master nadaje co 700ms znak "!"(0x21). Efekt mam taki ze raz na jakis czas pojawia sie ten wykrzyknik, ale zazwyczaj wyswietla jakies smieci. Kod do nadajnika mam taki:
    
    #include<avr/io.h>
    #include <util/delay.h>	
    
    #define SS_NISKI() (PORTB &= ~0x03); //stan niski na SS
    #define SS_WYSOKI() (PORTB |= 0x03); //stan wysoki na SS
    
    void SPI_MasterInit(void)
    {
    /* Set MOSI and SCK output, all others input */
    DDRB=(1<<PB3)|(1<<PB5)|(1<<PB2);
    /* Enable SPI, Master, set clock rate fck/128 */
    SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0);
    }
    
    int main(void)
    {
    SPI_MasterInit();
    	while(1)
    	{
    	_delay_ms(700);
    	 SS_NISKI();
             SPDR = 0x21;
             while(!(SPSR & (1<<SPIF)));
             SS_WYSOKI();
    	}
    }
    


    Wydaje mi sie ze to cos z predkosciami obu prockow, ale nie moge znalezc nigdzie jak to sie ma do SPI... bede bardzo wdzieczny za kazda porade.
  • REKLAMA
  • #2 7581749
    OlekM
    Poziom 17  
    Twoje makra SS_NISKI i SS_WYSOKI przestawiają piny PB0 i PB1 ale nie tykają PB2 pełniącego rolę SS.

    Mam nadzieję, że to rozwiąże sprawę :-)
  • REKLAMA
  • #3 7581834
    arikadiusz
    Poziom 12  
    nie pomoglo :(, moze wkleje oba kody dla nadajnika i odbiornika. Teraz wogole jakis smieszny efekt jest ze co bym nie podal to zawsze wyswietla "v"...

    MASTER:
    
    #include<avr/io.h>
    #include <util/delay.h>	
    
    #define SS_NISKI() (PORTB &= ~0x02); //stan niski na SS
    #define SS_WYSOKI() (PORTB |= 0x02); //stan wysoki na SS
    
    void SPI_MasterInit(void)
    {
    /* Set MOSI and SCK output, all others input */
    DDRB=(1<<PB3)|(1<<PB5)|(1<<PB2);
    /* Enable SPI, Master, set clock rate fck/128 */
    SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
    }
    
    int main(void)
    {
    DDRC=0b00010000;
    SPI_MasterInit();
    _delay_ms(700);	
    	while(1)
    	{
    	PORTC=0b00000000;
    	_delay_ms(300);
    	
    		 SS_NISKI();
             SPDR = 0x30;
             while(!(SPSR & (1<<SPIF)));
    		 PORTC=0b11111111;
    		 SS_WYSOKI();
        _delay_ms(300);
    	}
    }
    


    SLAVE

    
    #include<avr/io.h>
    #include <util/delay.h>								//opoznienia
    #include "lcd.h"
    
    
    void SPI_SlaveInit(void)
    {
    /* Set MISO output, all others input */
    DDRB=(1<<PB3);
    /* Enable SPI */
    SPCR = (1<<SPE);
    }
    char SPI_SlaveReceive(void)
    {
    /* Wait for reception complete */
    while(!(SPSR & (1<<SPIF)));
    /* Return Data Register */
    PORTF=0xF0;
    return SPDR;
    }
    
    
    int main(void)
    {
    DDRF= 0xF0;
    SPI_SlaveInit();
    lcd_init(LCD_DISP_ON_BLINK);
    lcd_putc('A');
    char buffer[4];
    unsigned int i,j;
    i=0;
    while(1)
    	{
    	if(i==3){
    	for(j=0;j<=3;j++){
    		lcd_putc(buffer[i]);
    		_delay_ms(500);}
    	i=0;
    	}
    		buffer[i]=SPI_SlaveReceive();					//czeka na przejecie znaku i zapisuje do buffer
    	i++;
    	}
    
    }
    
  • REKLAMA
  • Pomocny post
    #4 7581860
    OlekM
    Poziom 17  
    Makra dotyczące SlaveSelect, powinny wyglądać następująco:

    
    #define SS_NISKI() (PORTB &= ~0x04); //stan niski na SS
    #define SS_WYSOKI() (PORTB |= 0x04); //stan wysoki na SS 
    


    0x01 - odpowiadało by za PB0
    0x02 - za PB1
    0x04 - za PB2 - pełniący rolę SS
    0x08 - za PB3
    0x10 - za PB4
    0x20 - za PB5
    itd., itp.
  • REKLAMA
  • #5 7581875
    arikadiusz
    Poziom 12  
    rzeczywiscie glupia gafa :), ale dalej to samo... wogole zauwazylem ze jak poprostu podepne SS pod mase to tez sie te same "v" wyswietlaja. Moze tu byc jakis inny blad w programie jeszcze?, bo jak nie to szukam w polaczeniach po raz n-ty ...
  • #7 7582001
    arikadiusz
    Poziom 12  
    kufa mac smiga :D jestes wielki! dzieki!

    zamykam temat.
REKLAMA