SPI library used to communicate with an altera development board attached to four zigbee-header pins.

Revision:
31:ea7b25e494b5
Parent:
30:331c7c7d8bc1
Child:
32:5a5d9525c6c4
diff -r 331c7c7d8bc1 -r ea7b25e494b5 mmSPI.cpp
--- a/mmSPI.cpp	Sun Aug 25 06:30:47 2013 +0000
+++ b/mmSPI.cpp	Sun Aug 25 20:12:32 2013 +0000
@@ -70,7 +70,9 @@
 //----------------------------------------------//------------------------------
                                                 // transceive a character array.
                                                 // MSB out/in first.
-    void mmSPI::transceive_vector(void)
+                                                // normal  inputs: [1,1,1,0]
+                                                // CPUstep input : [0,0,1,1]
+    void mmSPI::transceive_vector(char cPreCPU, char cPreSPI, char cScan, char cPostCPU)
     {      
       int  dClear;
       int  dIndex;       
@@ -80,46 +82,69 @@
       int  dMisoBitIndex;
       
       dIndex         = (dNumBytes * 8) - 1;
-      dMosiByteIndex = dIndex / 8;
-      dMosiBitIndex  = dIndex % 8;
+      dMosiByteIndex =  dIndex / 8;
+      dMosiBitIndex  =  dIndex % 8;
       
       for (dClear = 0; dClear < dNumBytes; dClear++) pcReceive[dClear] = 0;
       
-      
-      *pCPUclk = 1;                             // pulse the CPU clock.
-      wait(fSPIquarterP); 
-      wait(fSPIquarterP);     
-      *pCPUclk = 0;  
-      wait(fSPIquarterP); 
-      wait(fSPIquarterP); 
+      if (cPreCPU)                              // if pre-CPU clock.
+      {
+        *pCPUclk = 1;                           // pulse the CPU clock.
+        wait(fSPIquarterP); 
+        wait(fSPIquarterP);     
+        *pCPUclk = 0;  
+        wait(fSPIquarterP); 
+        wait(fSPIquarterP); 
+      }                                         // if pre-CPU clock.
       
-      *pSCLK = 1;                               // pulse the SPI clock for parallel load.              
-      wait(fSPIquarterP); 
-      wait(fSPIquarterP); 
-      *pSCLK = 0;
+      if (cPreSPI)                              // if pre-SPI pulse.
+      {
+        *pSCLK = 1;                             // pulse the SPI clock for parallel load.              
+        wait(fSPIquarterP); 
+        wait(fSPIquarterP); 
+        *pSCLK = 0;
+      }                                         // if pre-SPI pulse.
+      
+      if (cScan)                                // if cScan.
+      {
                                                 // pre-assert MOSI.
-      *pMOSI = ((pcSend[dMosiByteIndex]) >> dMosiBitIndex) & 1;
-      wait(fSPIquarterP); 
-      wait(fSPIquarterP); 
+        *pMOSI = ((pcSend[dMosiByteIndex]) >> dMosiBitIndex) & 1;
+        wait(fSPIquarterP); 
+        wait(fSPIquarterP); 
       
       
-      for (dIndex = (dNumBytes * 8) - 1; dIndex >= 0; dIndex--)
+        for (dIndex = (dNumBytes * 8) - 1; dIndex >= 0; dIndex--)
+        {
+          dMisoByteIndex = dIndex / 8;
+          dMisoBitIndex  = dIndex % 8;
+          pcReceive[dMisoByteIndex] = pcReceive[dMisoByteIndex] | (*pMISO << dMisoBitIndex);      
+          *pSCLK = 1;             
+          wait(fSPIquarterP); 
+          wait(fSPIquarterP); 
+          *pSCLK = 0;    
+          if (dIndex < 0) dIndex = 0;
+          dMosiByteIndex = (dIndex - 1) / 8;
+          dMosiBitIndex  = (dIndex - 1) % 8;
+          *pMOSI = ((pcSend[dMosiByteIndex]) >> dMosiBitIndex) & 1;
+          wait(fSPIquarterP); 
+          wait(fSPIquarterP);
+        }
+      }                                         // if cScan.
+      
+      if (cPostCPU)                             // if post-CPU pulse.
       {
-        dMisoByteIndex = dIndex / 8;
-        dMisoBitIndex  = dIndex % 8;
-        pcReceive[dMisoByteIndex] = pcReceive[dMisoByteIndex] | (*pMISO << dMisoBitIndex);      
-        *pSCLK = 1;             
+        *pCPUclk = 1;                           // pulse the CPU clock.
+        wait(fSPIquarterP); 
+        wait(fSPIquarterP);     
+        *pCPUclk = 0;  
+        wait(fSPIquarterP); 
+        wait(fSPIquarterP);       
+        
+        *pSCLK = 1;                             // clear-out the SPI parallel-load enable.        
         wait(fSPIquarterP); 
         wait(fSPIquarterP); 
-        *pSCLK = 0;    
-      
-        if (dIndex < 0) dIndex = 0;
-        dMosiByteIndex = (dIndex - 1) / 8;
-        dMosiBitIndex  = (dIndex - 1) % 8;
-        *pMOSI = ((pcSend[dMosiByteIndex]) >> dMosiBitIndex) & 1;
-        wait(fSPIquarterP); 
-        wait(fSPIquarterP);
-      }
+        *pSCLK = 0;        
+      }                                         // if post-CPU pulse.
     }
 //----------------------------------------------//------------------------------
 //  cRegister  ->  CPU_register
