softverove SPI

zdravim, chcel by som sa spytat ci niekto neviete ci je mozne vytvorit z programovatelnych pinov procesora 8051 SPI rozhranie…a ak ano tak ci by som niekde vedel zohnat zdrojaky :slight_smile:

Ano dalo.
Je to tak jednoduche :slight_smile:
SET daj na nulu

8x zopakuj slucku v ktorej nastavis MOSI podla hodnoty 7. bitu vysielaneho bajtu, nastav CLK na log.1, po chvili nastav clk na log.0, podla stavu na MISO nastav LSB vysielaneho bajtu.
Zarotuj vysielany bajt o jednu do lava.
Po osmi opakovaniach si odvysielal jeden bajt a zaroven si jeden prijal. Vysledok mas v odvysielanom bajte.

vsjo jasno? :slight_smile:

no ani velmi nie :laughing: ale aj tak dikes :wink:

budem to pisat v takom CckovomBasicovom mnemotechnickom zapise,
dufam, ze to bude zrozumitelne

OUT_CLK; // SPI clk
OUT_MOSI; // Master Out Slave In
IN_MISO; // Master In Slave Out

// do prac bajtu daj hodnotu, ktoru chces vyslat von
data_in_out = DATA_NA_VYSTUP; 

OUT_SET;
SET = LOG_0;  // nastav bit SET na log 0
for(i = 0; i < 8; i++) {

    // pre vyslanie ako prveho bitu MSB. Ak by to bolo LSB, tak potom by bolo
    // (data_in_out & 0x01) a rotovanie do prava

     if (data_in_out & 0x80) MOSI = LOG_1;
     else MOSI = LOG_0;
     CLK = LOG_1; // nastav bit CLK na log 1
     // sem daj pripadne male oneskorenie, ak by CLK trval prilis kratko
     CLK = LOG_0; // nastav bit CLK na log 0
     data_in_out = (1<<data_in_out); // rotuj o jednu do lava, na LSB vloz log.0
      if (MISO == LOG_H) data_in_out = data_in_out | 0x01;
}
CLK = LOG_1; // nastav bit CLK na log 1
SET = LOG_1; // nastav bit SET na log 1
// v data_in_out mas prijaty bajt

Tymto kodom vysles a zaroven nacitas jeden bajt z externeho prostredia.
Este si skontroluj na aku hranu ten tvoj esterny hw reaguje, ale myslim, ze toto by malo byt odolne voci vsetkym kombinaciam hran.
SET samozrejme astav do log.1 az ked odvysielas/prijmes vsetky pozadovane data.