touch screen handler for the microchip AR1020

Committer:
hlipka
Date:
Mon Feb 21 22:29:40 2011 +0000
Revision:
0:cf4dd04052e3
Child:
1:264ad2a00fd9

        

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