Basis for the C2 protocol from Silicon Labs.

Dependencies:   mbed

Committer:
Ivop
Date:
Sat May 24 12:50:30 2014 +0000
Revision:
3:b30605f1c435
Parent:
2:9092d0d1558b
Child:
4:a9e3ee5741be
first test code, read devid/revid;; returns 0F:02 for my chip

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Ivop 1:7a82f806fe92 1 /*
Ivop 1:7a82f806fe92 2 * SiLabs C2 Protocol on mbed pins p5/p6
Ivop 1:7a82f806fe92 3 *
Ivop 1:7a82f806fe92 4 * Copyright (c) 2014, Ivo van Poorten <ivopvp@gmail.com>
Ivop 1:7a82f806fe92 5 * All rights reserved.
Ivop 1:7a82f806fe92 6 *
Ivop 1:7a82f806fe92 7 * Redistribution and use in source and binary forms, with or without
Ivop 1:7a82f806fe92 8 * modification, are permitted provided that the following conditions
Ivop 1:7a82f806fe92 9 * are met:
Ivop 1:7a82f806fe92 10 * 1. Redistributions of source code must retain the above copyright
Ivop 1:7a82f806fe92 11 * notice, this list of conditions and the following disclaimer.
Ivop 1:7a82f806fe92 12 * 2. Redistributions in binary form must reproduce the above copyright
Ivop 1:7a82f806fe92 13 * notice, this list of conditions and the following disclaimer in the
Ivop 1:7a82f806fe92 14 * documentation and/or other materials provided with the distribution.
Ivop 1:7a82f806fe92 15 *
Ivop 1:7a82f806fe92 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
Ivop 1:7a82f806fe92 17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
Ivop 1:7a82f806fe92 18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
Ivop 1:7a82f806fe92 19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
Ivop 1:7a82f806fe92 20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
Ivop 1:7a82f806fe92 21 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Ivop 1:7a82f806fe92 22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Ivop 1:7a82f806fe92 23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Ivop 1:7a82f806fe92 24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
Ivop 1:7a82f806fe92 25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Ivop 1:7a82f806fe92 26 */
Ivop 1:7a82f806fe92 27
Ivop 0:902f10e5d3e0 28 #include "mbed.h"
Ivop 0:902f10e5d3e0 29
Ivop 0:902f10e5d3e0 30 DigitalOut c2ck(p5);
Ivop 0:902f10e5d3e0 31 DigitalInOut c2d(p6);
Ivop 0:902f10e5d3e0 32
Ivop 1:7a82f806fe92 33 static void c2ck_reset(void) {
Ivop 1:7a82f806fe92 34 c2ck = 0;
Ivop 1:7a82f806fe92 35 wait_us(25);
Ivop 1:7a82f806fe92 36 c2ck = 1;
Ivop 1:7a82f806fe92 37 wait_us(1);
Ivop 1:7a82f806fe92 38 }
Ivop 1:7a82f806fe92 39
Ivop 1:7a82f806fe92 40 static void c2ck_strobe(void) {
Ivop 1:7a82f806fe92 41 c2ck = 0;
Ivop 1:7a82f806fe92 42 wait_us(1);
Ivop 1:7a82f806fe92 43 c2ck = 1;
Ivop 1:7a82f806fe92 44 wait_us(1);
Ivop 1:7a82f806fe92 45 }
Ivop 1:7a82f806fe92 46
Ivop 1:7a82f806fe92 47 // Four basic C2 Instructions
Ivop 1:7a82f806fe92 48 //
Ivop 1:7a82f806fe92 49 // 00b Data Read
Ivop 1:7a82f806fe92 50 // 01b Data Write
Ivop 1:7a82f806fe92 51 // 10b Address Read
Ivop 1:7a82f806fe92 52 // 11b Address Write
Ivop 2:9092d0d1558b 53 //
Ivop 2:9092d0d1558b 54 // Remember, ALL fields are sent LSB first(!)
Ivop 1:7a82f806fe92 55
Ivop 2:9092d0d1558b 56 #define START do{ c2ck_strobe(); }while(0)
Ivop 2:9092d0d1558b 57 #define STOP START
Ivop 2:9092d0d1558b 58 #define INS(a,b) do{ c2d = a; c2ck_strobe(); c2d = b; c2ck_strobe(); }while(0)
Ivop 2:9092d0d1558b 59 #define LENGTH(a,b) INS(a,b)
Ivop 2:9092d0d1558b 60 #define WAIT do{\
Ivop 2:9092d0d1558b 61 while(t-- && !c2d) { \
Ivop 2:9092d0d1558b 62 c2ck_strobe(); \
Ivop 2:9092d0d1558b 63 wait_us(1); \
Ivop 2:9092d0d1558b 64 } if (!t) return -1; \
Ivop 2:9092d0d1558b 65 } while(0)
Ivop 2:9092d0d1558b 66
Ivop 2:9092d0d1558b 67 static int c2_read_dr(void) {
Ivop 2:9092d0d1558b 68 int t = 20, i, d = 0;
Ivop 2:9092d0d1558b 69
Ivop 2:9092d0d1558b 70 START;
Ivop 2:9092d0d1558b 71 c2d.output();
Ivop 2:9092d0d1558b 72 INS(0,0);
Ivop 2:9092d0d1558b 73 LENGTH(0,0);
Ivop 2:9092d0d1558b 74 c2d.input();
Ivop 2:9092d0d1558b 75 WAIT;
Ivop 2:9092d0d1558b 76
Ivop 2:9092d0d1558b 77 for (i=0; i<8; i++) { // DATA
Ivop 2:9092d0d1558b 78 d >>= 1;
Ivop 2:9092d0d1558b 79 c2ck_strobe();
Ivop 2:9092d0d1558b 80 if (c2d) d |= 0x80;
Ivop 2:9092d0d1558b 81 }
Ivop 2:9092d0d1558b 82
Ivop 2:9092d0d1558b 83 STOP;
Ivop 2:9092d0d1558b 84
Ivop 2:9092d0d1558b 85 return d;
Ivop 2:9092d0d1558b 86 }
Ivop 2:9092d0d1558b 87
Ivop 2:9092d0d1558b 88 static int c2_write_dr(int d) {
Ivop 2:9092d0d1558b 89 int t = 20, i;
Ivop 2:9092d0d1558b 90
Ivop 2:9092d0d1558b 91 START;
Ivop 2:9092d0d1558b 92 c2d.output();
Ivop 2:9092d0d1558b 93 INS(1,0);
Ivop 2:9092d0d1558b 94 LENGTH(0,0);
Ivop 2:9092d0d1558b 95
Ivop 2:9092d0d1558b 96 for(i=0; i<8; i++) {
Ivop 2:9092d0d1558b 97 c2d = d & 1;
Ivop 2:9092d0d1558b 98 c2ck_strobe();
Ivop 2:9092d0d1558b 99 d >>= 1;
Ivop 2:9092d0d1558b 100 }
Ivop 2:9092d0d1558b 101
Ivop 2:9092d0d1558b 102 c2d.input();
Ivop 2:9092d0d1558b 103 WAIT;
Ivop 2:9092d0d1558b 104 STOP;
Ivop 2:9092d0d1558b 105
Ivop 2:9092d0d1558b 106 return 0;
Ivop 2:9092d0d1558b 107 }
Ivop 2:9092d0d1558b 108
Ivop 2:9092d0d1558b 109 static int c2_read_ar(void) {
Ivop 2:9092d0d1558b 110 int i, a = 0;
Ivop 2:9092d0d1558b 111
Ivop 2:9092d0d1558b 112 START;
Ivop 2:9092d0d1558b 113 c2d.output();
Ivop 2:9092d0d1558b 114 INS(0,1);
Ivop 2:9092d0d1558b 115 c2d.input();
Ivop 2:9092d0d1558b 116
Ivop 2:9092d0d1558b 117 for(i=0; i<8; i++) { // ADDRESS
Ivop 2:9092d0d1558b 118 a >>= 1;
Ivop 2:9092d0d1558b 119 c2ck_strobe();
Ivop 2:9092d0d1558b 120 if (c2d) a |= 0x80;
Ivop 2:9092d0d1558b 121 }
Ivop 2:9092d0d1558b 122
Ivop 2:9092d0d1558b 123 STOP;
Ivop 2:9092d0d1558b 124
Ivop 2:9092d0d1558b 125 return a;
Ivop 2:9092d0d1558b 126 }
Ivop 2:9092d0d1558b 127
Ivop 2:9092d0d1558b 128 static void c2_write_ar(int a) {
Ivop 2:9092d0d1558b 129 int i;
Ivop 2:9092d0d1558b 130
Ivop 2:9092d0d1558b 131 START;
Ivop 2:9092d0d1558b 132 c2d.output();
Ivop 2:9092d0d1558b 133 INS(1,1);
Ivop 2:9092d0d1558b 134
Ivop 2:9092d0d1558b 135 for(i=0; i<8; i++) { // ADDRESS
Ivop 2:9092d0d1558b 136 c2d = a & 1;
Ivop 2:9092d0d1558b 137 c2ck_strobe();
Ivop 2:9092d0d1558b 138 a >>= 1;
Ivop 2:9092d0d1558b 139 }
Ivop 2:9092d0d1558b 140
Ivop 2:9092d0d1558b 141 c2d.input();
Ivop 2:9092d0d1558b 142 STOP;
Ivop 2:9092d0d1558b 143 }
Ivop 1:7a82f806fe92 144
Ivop 3:b30605f1c435 145 static void fatal(char *s) {
Ivop 3:b30605f1c435 146 puts(s);
Ivop 3:b30605f1c435 147 loop:
Ivop 3:b30605f1c435 148 goto loop;
Ivop 3:b30605f1c435 149 }
Ivop 3:b30605f1c435 150
Ivop 0:902f10e5d3e0 151 int main() {
Ivop 3:b30605f1c435 152 int c, devid, revid;
Ivop 1:7a82f806fe92 153
Ivop 1:7a82f806fe92 154 c2d.input();
Ivop 1:7a82f806fe92 155 c2ck = 1;
Ivop 1:7a82f806fe92 156
Ivop 1:7a82f806fe92 157 printf("SiLabs C2 Protocol\n\r\n\r");
Ivop 1:7a82f806fe92 158 printf("Connect C2CK (clock) to p5 and C2D (data) to p6\n\r\n\r");
Ivop 1:7a82f806fe92 159 printf("Press any key to continue\n\r");
Ivop 1:7a82f806fe92 160
Ivop 1:7a82f806fe92 161 c = getc(stdin);
Ivop 3:b30605f1c435 162
Ivop 3:b30605f1c435 163 c2_write_ar(0x00);
Ivop 3:b30605f1c435 164 devid = c2_read_dr();
Ivop 3:b30605f1c435 165 if (devid < 0) fatal("unable to read devid\n\r");
Ivop 1:7a82f806fe92 166
Ivop 3:b30605f1c435 167 c2_write_ar(0x01);
Ivop 3:b30605f1c435 168 revid = c2_read_dr();
Ivop 3:b30605f1c435 169 if (revid < 0) fatal("unable to read revid\n\r");
Ivop 3:b30605f1c435 170
Ivop 3:b30605f1c435 171 printf("devid:revid = %02x:%02x\n\r", devid, revid);
Ivop 0:902f10e5d3e0 172 }