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

Revision:
15:d6cc57c4e23d
Parent:
14:35717622a4fb
Child:
16:0e422fd263c6
diff -r 35717622a4fb -r d6cc57c4e23d mmSPI.cpp
--- a/mmSPI.cpp	Sun Aug 18 04:50:54 2013 +0000
+++ b/mmSPI.cpp	Mon Aug 19 04:41:29 2013 +0000
@@ -8,9 +8,14 @@
 /*----------------------------------------------//------------------------------
 ------------------------------------------------//----------------------------*/
 //==============================================//==============================
+//  consider resetting the fpga around here, because
+//  the micro may be wiggling these signals before here.
     mmSPI::mmSPI()                              // constructor.
     {
       allocations();                            // object allocations.
+      
+      *pSCLK   = 0;                             // initialize.
+      *pCPUclk = 0;                             // initialize.
     }
 //----------------------------------------------//------------------------------    
     mmSPI::~mmSPI()                             // destructor.
@@ -57,10 +62,11 @@
         *pSCLK = 0;                             // SPI clock negedge.
         wait(fSPIquarterP);                     // until middle of clock low.
         *pMOSI = (*cSend >> dLoop01) & 1;       // assert MOSI.
-        wait(fSPIquarterP);                     // MOSI setup time
+                                                // capture MISO.
+        *cReceive = *cReceive | (*pMISO << dLoop01);        
+        wait(fSPIquarterP);                     // finish-out cycle.
         *pSCLK = 1;                             // SPI clock posedge.
-        wait(fSPIquarterP);                     // MISO setup time.
-        *cReceive = *cReceive | (*pMISO << dLoop01);
+        wait(fSPIquarterP);                     // finish-out cycle.
         wait(fSPIquarterP);                     // finish-out cycle.
       }
     }
@@ -87,7 +93,7 @@
       for (dLoop02 = (cNumBytes - 1); dLoop02 >= 0; dLoop02--)
       transceive_byte(&(cReceive[dLoop02]), &(cSend[dLoop02]));
       
-      *pSCLK = 0;                               // SPI clock rests low.
+   
       
       *pCPUclk = 1;                             // pulse the CPU clock.
       wait(fSPIquarterP); 
@@ -112,15 +118,78 @@
       }
     }
 //----------------------------------------------//------------------------------
+    void mmSPI::force_write(char cDataHIgh, char cDataLow, char cAddress)
+    {
+      char pcReceive[8];
+      char pcSend   [8];
+      int  dLoop;
+      
+      for (dLoop = 0; dLoop < 8; dLoop++) pcSend[dLoop] = 0;
+      
+      
+                                                // high data to R2.
+      pcSend[7] = 0x02; pcSend[1] = 0xA8; pcSend[0] = cDataHIgh;   
+      transceive_vector(pcReceive, pcSend, 8);
 
 
-    
-    
-   
+                                                 // low  data to R1.
+      pcSend[7] = 0x02; pcSend[1] = 0xA4; pcSend[0] = cDataLow; 
+      transceive_vector(pcReceive, pcSend, 8);  
+        
+        
+                                                // address to R3.
+      pcSend[7] = 0x02; pcSend[1] = 0xAC; pcSend[0] = cAddress; 
+      transceive_vector(pcReceive, pcSend, 8);
+        
+        
+                                                     
+      pcSend[7] = 0x02; pcSend[1] = 0x02;  pcSend[0] = 0;   // WE high.
+      transceive_vector(pcReceive, pcSend, 8);
+        
+      pcSend[7] = 0x02; pcSend[1] = 0x00;   pcSend[0] = 0;  // WE low. 
+      transceive_vector(pcReceive, pcSend, 8);
+
+    }
+//----------------------------------------------//------------------------------
 
-
-
-
+    void mmSPI::force_read(char cAddress)
+    {
+      char pcReceive[8];
+      char pcSend   [8];
+      int  dLoop;
+      
+      for (dLoop = 0; dLoop < 8; dLoop++) pcSend[dLoop] = 0;
+      
+ 
+        
+        
+                                                // address to R3.
+      pcSend[7] = 0x02; pcSend[1] = 0xAC; pcSend[0] = cAddress; 
+      transceive_vector(pcReceive, pcSend, 8);
+        
+                                                // R2 gets data-H from memory.
+      pcSend[7] = 0x02; pcSend[1] = 0xC8; pcSend[0] = cAddress; 
+      transceive_vector(pcReceive, pcSend, 8);
+      
+                                                // R1 gets data-L from memory.
+      pcSend[7] = 0x02; pcSend[1] = 0xC4; pcSend[0] = cAddress; 
+      transceive_vector(pcReceive, pcSend, 8);
+      
+      
+      
+      
+ //       pcSend[7] = 0x02;                       // force IR.
+//        pcSend[1] = 0xA4;                       // R1 <- immediate.
+//        pcSend[0] = 0xEE;                       // immediate value.
+ ///       transceive_vector(pcReceive, pcSend, 8);     
+      
+      
+      
+                                                // no-op scan.
+      pcSend[7] = 0x02; pcSend[1] = 0x0; pcSend[0] = 0;  
+      transceive_vector(pcReceive, pcSend, 8);
+  
+    }
 //----------------------------------------------//------------------------------
 
 
@@ -134,3 +203,15 @@
 
 
 
+
+
+
+
+
+
+
+
+
+
+
+