Skocz do zawartości

qwertyuiasdfghj

Użytkownicy
  • Zawartość

    1
  • Rejestracja

  • Ostatnio

Reputacja

0 Neutralna

O qwertyuiasdfghj

  • Ranga
    1/10
  1. 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; }
×
×
  • Utwórz nowe...