touch screen handler for the microchip AR1020

Committer:
hlipka
Date:
Tue Feb 22 21:43:39 2011 +0000
Revision:
1:264ad2a00fd9
Parent:
0:cf4dd04052e3
Child:
2:1a436d154c84

        

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