an SPI interface the cmu pixy camera
Dependents: robotic_fish_ver_4_9_pixy UMO
Diff: pixy.cpp
- Revision:
- 0:1b99a0bee9e0
- Child:
- 2:fc86438b206f
diff -r 000000000000 -r 1b99a0bee9e0 pixy.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pixy.cpp Mon Jun 02 21:02:09 2014 +0000 @@ -0,0 +1,72 @@ +#include "pixy.h" + +pixySPI::pixySPI(PinName mosi, PinName miso, PinName sclk, Serial* ser) +{ + spi=new SPI(mosi,miso,sclk); //the default spi settings will work fine here + spi->format(8,0); + spi->frequency(100000); + sync=0xAA55; + debug=ser; +} + +pixySPI::~pixySPI() +{ + delete spi; +} + + +short pixySPI::readTwoBytesLSB() +{ + short out; + char read[2]; + read[0]=spi->write(0x00); + read[1]=spi->write(0x00); + out=(((short)read[0]) << 8) | read[1]; + return out; +} + + +//this doesn't work +void pixySPI::readNBytes(char* buf, int num) +{ + for (int i=0; i<num; i++) { + char byte=spi->write(0x00); + debug->printf("%X\n", byte); + memcpy(buf+i, &byte, 1); + } +} + +Block pixySPI::getBlock(Serial* debug) +{ + Block out; + uint16_t checksum=0; + //first we need to detect the start of a block. They all start with 0xAA55 + char frame[2]= {0,0}; //this is a 2 byte running frame of what is being recieved. It's like a first-in-last-out queue + //debug->printf("looking for valid signature\n"); + while (memcmp((char*)&sync, frame, 2)!=0) { + frame[0]=frame[1]; //move byte down + frame[1]=spi->write(0x00); //get next byte. + } + spi->write(0x00); + //ok so we got a valid signature + //these didn't end up working + //readNBytes((char*)(&checksum), 2); //get the checksum + //readNBytes((char*)(&out), sizeof(Block)); //get the rest of the data + checksum=readTwoBytesLSB(); + out.signature=readTwoBytesLSB(); + out.x=readTwoBytesLSB(); + out.y=readTwoBytesLSB(); + out.width=readTwoBytesLSB(); + out.height=readTwoBytesLSB(); + + if (checksum!=(out.x+out.y+out.signature+out.width+out.height)) { + //debug->printf("checksum doesn't add up %d\n", checksum); + out.signature=20; //used for invalid signatures + } + return out; +} + +char pixySPI::getRawData() +{ + return spi->write(0x00); +} \ No newline at end of file