Get the Flash Player to see this player.

time2online Joomla Extensions: Simple Video Flash Player Module
Komunikacja SPI

Opis całej transmisji jest bardzo ładnie wyjaśniony na poniższej stronie, można tam znaleźć kody źródłowe w asemblerze i C (oczywiście ja także załączę kody źródłowe):

http://www.forbot.pl/forum/topics20/programowanie-spi-szeregowy-interfejs-urzadzen-peryferyjnych-vt2275.htm

Komunikacja SPI jest podstawową komunikacją wykorzystywaną do wymiany danych między dwoma mikrokontrolerami lub urządzeniami, dlatego warto ją samemu oprogramować. Podłączenie dwóch mikrokontrolerów jest proste, wystarczy podpiąć to w następujący sposób:

PB7-->PB7;

PB6-->PB6;

PB5-->PB5;

PB4-->PB4;

Następnie ustalamy, które urządzenie ma być Master, a które Slave i piszemy program. Oczywiście można podpiąć więcej niż jedno urządzenie, dlatego bit SS służy do wyboru urządzenia poprzez ustawienie stanu niskiego. Dla przykładu: Jeśli chcielibyśmy nadawać do urządzenia Slave#2, to należałoby ustawić 1 na pinie IO1 i 0 na pinie IO2.

Odczytanie i zapisywanie danych odbywa się za pomocą rejestru SPDR. Szyna MOSI z Atmegi (Master) wysyła dane do urządzenia Slave, a w tym samym czasie szyna MISO z Atmegi przyjmuje dane z urządzenia Slave, tak jak to wskazują strzałki. Ważną sprawą jest właściwe ustawienie rejestrów DDR jako wyjścia i wejścia.

Ja się nie będę rozpisywał tylko dodam przykład przesłania jednego bajtu, dokładnie liczby 56 z master do slave i wypisanie jej na ekran wyświetlacza alfanumerycznego:

Urządzenie Master:

#include <stdio.h> 
#include <math.h>
#include <avr/io.h>
#include <util/delay.h>
#include "LCD.h"


void Inicjacja_spi()
{
DDRB = ( 1 << PB7 ) | ( 1 << PB5 ) | ( 1 << PB4 );
SPCR = ( 1 << SPE ) | ( 1 << MSTR ) | ( 1 << SPR1 ) | ( 1 << SPR0 );
}

void Wyslij_spi(int8_t bajt)
{
SPDR = bajt;
while( ! bit_is_set( SPSR, SPIF ) );
} 

int main(void)
{


DDRB = 255; //ustawiamy port B jako wyjście
PORTB = 0b11101111; // ustawienie stanu niskiego na porcie B

LCD_start();
int8_t bajt = 56;
Inicjacja_spi(); 

while (1) //pętla główna programu, to co jest w tej pętli powtarza się w nieskończoność
{
 Wyslij_spi(bajt); 
 _delay_ms(1500);
 

}
}


kliknij tu, aby pobrać program

Urządzenie Slave:

#include <stdio.h>  
#include <math.h>
#include <avr/io.h>
#include <util/delay.h>
#include "LCD.h"


void Inicjacja_spi()
{
 SPCR = ( 1 << SPE );   
}

int8_t Odbieraj_spi()
{                            //Czekamy na koniec transmisji danych
 while ( ! bit_is_set( SPSR, SPIF ) );        // ( aż do ustawienie flagi SPIF    )
 return SPDR;                    //Zwracamy to co dostaliśmy do SPDR
}   

int main(void)
{

 DDRD = 255;
 PORTD = 0;
 DDRB = 0;
 PORTB = 0;
 Inicjacja_spi(); 
 LCD_start();

while (1) //pętla główna programu, to co jest w tej pętli powtarza się w nieskończoność
{
 LCD_int8xy(Odbieraj_spi(), 0, 0);
}
}

kliknij tu, aby pobrać program