touch screen handler for the microchip AR1020

Committer:
hlipka
Date:
Tue Feb 22 22:54:25 2011 +0000
Revision:
3:b7eb3b3fe79f
Parent:
2:1a436d154c84
Child:
4:510ea5b28a05
initial public version

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 2:1a436d154c84 27 AR1020::AR1020(SPI *spi, PinName enable, PinName sqi, PinName power, bool swapX, bool swapY, bool swapXY) {
hlipka 0:cf4dd04052e3 28 _spi=spi;
hlipka 0:cf4dd04052e3 29 _enable=new DigitalOut(enable);
hlipka 0:cf4dd04052e3 30 _enable->write(1);
hlipka 0:cf4dd04052e3 31 _irq=new InterruptIn(sqi);
hlipka 0:cf4dd04052e3 32 _x=-1;
hlipka 0:cf4dd04052e3 33 _y=-1;
hlipka 0:cf4dd04052e3 34 _pen=0;
hlipka 0:cf4dd04052e3 35 _oldPen=false;
hlipka 0:cf4dd04052e3 36 _led=new DigitalOut(LED1);
hlipka 1:264ad2a00fd9 37 _power=new DigitalOut(power);
hlipka 1:264ad2a00fd9 38 _power->write(0);
hlipka 0:cf4dd04052e3 39 }
hlipka 0:cf4dd04052e3 40
hlipka 2:1a436d154c84 41 AR1020::AR1020(PinName mosi, PinName miso, PinName clk, PinName enable, PinName sqi, PinName power, bool swapX, bool swapY, bool swapXY) {
hlipka 0:cf4dd04052e3 42 _mosi=new DigitalOut(mosi);
hlipka 0:cf4dd04052e3 43 _miso=new DigitalIn(miso);
hlipka 0:cf4dd04052e3 44 _clk=new DigitalOut(clk);
hlipka 0:cf4dd04052e3 45 _clk->write(0);
hlipka 0:cf4dd04052e3 46
hlipka 0:cf4dd04052e3 47 _enable=new DigitalOut(enable);
hlipka 0:cf4dd04052e3 48 _enable->write(1);
hlipka 0:cf4dd04052e3 49 _irq=new InterruptIn(sqi);
hlipka 0:cf4dd04052e3 50 _sqi=new DigitalIn(sqi);
hlipka 0:cf4dd04052e3 51 _x=-1;
hlipka 0:cf4dd04052e3 52 _y=-1;
hlipka 0:cf4dd04052e3 53 _pen=0;
hlipka 0:cf4dd04052e3 54 _oldPen=false;
hlipka 0:cf4dd04052e3 55 _led=new DigitalOut(LED1);
hlipka 1:264ad2a00fd9 56 _power=new DigitalOut(power);
hlipka 1:264ad2a00fd9 57 _power->write(0);
hlipka 0:cf4dd04052e3 58 }
hlipka 0:cf4dd04052e3 59
hlipka 2:1a436d154c84 60 AR1020::~AR1020() {
hlipka 0:cf4dd04052e3 61 delete _enable;
hlipka 0:cf4dd04052e3 62 delete _irq;
hlipka 0:cf4dd04052e3 63 }
hlipka 0:cf4dd04052e3 64
hlipka 2:1a436d154c84 65 void AR1020::init() {
hlipka 3:b7eb3b3fe79f 66 bool ok=false;
hlipka 3:b7eb3b3fe79f 67 while (!ok)
hlipka 3:b7eb3b3fe79f 68 {
hlipka 3:b7eb3b3fe79f 69 _power->write(0);
hlipka 3:b7eb3b3fe79f 70 wait_ms(200);
hlipka 3:b7eb3b3fe79f 71 _power->write(1);
hlipka 3:b7eb3b3fe79f 72 wait_ms(100);
hlipka 3:b7eb3b3fe79f 73 int r=cmd(0x13,NULL,0);
hlipka 3:b7eb3b3fe79f 74 printf("disable touch=%i\n",r);
hlipka 3:b7eb3b3fe79f 75 if (0!=r)
hlipka 3:b7eb3b3fe79f 76 continue;
hlipka 3:b7eb3b3fe79f 77
hlipka 3:b7eb3b3fe79f 78 int regStart=cmd(0x22,NULL,0);
hlipka 3:b7eb3b3fe79f 79 printf("reg offset=%i\n",regStart);
hlipka 3:b7eb3b3fe79f 80
hlipka 3:b7eb3b3fe79f 81 if (regStart<0)
hlipka 3:b7eb3b3fe79f 82 continue;
hlipka 3:b7eb3b3fe79f 83
hlipka 3:b7eb3b3fe79f 84 char cid2[4]={0x00,0x0d+regStart,0x01,0x01};
hlipka 3:b7eb3b3fe79f 85 r=cmd(0x21,cid2,4);
hlipka 3:b7eb3b3fe79f 86 printf("set mode=1 => %i\n",r);
hlipka 3:b7eb3b3fe79f 87 if (0!=r)
hlipka 3:b7eb3b3fe79f 88 continue;
hlipka 3:b7eb3b3fe79f 89
hlipka 3:b7eb3b3fe79f 90 r=cmd(0x12,NULL,0);
hlipka 3:b7eb3b3fe79f 91 printf("enable touch=%i\n",r);
hlipka 3:b7eb3b3fe79f 92 if (0!=r)
hlipka 3:b7eb3b3fe79f 93 continue;
hlipka 3:b7eb3b3fe79f 94 ok=true;
hlipka 3:b7eb3b3fe79f 95 }
hlipka 0:cf4dd04052e3 96 _irq->rise(this, &AR1020::read);
hlipka 0:cf4dd04052e3 97 }
hlipka 0:cf4dd04052e3 98
hlipka 2:1a436d154c84 99 int AR1020::x() {
hlipka 0:cf4dd04052e3 100 return _x;
hlipka 0:cf4dd04052e3 101 }
hlipka 0:cf4dd04052e3 102
hlipka 2:1a436d154c84 103 int AR1020::y() {
hlipka 0:cf4dd04052e3 104 return _y;
hlipka 0:cf4dd04052e3 105 }
hlipka 0:cf4dd04052e3 106
hlipka 2:1a436d154c84 107 int AR1020::pen() {
hlipka 0:cf4dd04052e3 108 return _pen;
hlipka 0:cf4dd04052e3 109 }
hlipka 0:cf4dd04052e3 110
hlipka 0:cf4dd04052e3 111
hlipka 2:1a436d154c84 112 void AR1020::read() {
hlipka 2:1a436d154c84 113 while (1==_sqi->read()) {
hlipka 2:1a436d154c84 114 _led->write(1);
hlipka 2:1a436d154c84 115 _enable->write(0);
hlipka 2:1a436d154c84 116 wait_us(60);
hlipka 2:1a436d154c84 117
hlipka 2:1a436d154c84 118 int pen=readByte();
hlipka 2:1a436d154c84 119 wait_us(60);
hlipka 2:1a436d154c84 120
hlipka 2:1a436d154c84 121 int xlo=readByte();
hlipka 2:1a436d154c84 122 wait_us(60);
hlipka 2:1a436d154c84 123
hlipka 2:1a436d154c84 124 int xhi=readByte();
hlipka 2:1a436d154c84 125 wait_us(60);
hlipka 2:1a436d154c84 126
hlipka 2:1a436d154c84 127 int ylo=readByte();
hlipka 2:1a436d154c84 128 wait_us(60);
hlipka 2:1a436d154c84 129
hlipka 2:1a436d154c84 130 int yhi=readByte();
hlipka 2:1a436d154c84 131 _enable->write(1);
hlipka 0:cf4dd04052e3 132
hlipka 0:cf4dd04052e3 133 // printf("0x%x|0x%x|0x%x|0x%x|0x%x\n", pen,xlo,xhi,ylo,yhi);
hlipka 2:1a436d154c84 134 if (0x4d==pen || 0==pen || 255==pen) {
hlipka 2:1a436d154c84 135 // ignore invalid stuff, do nothing...
hlipka 2:1a436d154c84 136 } else if (0x81!=pen&0x81) { // pen set?
hlipka 2:1a436d154c84 137 _pen=0;
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 2:1a436d154c84 144 } else {
hlipka 2:1a436d154c84 145 _pen=1;
hlipka 2:1a436d154c84 146 int x=xlo+(xhi<<7);
hlipka 2:1a436d154c84 147 int y=ylo+(yhi<<7);
hlipka 2:1a436d154c84 148 if (0!=x&&0!=y) {
hlipka 2:1a436d154c84 149 _x=x;
hlipka 2:1a436d154c84 150 _y=y;
hlipka 2:1a436d154c84 151 }
hlipka 0:cf4dd04052e3 152 }
hlipka 2:1a436d154c84 153 _event.x=_x;
hlipka 2:1a436d154c84 154 _event.y=_y;
hlipka 2:1a436d154c84 155 _event.pen=_pen;
hlipka 2:1a436d154c84 156 if (_pen==1 && _oldPen==false) { // pen down
hlipka 2:1a436d154c84 157 _callbackPD.call((uint32_t)&_event);
hlipka 2:1a436d154c84 158 } else if (_pen==1 && _oldPen==true) { // pen moved
hlipka 2:1a436d154c84 159 _callbackPM.call((uint32_t)&_event);
hlipka 2:1a436d154c84 160 } else if (_pen==0 && _oldPen==true) { // pen up
hlipka 2:1a436d154c84 161 _callbackPU.call((uint32_t)&_event);
hlipka 2:1a436d154c84 162 } else {
hlipka 2:1a436d154c84 163 // happens on the first touch (the first report is send with pen=0).
hlipka 2:1a436d154c84 164 }
hlipka 2:1a436d154c84 165 _oldPen=(_pen==1);
hlipka 2:1a436d154c84 166 _led->write(0);
hlipka 2:1a436d154c84 167 if (1==_sqi->read())
hlipka 2:1a436d154c84 168 wait_ms(5);
hlipka 0:cf4dd04052e3 169 }
hlipka 0:cf4dd04052e3 170 }
hlipka 0:cf4dd04052e3 171
hlipka 2:1a436d154c84 172 int AR1020::cmd(char cmd,char* data, int len, bool doEnable) {
hlipka 2:1a436d154c84 173 if (doEnable) {
hlipka 2:1a436d154c84 174 _enable->write(1);
hlipka 2:1a436d154c84 175 wait_us(1000);
hlipka 2:1a436d154c84 176 _enable->write(0);
hlipka 2:1a436d154c84 177 }
hlipka 2:1a436d154c84 178
hlipka 0:cf4dd04052e3 179 wait_us(10);
hlipka 2:1a436d154c84 180
hlipka 0:cf4dd04052e3 181 writeByte(0x55);
hlipka 0:cf4dd04052e3 182 wait_us(100);
hlipka 2:1a436d154c84 183
hlipka 0:cf4dd04052e3 184 writeByte(len+1);
hlipka 0:cf4dd04052e3 185 wait_us(100);
hlipka 2:1a436d154c84 186
hlipka 0:cf4dd04052e3 187 writeByte(cmd);
hlipka 0:cf4dd04052e3 188 wait_us(100);
hlipka 2:1a436d154c84 189
hlipka 2:1a436d154c84 190 for (int i=0;i<len;i++) {
hlipka 0:cf4dd04052e3 191 writeByte(data[i]);
hlipka 0:cf4dd04052e3 192 wait_us(100);
hlipka 0:cf4dd04052e3 193 }
hlipka 0:cf4dd04052e3 194 Timer t;
hlipka 0:cf4dd04052e3 195 t.start();
hlipka 2:1a436d154c84 196 while (true) {
hlipka 2:1a436d154c84 197 wait_us(100);
hlipka 2:1a436d154c84 198 if (1==_sqi->read())
hlipka 2:1a436d154c84 199 break;
hlipka 2:1a436d154c84 200 if (t.read_ms()>1)
hlipka 2:1a436d154c84 201 break;
hlipka 0:cf4dd04052e3 202 }
hlipka 0:cf4dd04052e3 203 char rhead=readByte();
hlipka 0:cf4dd04052e3 204 wait_us(100);
hlipka 2:1a436d154c84 205 if (rhead!=0x55) {
hlipka 2:1a436d154c84 206 if (doEnable)
hlipka 2:1a436d154c84 207 _enable->write(1);
hlipka 0:cf4dd04052e3 208 printf("rh=0x%x\n",rhead);
hlipka 0:cf4dd04052e3 209 return -1000;
hlipka 0:cf4dd04052e3 210 }
hlipka 0:cf4dd04052e3 211 char rlen=readByte();
hlipka 0:cf4dd04052e3 212 wait_us(100);
hlipka 2:1a436d154c84 213 if (rlen==2) {
hlipka 0:cf4dd04052e3 214 char r=readByte();
hlipka 0:cf4dd04052e3 215 wait_us(100);
hlipka 0:cf4dd04052e3 216 char rc=readByte();
hlipka 0:cf4dd04052e3 217 wait_us(100);
hlipka 2:1a436d154c84 218 if (doEnable)
hlipka 2:1a436d154c84 219 _enable->write(1);
hlipka 0:cf4dd04052e3 220 if (rc!=cmd)
hlipka 0:cf4dd04052e3 221 return -2000;
hlipka 0:cf4dd04052e3 222 return -r;
hlipka 2:1a436d154c84 223 } else if (rlen==3) {
hlipka 0:cf4dd04052e3 224 char r=readByte();
hlipka 0:cf4dd04052e3 225 wait_us(100);
hlipka 0:cf4dd04052e3 226 char rc=readByte();
hlipka 0:cf4dd04052e3 227 wait_us(100);
hlipka 2:1a436d154c84 228 if (rc!=cmd) {
hlipka 2:1a436d154c84 229 if (doEnable)
hlipka 2:1a436d154c84 230 _enable->write(1);
hlipka 0:cf4dd04052e3 231 return -3000;
hlipka 0:cf4dd04052e3 232 }
hlipka 0:cf4dd04052e3 233 char rd=readByte();
hlipka 0:cf4dd04052e3 234 wait_us(100);
hlipka 2:1a436d154c84 235 if (doEnable)
hlipka 2:1a436d154c84 236 _enable->write(1);
hlipka 0:cf4dd04052e3 237 if (r==0)
hlipka 0:cf4dd04052e3 238 return rd;
hlipka 0:cf4dd04052e3 239 return -r;
hlipka 2:1a436d154c84 240 } else {
hlipka 2:1a436d154c84 241 if (doEnable)
hlipka 2:1a436d154c84 242 _enable->write(1);
hlipka 0:cf4dd04052e3 243 return -4000;
hlipka 0:cf4dd04052e3 244 }
hlipka 0:cf4dd04052e3 245 }
hlipka 2:1a436d154c84 246 void AR1020::calibrate() {
hlipka 0:cf4dd04052e3 247 _irq->rise(NULL);
hlipka 0:cf4dd04052e3 248
hlipka 0:cf4dd04052e3 249 DigitalOut led1(LED1);
hlipka 0:cf4dd04052e3 250 DigitalOut led2(LED2);
hlipka 0:cf4dd04052e3 251 DigitalOut led3(LED3);
hlipka 0:cf4dd04052e3 252 DigitalOut led4(LED4);
hlipka 2:1a436d154c84 253 led1=0;
hlipka 2:1a436d154c84 254 led2=0;
hlipka 2:1a436d154c84 255 led3=1;
hlipka 2:1a436d154c84 256 led4=1;
hlipka 2:1a436d154c84 257
hlipka 2:1a436d154c84 258 int r=cmd(0x13,NULL,0);
hlipka 0:cf4dd04052e3 259 printf("disable touch=%i\n",r);
hlipka 0:cf4dd04052e3 260 wait_ms(100);
hlipka 0:cf4dd04052e3 261 if (r<0)
hlipka 0:cf4dd04052e3 262 return;
hlipka 0:cf4dd04052e3 263 led4=0;
hlipka 2:1a436d154c84 264
hlipka 0:cf4dd04052e3 265 int regStart=cmd(0x22,NULL,0);
hlipka 0:cf4dd04052e3 266 printf("reg offset=%i\n",regStart);
hlipka 0:cf4dd04052e3 267
hlipka 0:cf4dd04052e3 268 char cid[3]={0x00,0x0d+regStart,0x01};
hlipka 0:cf4dd04052e3 269 int mode=cmd(0x20,cid,3);
hlipka 0:cf4dd04052e3 270 printf("mode=%i\n",mode);
hlipka 0:cf4dd04052e3 271
hlipka 0:cf4dd04052e3 272 if (regStart<0)
hlipka 0:cf4dd04052e3 273 return;
hlipka 0:cf4dd04052e3 274 printf("start calibrate\n");
hlipka 2:1a436d154c84 275 led3=0;
hlipka 0:cf4dd04052e3 276 char cid2[4]={0x00,0x0e+regStart,0x01,0x19};
hlipka 0:cf4dd04052e3 277 r=cmd(0x21,cid2,4);
hlipka 0:cf4dd04052e3 278 printf("set inset=%i\n",r);
hlipka 0:cf4dd04052e3 279 if (r<0)
hlipka 0:cf4dd04052e3 280 return;
hlipka 0:cf4dd04052e3 281
hlipka 0:cf4dd04052e3 282 _enable->write(1);
hlipka 2:1a436d154c84 283 wait_us(100);
hlipka 0:cf4dd04052e3 284 _enable->write(0);
hlipka 0:cf4dd04052e3 285 wait_us(10);
hlipka 2:1a436d154c84 286 char cid3[1]={0x04};
hlipka 2:1a436d154c84 287 cmd(0x14,cid3,1,false);
hlipka 2:1a436d154c84 288
hlipka 2:1a436d154c84 289 wait_ms(1);
hlipka 0:cf4dd04052e3 290
hlipka 0:cf4dd04052e3 291 int resp=readCalibResponse();
hlipka 0:cf4dd04052e3 292 printf("status=%i\n",resp);
hlipka 0:cf4dd04052e3 293 printf("start OK, press upper left");
hlipka 0:cf4dd04052e3 294 led1=1;
hlipka 0:cf4dd04052e3 295 resp=readCalibResponse();
hlipka 0:cf4dd04052e3 296 printf("status=%i\n",resp);
hlipka 0:cf4dd04052e3 297 printf("press upper right");
hlipka 0:cf4dd04052e3 298 led2=1;
hlipka 0:cf4dd04052e3 299 resp=readCalibResponse();
hlipka 0:cf4dd04052e3 300 printf("status=%i\n",resp);
hlipka 0:cf4dd04052e3 301 printf("press lower right");
hlipka 0:cf4dd04052e3 302 led3=1;
hlipka 0:cf4dd04052e3 303 resp=readCalibResponse();
hlipka 0:cf4dd04052e3 304 printf("status=%i\n",resp);
hlipka 0:cf4dd04052e3 305 printf("press lower left");
hlipka 0:cf4dd04052e3 306 led4=1;
hlipka 0:cf4dd04052e3 307 resp=readCalibResponse();
hlipka 0:cf4dd04052e3 308 printf("status=%i\n",resp);
hlipka 2:1a436d154c84 309
hlipka 2:1a436d154c84 310 _enable->write(1);
hlipka 2:1a436d154c84 311
hlipka 2:1a436d154c84 312 r=cmd(0x23,NULL,0);
hlipka 2:1a436d154c84 313 printf("save registers=%i\n",r);
hlipka 2:1a436d154c84 314
hlipka 2:1a436d154c84 315 r=cmd(0x12,NULL,0);
hlipka 0:cf4dd04052e3 316 printf("enable touch=%i\n",r);
hlipka 2:1a436d154c84 317
hlipka 0:cf4dd04052e3 318 _irq->rise(this, &AR1020::read);
hlipka 2:1a436d154c84 319
hlipka 0:cf4dd04052e3 320 }
hlipka 0:cf4dd04052e3 321
hlipka 2:1a436d154c84 322 int AR1020::readCalibResponse() {
hlipka 2:1a436d154c84 323 while (true) {
hlipka 0:cf4dd04052e3 324 int r=readByte();
hlipka 2:1a436d154c84 325 if (r!=0x55) {
hlipka 2:1a436d154c84 326 // printf("1=0x%x\n",r);
hlipka 0:cf4dd04052e3 327 wait_ms(100);
hlipka 0:cf4dd04052e3 328 continue;
hlipka 0:cf4dd04052e3 329 }
hlipka 0:cf4dd04052e3 330
hlipka 0:cf4dd04052e3 331 r=readByte();
hlipka 0:cf4dd04052e3 332 wait_us(100);
hlipka 2:1a436d154c84 333 if (r!=0x02) {
hlipka 0:cf4dd04052e3 334 printf("2=0x%x\n",r);
hlipka 0:cf4dd04052e3 335 continue;
hlipka 0:cf4dd04052e3 336 }
hlipka 2:1a436d154c84 337
hlipka 0:cf4dd04052e3 338 r=readByte();
hlipka 0:cf4dd04052e3 339 wait_us(100);
hlipka 2:1a436d154c84 340 if (r!=0x00) {
hlipka 0:cf4dd04052e3 341 printf("3=0x%x\n",r);
hlipka 0:cf4dd04052e3 342 continue;
hlipka 0:cf4dd04052e3 343 }
hlipka 0:cf4dd04052e3 344 int rc=readByte();
hlipka 0:cf4dd04052e3 345 wait_us(100);
hlipka 2:1a436d154c84 346 if (rc!=0x14) {
hlipka 0:cf4dd04052e3 347 printf("4=0x%x\n",r);
hlipka 0:cf4dd04052e3 348 continue;
hlipka 0:cf4dd04052e3 349 }
hlipka 2:1a436d154c84 350
hlipka 0:cf4dd04052e3 351 return r;
hlipka 0:cf4dd04052e3 352 }
hlipka 0:cf4dd04052e3 353 }
hlipka 0:cf4dd04052e3 354
hlipka 2:1a436d154c84 355 int AR1020::readByte() {
hlipka 0:cf4dd04052e3 356 _clk->write(0);
hlipka 0:cf4dd04052e3 357 wait_us(10);
hlipka 0:cf4dd04052e3 358 int r=0;
hlipka 2:1a436d154c84 359 for (int i=0;i<8;i++) {
hlipka 0:cf4dd04052e3 360 r=r<<1;
hlipka 0:cf4dd04052e3 361 _clk->write(1);
hlipka 0:cf4dd04052e3 362 wait_us(10);
hlipka 0:cf4dd04052e3 363 _clk->write(0);
hlipka 0:cf4dd04052e3 364 wait_us(10);
hlipka 0:cf4dd04052e3 365 int bit=_miso->read();
hlipka 0:cf4dd04052e3 366 r+=bit;
hlipka 0:cf4dd04052e3 367 }
hlipka 0:cf4dd04052e3 368 // printf("<-%i\n",r);
hlipka 0:cf4dd04052e3 369 return r;
hlipka 0:cf4dd04052e3 370 }
hlipka 0:cf4dd04052e3 371
hlipka 2:1a436d154c84 372 void AR1020::writeByte(char byte) {
hlipka 0:cf4dd04052e3 373 _clk->write(0);
hlipka 0:cf4dd04052e3 374 wait_us(10);
hlipka 0:cf4dd04052e3 375 // printf("->0x%x\n",byte);
hlipka 2:1a436d154c84 376 for (int i=0;i<8;i++) {
hlipka 0:cf4dd04052e3 377 int bit=byte>127;
hlipka 0:cf4dd04052e3 378 // printf("%i",bit);
hlipka 0:cf4dd04052e3 379 _clk->write(1);
hlipka 0:cf4dd04052e3 380 wait_us(10);
hlipka 0:cf4dd04052e3 381 _mosi->write(bit);
hlipka 0:cf4dd04052e3 382 wait_us(10);
hlipka 0:cf4dd04052e3 383 _clk->write(0);
hlipka 0:cf4dd04052e3 384 wait_us(10);
hlipka 0:cf4dd04052e3 385 byte=(char)(byte<<1);
hlipka 0:cf4dd04052e3 386
hlipka 0:cf4dd04052e3 387 }
hlipka 0:cf4dd04052e3 388 // printf("\n");
hlipka 0:cf4dd04052e3 389 }