Skocz do zawartości

Komunikacja Master Slave SPI


qwertyuiasdfghj

Pomocna odpowiedź

Witam. Próbuje zbudować układ, który by potrafił komunikować się po magistrali SPI. Składaja się na niego 2 mikrokontrolery Atmega8A, oba taktowane zewnętrznym kwarcem 16 MHz. Problem polega na tym, że nie mogę zestawić poprawnej komunikacji. Sprawdzałem z użyciem Arduino (jako Master) czy dane są odbierane prawidłowo i wyszło że jest ok więc winnym problemów wydaje się Master ale nie mam już pomysłów co może być nie tak. Odebrane dane mają się wyświetlać w terminalu (UART działa dobrze). Poniżej kod i schemat:

master.c

#include "spi.h"

int main()
{
	SPI_master_init();

	while(1)
    {
		SPI_send(100);
		_delay_ms(100);
	}
	return 0;
}

 

slave.c

#include "uart.h"
#include "spi.h"

#define DATA_LED PIND2

int main()
{
	UART_init();
	SPI_slave_init();
	
	DDRD = (1<<DATA_LED);

	while(1)
    {
		uint8_t recv = SPI_recieve(0);
		UART_putc_int(recv, DEC);
		UART_puts("\n\r");
		
		if(recv == 100)
			PORTD |= (1<<DATA_LED);
		else
			PORTD &= ~(1<<DATA_LED);
		_delay_ms(100);
	}
	return 0;
}

 

spi.c

#include "spi.h"

void SPI_slave_init(void)
{
	SPCR = (1<<SPE);
	DD_SPI |= (1<<DD_MISO); //MISO output, others input
}

void SPI_master_init(void)
{
	SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0);
	DD_SPI |= (1<<DD_MOSI) | (1<<DD_SCK) | (1<<DD_SS); //set mosi, sck and ss as output
	PORT_SPI |= (1<<DD_SS);
}

void SPI_send(uint8_t data)
{
	DD_SPI &= ~(1<<DD_SS); //ss set to low
	
	SPDR = data;
	while(!(SPSR & (1<<SPIF)));
	
	DD_SPI |= (1<<DD_SS); //ss set to high
}

uint8_t SPI_recieve()
{
	while(!(SPSR & (1<<SPIF)));
	return SPDR;
}

 

spi_masterslave.png

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.