Skocz do zawartości
qwertyuiasdfghj

Komunikacja Master Slave SPI

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

Udostępnij ten post


Link to post
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!

Gość
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...