softverove SPI

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.