Ivo van Poorten
/
SiLabs_C2
Basis for the C2 protocol from Silicon Labs.
main.cpp@2:9092d0d1558b, 2014-05-24 (annotated)
- Committer:
- Ivop
- Date:
- Sat May 24 12:34:13 2014 +0000
- Revision:
- 2:9092d0d1558b
- Parent:
- 1:7a82f806fe92
- Child:
- 3:b30605f1c435
generic read/write data/address routines
Who changed what in which revision?
User | Revision | Line number | New 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 | 0:902f10e5d3e0 | 145 | int main() { |
Ivop | 1:7a82f806fe92 | 146 | int c; |
Ivop | 1:7a82f806fe92 | 147 | |
Ivop | 1:7a82f806fe92 | 148 | c2d.input(); |
Ivop | 1:7a82f806fe92 | 149 | c2ck = 1; |
Ivop | 1:7a82f806fe92 | 150 | |
Ivop | 1:7a82f806fe92 | 151 | printf("SiLabs C2 Protocol\n\r\n\r"); |
Ivop | 1:7a82f806fe92 | 152 | printf("Connect C2CK (clock) to p5 and C2D (data) to p6\n\r\n\r"); |
Ivop | 1:7a82f806fe92 | 153 | printf("Press any key to continue\n\r"); |
Ivop | 1:7a82f806fe92 | 154 | |
Ivop | 1:7a82f806fe92 | 155 | c = getc(stdin); |
Ivop | 1:7a82f806fe92 | 156 | |
Ivop | 1:7a82f806fe92 | 157 | printf("\n\rHello, world\n\r"); |
Ivop | 0:902f10e5d3e0 | 158 | } |