@@ -144,7 +169,7 @@
       pcSend[1] = ((cRegister & 0x07) << 2) | 0xA0;
       pcSend[0] = cValue & 0xFF;                // immediate value to i.w.
  
-      transceive_vector();                      // transmit command.
+      transceive_vector(1,1,1,0);               // transmit command.
  
       clear_transmit_vector();                  // clear transmit vector.
     }
@@ -166,7 +191,7 @@
       
       pcSend[7] = 0x02;                         // suppress cpu operation.
 
-      transceive_vector();                      // snap & scan-out reg contents.
+      transceive_vector(1,1,1,0);               // snap & scan-out reg contents.
       
       return (pcReceive[6 - cRegister]);        // return the particular reg value.
     }
@@ -182,12 +207,12 @@
       pcSend[7] = 0x02;                         // mbed sends command.
       pcSend[1] = 0x02;                         // write-enable high.
       pcSend[0] = 0x00;                         // remainder of instruction.
-      transceive_vector();
+      transceive_vector(1,1,1,0);
       
       pcSend[7] = 0x02;                         // mbed sends command.
       pcSend[1] = 0x00;                         // write-enable low.
       pcSend[0] = 0x00;                         // remainder of instruction.
-      transceive_vector();   
+      transceive_vector(1,1,1,0);   
                            
       clear_transmit_vector();                  // clear transmit vector. 
     }
@@ -206,17 +231,16 @@
       pcSend[7] = 0x02;                         // mbed sends command.
       pcSend[1] = 0xC8;                         // R2 <- MM[R3]
       pcSend[0] = 0x00;
-      transceive_vector();                      // send command. 
+      transceive_vector(1,1,1,0);               // send command. 
       
       pcSend[7] = 0x02;                         // mbed sends command.
       pcSend[1] = 0xC4;                         // R1 <- MM[R3]
       pcSend[0] = 0x00;
-      transceive_vector();                      // send command.      
+      transceive_vector(1,1,1,0);               // send command.      
            
       cHData = read_register(0x02);             // obtain MM high-data-byte.
       cLData = read_register(0x01);             // obtain MM low-data-byte.
-    
-                                                
+                
       udMemoryContent = (cHData << 8) + cLData; // build the memory word.
                          
       clear_transmit_vector();                  // clear transmit vector.
@@ -226,12 +250,11 @@
 //----------------------------------------------//------------------------------
     void mmSPI::step(void)                      // step the CPU.
     {      
-      *pCPUclk = 1;                             // pulse the CPU clock.
-      wait(fSPIquarterP); 
-      wait(fSPIquarterP);     
-      *pCPUclk = 0;  
-      wait(fSPIquarterP); 
-      wait(fSPIquarterP); 
+      clear_transmit_vector();                  // clear transmit vector.
+      transceive_vector(0,0,1,0);               // enable CPU mode.
+      transceive_vector(0,0,0,1);               // advance CPU, clear shadow-load.
+      pcSend[7] = 0x02;                         // ready to disable CPU mode.
+      transceive_vector(0,0,1,0);               // disable CPU mode.
     }
 //----------------------------------------------//------------------------------
     void mmSPI::clear_transmit_vector(void)     // fill transmit buffer with 0.