SPI library used to communicate with an altera development board attached to four zigbee-header pins.
Diff: mmSPI.cpp
- Revision:
- 21:e90dd0f8aaa1
- Parent:
- 20:2d5cd38047ca
- Child:
- 22:7524dee5c753
diff -r 2d5cd38047ca -r e90dd0f8aaa1 mmSPI.cpp --- a/mmSPI.cpp Mon Aug 19 23:14:36 2013 +0000 +++ b/mmSPI.cpp Tue Aug 20 14:02:56 2013 +0000 @@ -50,60 +50,6 @@ fSPIquarterP = (1 / fSPIfreq) / 4; // figure quarter-cycle period. } //----------------------------------------------//------------------------------ -// we're not going for speed, so lets go for good setup / hold. - - // send/receive a byte over SPI. - // MSB out/in first. - void mmSPI::transceive_byte(char *cReceive, char *cSend) - { - *cReceive = 0; // clear receive byte. - for (dLoop01 = 7; dLoop01 >= 0; dLoop01--)// loop for 8 bits in the byte. - { - *pSCLK = 0; // SPI clock negedge. - wait(fSPIquarterP); // until middle of clock low. - *pMOSI = (*cSend >> dLoop01) & 1; // assert MOSI. - // capture MISO. - *cReceive = *cReceive | (*pMISO << dLoop01); - wait(fSPIquarterP); // finish-out cycle. - *pSCLK = 1; // SPI clock posedge. - wait(fSPIquarterP); // finish-out cycle. - wait(fSPIquarterP); // finish-out cycle. - } - } -//----------------------------------------------//------------------------------ - // transceive a character array. - // limit is 256 characters. - // MSB out/in first. - void mmSPI::transceive_vector(char *cReceive, char *cSend, char cNumBytes) - { - - - - for (dLoop02 = (cNumBytes - 1); dLoop02 >= 0; dLoop02--) - transceive_byte(&(cReceive[dLoop02]), &(cSend[dLoop02])); - - - - *pCPUclk = 1; // pulse the CPU clock. - wait(fSPIquarterP); - wait(fSPIquarterP); - *pCPUclk = 0; - wait(fSPIquarterP); - wait(fSPIquarterP); - - - - if (0) - { - *pSCLK = 1; - wait(fSPIquarterP); - wait(fSPIquarterP); - *pSCLK = 0; - wait(fSPIquarterP); - wait(fSPIquarterP); - } - } -//----------------------------------------------//------------------------------ // transceive a character array. // limit is 256 characters. // MSB out/in first. @@ -159,94 +105,6 @@ } } //----------------------------------------------//------------------------------ - // transceive a character array. - // limit is 256 characters. - // MSB out/in first. - void mmSPI::test_toggle_cpu_clock(void) - { - DigitalOut led0(LED4); - while (1) - { - *pCPUclk = 1; led0 = 1; - wait(1.0); - *pCPUclk = 0; led0 = 0; - wait(1.0); - } - } -//----------------------------------------------//------------------------------ - 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); - - } -//----------------------------------------------//------------------------------ void mmSPI::write_register(char cRegister, char cValue, char * pcReceive, char * pcSend) { int dLoop; // loop index. @@ -271,11 +129,9 @@ char mmSPI::read_register(char cRegister, char * pcReceive, char * pcSend) { int dLoop; - // int dComplement; + - // dComplement = 7 - (int) cRegister; - - // send all 0. + // send all 0. for (dLoop = 0; dLoop < 8; dLoop++) pcSend[dLoop] = 0x00; transceive_vector2(pcReceive, pcSend, 8); // snap & scan-out reg contents. @@ -290,18 +146,6 @@ // clear transmit vector. for (dLoop = 0; dLoop < 8; dLoop++) pcSend[dLoop] = 0x00; - /* - CTRL = 7 - R0 = 6 - R1 = 5 - R2 = 4 - R3 = 3 - PC = 2 - IR-H = 1 - IR-L = 0 -*/ - - // R3 <- address. // R2 <- high-data. // R1 <- low-data. @@ -334,19 +178,7 @@ // clear transmit vector. for (dLoop = 0; dLoop < 8; dLoop++) pcSend[dLoop] = 0x00; - - /* - CTRL = 7 - R0 = 6 - R1 = 5 - R2 = 4 - R3 = 3 - PC = 2 - IR-H = 1 - IR-L = 0 -*/ - - + // R3 <- address. write_register(0x03,cAddress, pcReceive, pcSend); @@ -376,28 +208,6 @@ //----------------------------------------------//------------------------------ - void mmSPI::write_pulse(char * pcReceive, char * pcSend) - { - pcSend[7] = 0x02; // write-enable high. - pcSend[1] = 0x02; - pcSend[0] = 0x00; - transceive_vector2(pcReceive, pcSend, 8); - - pcSend[7] = 0x02; // write-enable low. - pcSend[1] = 0x00; - pcSend[0] = 0x00; - transceive_vector2(pcReceive, pcSend, 8); - - pcSend[7] = 0x00; - pcSend[6] = 0x00; - pcSend[5] = 0x00; - pcSend[4] = 0x00; - pcSend[3] = 0x00; - pcSend[2] = 0x00; - pcSend[1] = 0x00; - pcSend[0] = 0x00; - } -//----------------------------------------------//------------------------------ @@ -411,4 +221,3 @@ -