#define MISO BIT2
#define SCK BIT3
+
//This could be more accurate.
//Does it ever need to be?
#define CCSPEED 3
-//#define CCDELAY(x) delay(x)
-#define CCDELAY(x)
+#define CCDELAY(x) delay(x)
+//#define CCDELAY(x)
#define SETMOSI P5OUT|=MOSI
#define CLRMOSI P5OUT&=~MOSI
//Two positive debug clock pulses while !RST is low.
//Take RST low, pulse twice, then high.
P5OUT&=~SCK;
+ delay(10);
P5OUT&=~RST;
+ delay(10);
+
//Two rising edges.
P5OUT^=SCK; //up
+ delay(1);
P5OUT^=SCK; //down
+ delay(1);
P5OUT^=SCK; //up
+ delay(1);
P5OUT^=SCK; //Unnecessary.
-
+ delay(1);
+ //delay(0);
//Raise !RST.
P5OUT|=RST;
//Might hurt too.
//ccdebuginit();
long i;
+ int blocklen, blockadr;
switch(verb){
//CC_PEEK and CC_POKE will come later.
//Micro commands!
case CC_CHIP_ERASE:
+ case CC_MASS_ERASE_FLASH:
cc_chip_erase();
txdata(app,verb,1);
break;
txdata(app,verb,1);
break;
case CC_READ_XDATA_MEMORY:
- cmddata[0]=cc_peekdatabyte(cmddataword[0]);
- txdata(app,verb,1);
+ //Read the length.
+ blocklen=1;
+ if(len>2)
+ blocklen=cmddataword[1];
+ blockadr=cmddataword[0];
+
+ //Return that many bytes.
+ for(i=0;i<blocklen;i++)
+ cmddata[i]=cc_peekdatabyte(blockadr+i);
+ txdata(app,verb,blocklen);
break;
+
case CC_WRITE_XDATA_MEMORY:
cmddata[0]=cc_pokedatabyte(cmddataword[0], cmddata[2]);
txdata(app,verb,1);
cc_pokedatabyte(i,0xFF);
txdata(app,verb,0);
break;
- case CC_MASS_ERASE_FLASH:
+
case CC_CLOCK_INIT:
case CC_PROGRAM_FLASH:
+ default:
debugstr("This Chipcon command is not yet implemented.");
txdata(app,NOK,0);//TODO implement me.
break;