Nick Lowyck / Mbed 2 deprecated Ledcube

Dependencies:   mbed mbed-rtos

Committer:
sNICKer1103
Date:
Thu May 08 18:59:52 2014 +0000
Revision:
5:e4ed6c5baf89
Parent:
4:a091b8f8216d
ter

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sNICKer1103 2:f2700008c9d9 1 #include "SPIDriver.h"
sNICKer1103 2:f2700008c9d9 2 #include "mbed.h"
sNICKer1103 4:a091b8f8216d 3 #include "rtos.h"
sNICKer1103 2:f2700008c9d9 4
sNICKer1103 2:f2700008c9d9 5 SPIDriver::SPIDriver(PinName pin1, PinName pin2, PinName pin3, PinName latchpin, PinName cspin, const int freq) : spi(pin1, pin2, pin3){
sNICKer1103 2:f2700008c9d9 6 spi.format(8, 3);
sNICKer1103 2:f2700008c9d9 7 spi.frequency(freq);
sNICKer1103 2:f2700008c9d9 8
sNICKer1103 2:f2700008c9d9 9 latch = new DigitalOut(latchpin);
sNICKer1103 2:f2700008c9d9 10 cs = new DigitalOut(cspin);
sNICKer1103 2:f2700008c9d9 11
sNICKer1103 2:f2700008c9d9 12 *latch = 0;
sNICKer1103 2:f2700008c9d9 13 *cs = 1;
sNICKer1103 2:f2700008c9d9 14 }
sNICKer1103 2:f2700008c9d9 15
sNICKer1103 3:da30c350c339 16 SPIDriver::~SPIDriver(){
sNICKer1103 3:da30c350c339 17 }
sNICKer1103 3:da30c350c339 18
sNICKer1103 2:f2700008c9d9 19 void SPIDriver::write(uint8_t ledcolor){
sNICKer1103 2:f2700008c9d9 20 *cs = 0;
sNICKer1103 2:f2700008c9d9 21 spi.write(ledcolor);
sNICKer1103 2:f2700008c9d9 22 *cs = 1;
sNICKer1103 2:f2700008c9d9 23 }
sNICKer1103 2:f2700008c9d9 24
sNICKer1103 3:da30c350c339 25 void SPIDriver::reversedwrite(uint8_t ledcolor){
sNICKer1103 3:da30c350c339 26 *cs = 0;
sNICKer1103 3:da30c350c339 27 spi.write(reverse_byte(ledcolor));
sNICKer1103 3:da30c350c339 28 *cs = 1;
sNICKer1103 3:da30c350c339 29 }
sNICKer1103 3:da30c350c339 30
sNICKer1103 2:f2700008c9d9 31 void SPIDriver::pulseLatch(){
sNICKer1103 2:f2700008c9d9 32 *latch = 1;
sNICKer1103 5:e4ed6c5baf89 33 wait(0.000001);
sNICKer1103 2:f2700008c9d9 34 *latch = 0;
sNICKer1103 3:da30c350c339 35 }
sNICKer1103 3:da30c350c339 36
sNICKer1103 4:a091b8f8216d 37 void SPIDriver::sendLayer(LedCube* ledc){
sNICKer1103 5:e4ed6c5baf89 38 unsigned char valueled = ledc->getNextValue();
sNICKer1103 5:e4ed6c5baf89 39 // printf("%d ", valueled);
sNICKer1103 5:e4ed6c5baf89 40 write(valueled); //eerst laag selecteren, SPI zendt normaalgezien MSB first
sNICKer1103 4:a091b8f8216d 41 for(int j = 0; j < 24; j++) {
sNICKer1103 5:e4ed6c5baf89 42 unsigned char valueled = ledc->getNextValue();
sNICKer1103 5:e4ed6c5baf89 43 // printf("%d ", valueled);
sNICKer1103 5:e4ed6c5baf89 44 write(valueled); //ledwaarden zelf nog altijd apart, omdat ze mogelijk gespiegeld moeten doorgestuurd worden
sNICKer1103 4:a091b8f8216d 45 } //(LSB first)
sNICKer1103 4:a091b8f8216d 46 }
sNICKer1103 4:a091b8f8216d 47
sNICKer1103 3:da30c350c339 48 void SPIDriver::sendFrame(LedCube* ledc){
sNICKer1103 5:e4ed6c5baf89 49 for(int i = 0; i < 8; i++) {
sNICKer1103 5:e4ed6c5baf89 50 sendLayer(ledc);
sNICKer1103 5:e4ed6c5baf89 51 wait(0.00025); //voor 100 Hz
sNICKer1103 3:da30c350c339 52 pulseLatch();
sNICKer1103 3:da30c350c339 53 }//end outer for loop
sNICKer1103 4:a091b8f8216d 54 // printf("Frame gezonden!!\n\r");
sNICKer1103 3:da30c350c339 55 }
sNICKer1103 3:da30c350c339 56
sNICKer1103 5:e4ed6c5baf89 57 void SPIDriver::sendTestFrame(LedCube* ledc){
sNICKer1103 5:e4ed6c5baf89 58 for(int i = 0; i < 8; i++) {
sNICKer1103 5:e4ed6c5baf89 59 sendLayer(ledc);
sNICKer1103 5:e4ed6c5baf89 60 wait(0.00125);
sNICKer1103 5:e4ed6c5baf89 61 pulseLatch();
sNICKer1103 5:e4ed6c5baf89 62 }
sNICKer1103 5:e4ed6c5baf89 63 }
sNICKer1103 5:e4ed6c5baf89 64
sNICKer1103 3:da30c350c339 65 void SPIDriver::sendTest(LedCube* ledc, int frames){
sNICKer1103 3:da30c350c339 66 printf("Testing...\n\r");
sNICKer1103 3:da30c350c339 67 for(int i = 0; i < frames; i++) {
sNICKer1103 5:e4ed6c5baf89 68 sendTestFrame(ledc);
sNICKer1103 3:da30c350c339 69 }
sNICKer1103 3:da30c350c339 70 }
sNICKer1103 3:da30c350c339 71
sNICKer1103 3:da30c350c339 72 void SPIDriver::testPhase(int xframes){
sNICKer1103 3:da30c350c339 73 printf("Initiating Test phase\n\r");
sNICKer1103 3:da30c350c339 74
sNICKer1103 3:da30c350c339 75 LedCube* testledcube1 = new LedCube();
sNICKer1103 5:e4ed6c5baf89 76 // testledcube1->testMode(LedCube::firsthalfwhite);
sNICKer1103 4:a091b8f8216d 77 sendTest(testledcube1, xframes);
sNICKer1103 3:da30c350c339 78
sNICKer1103 4:a091b8f8216d 79 LedCube* testledcube2 = new LedCube();
sNICKer1103 5:e4ed6c5baf89 80 // testledcube2->testMode(LedCube::secondhalfwhite);
sNICKer1103 3:da30c350c339 81 sendTest(testledcube2, xframes);
sNICKer1103 3:da30c350c339 82
sNICKer1103 3:da30c350c339 83 printf("Test phase terminated!\n\r");
sNICKer1103 3:da30c350c339 84 }
sNICKer1103 3:da30c350c339 85
sNICKer1103 3:da30c350c339 86 uint8_t SPIDriver::reverse_byte(uint8_t byte)
sNICKer1103 3:da30c350c339 87 {
sNICKer1103 3:da30c350c339 88 return (__rbit(byte) >> 24) & 0xFF; // reverse a byte in a 32-bit value, and extract the byte
sNICKer1103 2:f2700008c9d9 89 }