touch screen handler for the microchip AR1020

Committer:
hlipka
Date:
Thu Feb 24 22:05:04 2011 +0000
Revision:
6:a6971458d612
Parent:
5:a5eba88e8c3e
calibration works now

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hlipka 0:cf4dd04052e3 1 /*
hlipka 0:cf4dd04052e3 2 * mbed AR1020 library
hlipka 0:cf4dd04052e3 3 * Copyright (c) 2010 Hendrik Lipka
hlipka 0:cf4dd04052e3 4 *
hlipka 0:cf4dd04052e3 5 * Permission is hereby granted, free of charge, to any person obtaining a copy
hlipka 0:cf4dd04052e3 6 * of this software and associated documentation files (the "Software"), to deal
hlipka 0:cf4dd04052e3 7 * in the Software without restriction, including without limitation the rights
hlipka 0:cf4dd04052e3 8 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
hlipka 0:cf4dd04052e3 9 * copies of the Software, and to permit persons to whom the Software is
hlipka 0:cf4dd04052e3 10 * furnished to do so, subject to the following conditions:
hlipka 0:cf4dd04052e3 11 *
hlipka 0:cf4dd04052e3 12 * The above copyright notice and this permission notice shall be included in
hlipka 0:cf4dd04052e3 13 * all copies or substantial portions of the Software.
hlipka 0:cf4dd04052e3 14 *
hlipka 0:cf4dd04052e3 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
hlipka 0:cf4dd04052e3 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
hlipka 0:cf4dd04052e3 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
hlipka 0:cf4dd04052e3 18 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
hlipka 0:cf4dd04052e3 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
hlipka 0:cf4dd04052e3 20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
hlipka 0:cf4dd04052e3 21 * THE SOFTWARE.
hlipka 0:cf4dd04052e3 22 */
hlipka 0:cf4dd04052e3 23
hlipka 0:cf4dd04052e3 24 #include "ar1020.h"
hlipka 0:cf4dd04052e3 25 #include "wait_api.h"
hlipka 0:cf4dd04052e3 26
hlipka 4:510ea5b28a05 27 AR1020::AR1020(PinName mosi, PinName miso, PinName clk, PinName enable, PinName siq, PinName power) {
hlipka 0:cf4dd04052e3 28 _mosi=new DigitalOut(mosi);
hlipka 0:cf4dd04052e3 29 _miso=new DigitalIn(miso);
hlipka 0:cf4dd04052e3 30 _clk=new DigitalOut(clk);
hlipka 0:cf4dd04052e3 31 _clk->write(0);
hlipka 0:cf4dd04052e3 32
hlipka 0:cf4dd04052e3 33 _enable=new DigitalOut(enable);
hlipka 0:cf4dd04052e3 34 _enable->write(1);
hlipka 4:510ea5b28a05 35 _irq=new InterruptIn(siq);
hlipka 4:510ea5b28a05 36 _siq=new DigitalIn(siq);
hlipka 0:cf4dd04052e3 37 _x=-1;
hlipka 0:cf4dd04052e3 38 _y=-1;
hlipka 0:cf4dd04052e3 39 _pen=0;
hlipka 0:cf4dd04052e3 40 _oldPen=false;
hlipka 0:cf4dd04052e3 41 _led=new DigitalOut(LED1);
hlipka 1:264ad2a00fd9 42 _power=new DigitalOut(power);
hlipka 1:264ad2a00fd9 43 _power->write(0);
hlipka 0:cf4dd04052e3 44 }
hlipka 0:cf4dd04052e3 45
hlipka 2:1a436d154c84 46 AR1020::~AR1020() {
hlipka 0:cf4dd04052e3 47 delete _enable;
hlipka 0:cf4dd04052e3 48 delete _irq;
hlipka 0:cf4dd04052e3 49 }
hlipka 0:cf4dd04052e3 50
hlipka 2:1a436d154c84 51 void AR1020::init() {
hlipka 3:b7eb3b3fe79f 52 bool ok=false;
hlipka 3:b7eb3b3fe79f 53 while (!ok)
hlipka 3:b7eb3b3fe79f 54 {
hlipka 5:a5eba88e8c3e 55 printf("power on AR1020\n");
hlipka 3:b7eb3b3fe79f 56 _power->write(0);
hlipka 5:a5eba88e8c3e 57 wait_ms(400);
hlipka 5:a5eba88e8c3e 58 _power->write(1);
hlipka 3:b7eb3b3fe79f 59 wait_ms(200);
hlipka 3:b7eb3b3fe79f 60 int r=cmd(0x13,NULL,0);
hlipka 3:b7eb3b3fe79f 61 printf("disable touch=%i\n",r);
hlipka 3:b7eb3b3fe79f 62 if (0!=r)
hlipka 3:b7eb3b3fe79f 63 continue;
hlipka 3:b7eb3b3fe79f 64
hlipka 3:b7eb3b3fe79f 65 int regStart=cmd(0x22,NULL,0);
hlipka 3:b7eb3b3fe79f 66 printf("reg offset=%i\n",regStart);
hlipka 3:b7eb3b3fe79f 67
hlipka 3:b7eb3b3fe79f 68 if (regStart<0)
hlipka 3:b7eb3b3fe79f 69 continue;
hlipka 3:b7eb3b3fe79f 70
hlipka 3:b7eb3b3fe79f 71 char cid2[4]={0x00,0x0d+regStart,0x01,0x01};
hlipka 3:b7eb3b3fe79f 72 r=cmd(0x21,cid2,4);
hlipka 3:b7eb3b3fe79f 73 printf("set mode=1 => %i\n",r);
hlipka 3:b7eb3b3fe79f 74 if (0!=r)
hlipka 3:b7eb3b3fe79f 75 continue;
hlipka 5:a5eba88e8c3e 76
hlipka 5:a5eba88e8c3e 77 r=cmd(0x23,NULL,0 );
hlipka 5:a5eba88e8c3e 78 printf("save regs => %i\n",r);
hlipka 5:a5eba88e8c3e 79 if (0!=r)
hlipka 5:a5eba88e8c3e 80 continue;
hlipka 3:b7eb3b3fe79f 81
hlipka 3:b7eb3b3fe79f 82 r=cmd(0x12,NULL,0);
hlipka 3:b7eb3b3fe79f 83 printf("enable touch=%i\n",r);
hlipka 3:b7eb3b3fe79f 84 if (0!=r)
hlipka 3:b7eb3b3fe79f 85 continue;
hlipka 3:b7eb3b3fe79f 86 ok=true;
hlipka 3:b7eb3b3fe79f 87 }
hlipka 0:cf4dd04052e3 88 _irq->rise(this, &AR1020::read);
hlipka 0:cf4dd04052e3 89 }
hlipka 0:cf4dd04052e3 90
hlipka 2:1a436d154c84 91 int AR1020::x() {
hlipka 0:cf4dd04052e3 92 return _x;
hlipka 0:cf4dd04052e3 93 }
hlipka 0:cf4dd04052e3 94
hlipka 2:1a436d154c84 95 int AR1020::y() {
hlipka 0:cf4dd04052e3 96 return _y;
hlipka 0:cf4dd04052e3 97 }
hlipka 0:cf4dd04052e3 98
hlipka 2:1a436d154c84 99 int AR1020::pen() {
hlipka 0:cf4dd04052e3 100 return _pen;
hlipka 0:cf4dd04052e3 101 }
hlipka 0:cf4dd04052e3 102
hlipka 0:cf4dd04052e3 103
hlipka 2:1a436d154c84 104 void AR1020::read() {
hlipka 4:510ea5b28a05 105 while (1==_siq->read()) {
hlipka 2:1a436d154c84 106 _led->write(1);
hlipka 2:1a436d154c84 107 _enable->write(0);
hlipka 2:1a436d154c84 108 wait_us(60);
hlipka 2:1a436d154c84 109
hlipka 2:1a436d154c84 110 int pen=readByte();
hlipka 2:1a436d154c84 111 wait_us(60);
hlipka 2:1a436d154c84 112
hlipka 2:1a436d154c84 113 int xlo=readByte();
hlipka 2:1a436d154c84 114 wait_us(60);
hlipka 2:1a436d154c84 115
hlipka 2:1a436d154c84 116 int xhi=readByte();
hlipka 2:1a436d154c84 117 wait_us(60);
hlipka 2:1a436d154c84 118
hlipka 2:1a436d154c84 119 int ylo=readByte();
hlipka 2:1a436d154c84 120 wait_us(60);
hlipka 2:1a436d154c84 121
hlipka 2:1a436d154c84 122 int yhi=readByte();
hlipka 2:1a436d154c84 123 _enable->write(1);
hlipka 0:cf4dd04052e3 124
hlipka 0:cf4dd04052e3 125 // printf("0x%x|0x%x|0x%x|0x%x|0x%x\n", pen,xlo,xhi,ylo,yhi);
hlipka 2:1a436d154c84 126 if (0x4d==pen || 0==pen || 255==pen) {
hlipka 2:1a436d154c84 127 // ignore invalid stuff, do nothing...
hlipka 2:1a436d154c84 128 } else if (0x81!=pen&0x81) { // pen set?
hlipka 2:1a436d154c84 129 _pen=0;
hlipka 2:1a436d154c84 130 int x=xlo+(xhi<<7);
hlipka 2:1a436d154c84 131 int y=ylo+(yhi<<7);
hlipka 2:1a436d154c84 132 if (0!=x&&0!=y) {
hlipka 2:1a436d154c84 133 _x=x;
hlipka 2:1a436d154c84 134 _y=y;
hlipka 2:1a436d154c84 135 }
hlipka 2:1a436d154c84 136 } else {
hlipka 2:1a436d154c84 137 _pen=1;
hlipka 2:1a436d154c84 138 int x=xlo+(xhi<<7);
hlipka 2:1a436d154c84 139 int y=ylo+(yhi<<7);
hlipka 2:1a436d154c84 140 if (0!=x&&0!=y) {
hlipka 2:1a436d154c84 141 _x=x;
hlipka 2:1a436d154c84 142 _y=y;
hlipka 2:1a436d154c84 143 }
hlipka 0:cf4dd04052e3 144 }
hlipka 2:1a436d154c84 145 _event.x=_x;
hlipka 2:1a436d154c84 146 _event.y=_y;
hlipka 2:1a436d154c84 147 _event.pen=_pen;
hlipka 2:1a436d154c84 148 if (_pen==1 && _oldPen==false) { // pen down
hlipka 2:1a436d154c84 149 _callbackPD.call((uint32_t)&_event);
hlipka 2:1a436d154c84 150 } else if (_pen==1 && _oldPen==true) { // pen moved
hlipka 2:1a436d154c84 151 _callbackPM.call((uint32_t)&_event);
hlipka 2:1a436d154c84 152 } else if (_pen==0 && _oldPen==true) { // pen up
hlipka 2:1a436d154c84 153 _callbackPU.call((uint32_t)&_event);
hlipka 2:1a436d154c84 154 } else {
hlipka 2:1a436d154c84 155 // happens on the first touch (the first report is send with pen=0).
hlipka 2:1a436d154c84 156 }
hlipka 2:1a436d154c84 157 _oldPen=(_pen==1);
hlipka 2:1a436d154c84 158 _led->write(0);
hlipka 4:510ea5b28a05 159 if (1==_siq->read())
hlipka 2:1a436d154c84 160 wait_ms(5);
hlipka 0:cf4dd04052e3 161 }
hlipka 0:cf4dd04052e3 162 }
hlipka 0:cf4dd04052e3 163
hlipka 2:1a436d154c84 164 int AR1020::cmd(char cmd,char* data, int len, bool doEnable) {
hlipka 2:1a436d154c84 165 if (doEnable) {
hlipka 2:1a436d154c84 166 _enable->write(1);
hlipka 2:1a436d154c84 167 wait_us(1000);
hlipka 2:1a436d154c84 168 _enable->write(0);
hlipka 2:1a436d154c84 169 }
hlipka 2:1a436d154c84 170
hlipka 6:a6971458d612 171 wait_us(100);
hlipka 2:1a436d154c84 172
hlipka 0:cf4dd04052e3 173 writeByte(0x55);
hlipka 0:cf4dd04052e3 174 wait_us(100);
hlipka 2:1a436d154c84 175
hlipka 0:cf4dd04052e3 176 writeByte(len+1);
hlipka 0:cf4dd04052e3 177 wait_us(100);
hlipka 2:1a436d154c84 178
hlipka 0:cf4dd04052e3 179 writeByte(cmd);
hlipka 0:cf4dd04052e3 180 wait_us(100);
hlipka 2:1a436d154c84 181
hlipka 2:1a436d154c84 182 for (int i=0;i<len;i++) {
hlipka 0:cf4dd04052e3 183 writeByte(data[i]);
hlipka 0:cf4dd04052e3 184 wait_us(100);
hlipka 0:cf4dd04052e3 185 }
hlipka 0:cf4dd04052e3 186 Timer t;
hlipka 0:cf4dd04052e3 187 t.start();
hlipka 2:1a436d154c84 188 while (true) {
hlipka 2:1a436d154c84 189 wait_us(100);
hlipka 4:510ea5b28a05 190 if (1==_siq->read())
hlipka 2:1a436d154c84 191 break;
hlipka 5:a5eba88e8c3e 192 if (t.read_ms()>1000)
hlipka 5:a5eba88e8c3e 193 {
hlipka 5:a5eba88e8c3e 194 printf("timeout\n");
hlipka 2:1a436d154c84 195 break;
hlipka 5:a5eba88e8c3e 196 }
hlipka 0:cf4dd04052e3 197 }
hlipka 0:cf4dd04052e3 198 char rhead=readByte();
hlipka 0:cf4dd04052e3 199 wait_us(100);
hlipka 2:1a436d154c84 200 if (rhead!=0x55) {
hlipka 2:1a436d154c84 201 if (doEnable)
hlipka 2:1a436d154c84 202 _enable->write(1);
hlipka 0:cf4dd04052e3 203 printf("rh=0x%x\n",rhead);
hlipka 0:cf4dd04052e3 204 return -1000;
hlipka 0:cf4dd04052e3 205 }
hlipka 0:cf4dd04052e3 206 char rlen=readByte();
hlipka 0:cf4dd04052e3 207 wait_us(100);
hlipka 2:1a436d154c84 208 if (rlen==2) {
hlipka 0:cf4dd04052e3 209 char r=readByte();
hlipka 0:cf4dd04052e3 210 wait_us(100);
hlipka 0:cf4dd04052e3 211 char rc=readByte();
hlipka 0:cf4dd04052e3 212 wait_us(100);
hlipka 2:1a436d154c84 213 if (doEnable)
hlipka 2:1a436d154c84 214 _enable->write(1);
hlipka 0:cf4dd04052e3 215 if (rc!=cmd)
hlipka 0:cf4dd04052e3 216 return -2000;
hlipka 0:cf4dd04052e3 217 return -r;
hlipka 2:1a436d154c84 218 } else if (rlen==3) {
hlipka 0:cf4dd04052e3 219 char r=readByte();
hlipka 0:cf4dd04052e3 220 wait_us(100);
hlipka 0:cf4dd04052e3 221 char rc=readByte();
hlipka 0:cf4dd04052e3 222 wait_us(100);
hlipka 2:1a436d154c84 223 if (rc!=cmd) {
hlipka 2:1a436d154c84 224 if (doEnable)
hlipka 2:1a436d154c84 225 _enable->write(1);
hlipka 0:cf4dd04052e3 226 return -3000;
hlipka 0:cf4dd04052e3 227 }
hlipka 0:cf4dd04052e3 228 char rd=readByte();
hlipka 0:cf4dd04052e3 229 wait_us(100);
hlipka 2:1a436d154c84 230 if (doEnable)
hlipka 2:1a436d154c84 231 _enable->write(1);
hlipka 0:cf4dd04052e3 232 if (r==0)
hlipka 0:cf4dd04052e3 233 return rd;
hlipka 0:cf4dd04052e3 234 return -r;
hlipka 2:1a436d154c84 235 } else {
hlipka 2:1a436d154c84 236 if (doEnable)
hlipka 2:1a436d154c84 237 _enable->write(1);
hlipka 0:cf4dd04052e3 238 return -4000;
hlipka 0:cf4dd04052e3 239 }
hlipka 0:cf4dd04052e3 240 }
hlipka 2:1a436d154c84 241 void AR1020::calibrate() {
hlipka 0:cf4dd04052e3 242 _irq->rise(NULL);
hlipka 0:cf4dd04052e3 243
hlipka 0:cf4dd04052e3 244 DigitalOut led1(LED1);
hlipka 0:cf4dd04052e3 245 DigitalOut led2(LED2);
hlipka 0:cf4dd04052e3 246 DigitalOut led3(LED3);
hlipka 0:cf4dd04052e3 247 DigitalOut led4(LED4);
hlipka 2:1a436d154c84 248 led1=0;
hlipka 2:1a436d154c84 249 led2=0;
hlipka 2:1a436d154c84 250 led3=1;
hlipka 2:1a436d154c84 251 led4=1;
hlipka 2:1a436d154c84 252
hlipka 2:1a436d154c84 253 int r=cmd(0x13,NULL,0);
hlipka 0:cf4dd04052e3 254 printf("disable touch=%i\n",r);
hlipka 0:cf4dd04052e3 255 wait_ms(100);
hlipka 0:cf4dd04052e3 256 if (r<0)
hlipka 0:cf4dd04052e3 257 return;
hlipka 0:cf4dd04052e3 258 led4=0;
hlipka 2:1a436d154c84 259
hlipka 0:cf4dd04052e3 260 int regStart=cmd(0x22,NULL,0);
hlipka 0:cf4dd04052e3 261 printf("reg offset=%i\n",regStart);
hlipka 0:cf4dd04052e3 262
hlipka 0:cf4dd04052e3 263 char cid[3]={0x00,0x0d+regStart,0x01};
hlipka 0:cf4dd04052e3 264 int mode=cmd(0x20,cid,3);
hlipka 0:cf4dd04052e3 265 printf("mode=%i\n",mode);
hlipka 0:cf4dd04052e3 266
hlipka 0:cf4dd04052e3 267 if (regStart<0)
hlipka 0:cf4dd04052e3 268 return;
hlipka 0:cf4dd04052e3 269 printf("start calibrate\n");
hlipka 2:1a436d154c84 270 led3=0;
hlipka 0:cf4dd04052e3 271 char cid2[4]={0x00,0x0e+regStart,0x01,0x19};
hlipka 0:cf4dd04052e3 272 r=cmd(0x21,cid2,4);
hlipka 0:cf4dd04052e3 273 printf("set inset=%i\n",r);
hlipka 0:cf4dd04052e3 274 if (r<0)
hlipka 0:cf4dd04052e3 275 return;
hlipka 0:cf4dd04052e3 276
hlipka 0:cf4dd04052e3 277 _enable->write(1);
hlipka 2:1a436d154c84 278 wait_us(100);
hlipka 0:cf4dd04052e3 279 _enable->write(0);
hlipka 0:cf4dd04052e3 280 wait_us(10);
hlipka 2:1a436d154c84 281 char cid3[1]={0x04};
hlipka 6:a6971458d612 282 r=cmd(0x14,cid3,1,false);
hlipka 6:a6971458d612 283 printf("start calibration=%i\n",r);
hlipka 6:a6971458d612 284 if (r<0)
hlipka 6:a6971458d612 285 return;
hlipka 2:1a436d154c84 286
hlipka 6:a6971458d612 287 printf("start OK, press upper left\n");
hlipka 6:a6971458d612 288 led1=1;
hlipka 0:cf4dd04052e3 289 int resp=readCalibResponse();
hlipka 0:cf4dd04052e3 290 printf("status=%i\n",resp);
hlipka 6:a6971458d612 291 printf("press upper right\n");
hlipka 0:cf4dd04052e3 292 led2=1;
hlipka 0:cf4dd04052e3 293 resp=readCalibResponse();
hlipka 0:cf4dd04052e3 294 printf("status=%i\n",resp);
hlipka 6:a6971458d612 295 printf("press lower right\n");
hlipka 0:cf4dd04052e3 296 led3=1;
hlipka 0:cf4dd04052e3 297 resp=readCalibResponse();
hlipka 0:cf4dd04052e3 298 printf("status=%i\n",resp);
hlipka 6:a6971458d612 299 printf("press lower left\n");
hlipka 0:cf4dd04052e3 300 led4=1;
hlipka 0:cf4dd04052e3 301 resp=readCalibResponse();
hlipka 0:cf4dd04052e3 302 printf("status=%i\n",resp);
hlipka 6:a6971458d612 303 printf("exit calibration mode\n");
hlipka 6:a6971458d612 304
hlipka 6:a6971458d612 305 led1=0;
hlipka 6:a6971458d612 306 led2=0;
hlipka 6:a6971458d612 307 led3=0;
hlipka 6:a6971458d612 308 led4=0;
hlipka 2:1a436d154c84 309
hlipka 2:1a436d154c84 310 _enable->write(1);
hlipka 6:a6971458d612 311 wait_ms(1000);
hlipka 2:1a436d154c84 312
hlipka 2:1a436d154c84 313 r=cmd(0x23,NULL,0);
hlipka 2:1a436d154c84 314 printf("save registers=%i\n",r);
hlipka 2:1a436d154c84 315
hlipka 2:1a436d154c84 316 r=cmd(0x12,NULL,0);
hlipka 0:cf4dd04052e3 317 printf("enable touch=%i\n",r);
hlipka 2:1a436d154c84 318
hlipka 0:cf4dd04052e3 319 _irq->rise(this, &AR1020::read);
hlipka 2:1a436d154c84 320
hlipka 0:cf4dd04052e3 321 }
hlipka 0:cf4dd04052e3 322
hlipka 2:1a436d154c84 323 int AR1020::readCalibResponse() {
hlipka 2:1a436d154c84 324 while (true) {
hlipka 5:a5eba88e8c3e 325 while (true) {
hlipka 6:a6971458d612 326 wait_us(10);
hlipka 5:a5eba88e8c3e 327 if (1==_siq->read())
hlipka 5:a5eba88e8c3e 328 break;
hlipka 5:a5eba88e8c3e 329 }
hlipka 5:a5eba88e8c3e 330
hlipka 0:cf4dd04052e3 331 int r=readByte();
hlipka 2:1a436d154c84 332 if (r!=0x55) {
hlipka 2:1a436d154c84 333 // printf("1=0x%x\n",r);
hlipka 0:cf4dd04052e3 334 wait_ms(100);
hlipka 0:cf4dd04052e3 335 continue;
hlipka 0:cf4dd04052e3 336 }
hlipka 0:cf4dd04052e3 337
hlipka 6:a6971458d612 338 wait_us(100);
hlipka 0:cf4dd04052e3 339 r=readByte();
hlipka 2:1a436d154c84 340 if (r!=0x02) {
hlipka 0:cf4dd04052e3 341 printf("2=0x%x\n",r);
hlipka 0:cf4dd04052e3 342 continue;
hlipka 0:cf4dd04052e3 343 }
hlipka 2:1a436d154c84 344
hlipka 6:a6971458d612 345 wait_us(100);
hlipka 0:cf4dd04052e3 346 r=readByte();
hlipka 2:1a436d154c84 347 if (r!=0x00) {
hlipka 0:cf4dd04052e3 348 printf("3=0x%x\n",r);
hlipka 0:cf4dd04052e3 349 continue;
hlipka 0:cf4dd04052e3 350 }
hlipka 6:a6971458d612 351
hlipka 6:a6971458d612 352 wait_us(100);
hlipka 0:cf4dd04052e3 353 int rc=readByte();
hlipka 2:1a436d154c84 354 if (rc!=0x14) {
hlipka 0:cf4dd04052e3 355 printf("4=0x%x\n",r);
hlipka 0:cf4dd04052e3 356 continue;
hlipka 0:cf4dd04052e3 357 }
hlipka 2:1a436d154c84 358
hlipka 0:cf4dd04052e3 359 return r;
hlipka 0:cf4dd04052e3 360 }
hlipka 0:cf4dd04052e3 361 }
hlipka 0:cf4dd04052e3 362
hlipka 2:1a436d154c84 363 int AR1020::readByte() {
hlipka 0:cf4dd04052e3 364 _clk->write(0);
hlipka 0:cf4dd04052e3 365 wait_us(10);
hlipka 0:cf4dd04052e3 366 int r=0;
hlipka 2:1a436d154c84 367 for (int i=0;i<8;i++) {
hlipka 0:cf4dd04052e3 368 r=r<<1;
hlipka 0:cf4dd04052e3 369 _clk->write(1);
hlipka 0:cf4dd04052e3 370 wait_us(10);
hlipka 0:cf4dd04052e3 371 _clk->write(0);
hlipka 0:cf4dd04052e3 372 wait_us(10);
hlipka 0:cf4dd04052e3 373 int bit=_miso->read();
hlipka 0:cf4dd04052e3 374 r+=bit;
hlipka 0:cf4dd04052e3 375 }
hlipka 0:cf4dd04052e3 376 // printf("<-%i\n",r);
hlipka 0:cf4dd04052e3 377 return r;
hlipka 0:cf4dd04052e3 378 }
hlipka 0:cf4dd04052e3 379
hlipka 2:1a436d154c84 380 void AR1020::writeByte(char byte) {
hlipka 0:cf4dd04052e3 381 _clk->write(0);
hlipka 0:cf4dd04052e3 382 wait_us(10);
hlipka 0:cf4dd04052e3 383 // printf("->0x%x\n",byte);
hlipka 2:1a436d154c84 384 for (int i=0;i<8;i++) {
hlipka 0:cf4dd04052e3 385 int bit=byte>127;
hlipka 0:cf4dd04052e3 386 // printf("%i",bit);
hlipka 0:cf4dd04052e3 387 _clk->write(1);
hlipka 0:cf4dd04052e3 388 wait_us(10);
hlipka 0:cf4dd04052e3 389 _mosi->write(bit);
hlipka 0:cf4dd04052e3 390 wait_us(10);
hlipka 0:cf4dd04052e3 391 _clk->write(0);
hlipka 0:cf4dd04052e3 392 wait_us(10);
hlipka 0:cf4dd04052e3 393 byte=(char)(byte<<1);
hlipka 0:cf4dd04052e3 394
hlipka 0:cf4dd04052e3 395 }
hlipka 0:cf4dd04052e3 396 // printf("\n");
hlipka 0:cf4dd04052e3 397 }