This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

SPI bit Banging issue

hi in my recent project i'm doing bit banging SPI in AT89S52. i am using a self modified library and its not working properly. i cant remember the original page where i found the code, though it was for the PIC's.

The data is sending correctly The problem is i am receiving same data which i am sending. take a look at the code.

#ifndef buffer
#define buffer buf
unsigned char bdata buffer;
sbit Dbit0=buffer^0;
sbit Dbit1=buffer^1;
sbit Dbit2=buffer^2;
sbit Dbit3=buffer^3;
sbit Dbit4=buffer^4;
sbit Dbit5=buffer^5;
sbit Dbit6=buffer^6;
sbit Dbit7=buffer^7;
#endif

// CONSTANTS ----------------------------------------------
#define CPOL                     0  // Set CPOL to 1 or 0
#define CPHA                     0  // Set CPHA to 1 or 0


// MACROS -------------------------------------------------
#if CPHA
   #define SCK_POST
   #if CPOL
      #define SCK_INIT 1
      #define SCK_PRE  SCK=0
      #define SCK_MID  SCK=1
   #else
      #define SCK_INIT 0
      #define SCK_PRE  SCK=1
      #define SCK_MID  SCK=0
   #endif
#else
   #define SCK_PRE
   #if CPOL
      #define SCK_INIT 1
      #define SCK_MID  SCK=0
      #define SCK_POST SCK=1
   #else
      #define SCK_INIT 0
      #define SCK_MID  SCK=1
      #define SCK_POST SCK=0
   #endif
#endif


void SPI_begin()
        {
        MOSI=1;
        MISO=1;
        SCK=SCK_INIT;
        }

unsigned char SPI_rw(unsigned char Data)
{
    buffer=Data;
    SCK_PRE; MOSI = Dbit7; SCK_MID; Dbit7 = MISO; SCK_POST; // bit 7
    SCK_PRE; MOSI = Dbit6; SCK_MID; Dbit6 = MISO; SCK_POST; // bit 6
    SCK_PRE; MOSI = Dbit5; SCK_MID; Dbit5 = MISO; SCK_POST; // bit 5
    SCK_PRE; MOSI = Dbit4; SCK_MID; Dbit4 = MISO; SCK_POST; // bit 4
    SCK_PRE; MOSI = Dbit3; SCK_MID; Dbit3 = MISO; SCK_POST; // bit 3
    SCK_PRE; MOSI = Dbit2; SCK_MID; Dbit2 = MISO; SCK_POST; // bit 2
    SCK_PRE; MOSI = Dbit1; SCK_MID; Dbit1 = MISO; SCK_POST; // bit 1
    SCK_PRE; MOSI = Dbit0; SCK_MID; Dbit0 = MISO; SCK_POST; // bit 0
    return buffer;
}

Please note: if i remove the Dbit'x' = MISO; and replae with Pbit'x' = MISO; other variable (pbit will be second bdata variable same as above) then it works. But logically using same buffer should work as i am only updating the bits.

My question is why the above code is not working?? all other methods are working correctly. why not this. what am i missing?????

and please don't tell me to use other methods. i have plenty of methods.
i just want to know whats wrong in my code?

Thank you.