Basis for the C2 protocol from Silicon Labs.

Dependencies:   mbed

Revision:
16:844edb89d863
Parent:
15:0ccb0277d98e
Child:
17:0c5581ae2471
--- a/main.cpp	Mon May 26 17:38:22 2014 +0000
+++ b/main.cpp	Mon May 26 18:08:12 2014 +0000
@@ -109,7 +109,7 @@
     c2ck = 0;
     wait_us(25);
     c2ck = 1;
-    wait_us(2);
+    wait_us(3);
 }
 
 static void c2ck_strobe(void) {
@@ -199,9 +199,15 @@
 }
 
 static int poll_status(int mask) {
-    int t = 20;
+    int t = 20, s;
     do {
-        if (!(c2_read_ar() & mask)) return 0;
+        s = c2_read_ar();
+        if (mask == C2_MASK_INBUSY) {
+            if (!(s & mask)) return 0;
+        } else {
+            if (s & mask)    return 0;
+        }
+        printf("debug: wait 1us\r\n");
         wait_us(1);
     } while(--t);
     return -1;
@@ -221,14 +227,16 @@
     c2_write_ar(C2_REG_FPDAT);
     c2_write_dr(type);
 
-    if (poll_status(C2_MASK_INBUSY) < 0 || poll_status(C2_MASK_OUTREADY) < 0)
-        fatal("read_mem: cannot set FPDAT");
+    if (poll_status(C2_MASK_INBUSY) < 0)
+        fatal("read_mem: cannot set FPDAT, no input ACK");
+    if (poll_status(C2_MASK_OUTREADY) < 0)
+        fatal("read_mem: cannot set FPDAT, no output ready");
 
     ret = c2_read_dr();
     if (ret != C2_PI_STATUS_OK)
         fatal("read_mem: status not OK after setting FPDAT (status %02X)", ret);
 
-    if (ram_or_sfr) {
+    if (!ram_or_sfr) {
         c2_write_dr((address >> 8)&0xff);
         if (poll_status(C2_MASK_INBUSY) < 0)
             fatal("read_mem: cannot write msb of address");
@@ -238,13 +246,13 @@
     if (poll_status(C2_MASK_INBUSY) < 0)
         fatal("read_mem: cannot write lsb of address");
 
-    c2_write_dr(size);
+    c2_write_dr(size&0xff);
     if (poll_status(C2_MASK_INBUSY) < 0)
         fatal("read_mem: cannot set block length");
     if (poll_status(C2_MASK_OUTREADY) < 0)
-        fatal("read_mem: no data ready");
+        fatal("read_mem: no data ready (dr:%02X ar:%02X)", c2_read_dr(), c2_read_ar());
 
-    for (i=0; i<=size; i++)
+    for (i=0; i<size; i++)
         buf[i] = c2_read_dr();
 }
 
@@ -288,6 +296,6 @@
     c2_enable_pi();
     
     printf("Reading page 0\r\n");
-    c2_read_mem(C2_PI_CMD_DIRECT_READ, 0x0000, 0xff, buffer);
+    c2_read_mem(C2_PI_CMD_BLOCK_READ, 0x0000, 0x100, buffer);
     printf("Looks like all went well!!!");
 }
\ No newline at end of file