Atmel AT42QT1070 Seven-channel QTouch® Touch Sensor IC

Committer:
mederic
Date:
Wed Jun 27 06:25:51 2018 +0000
Revision:
0:cdb98fa5056a
Child:
1:324c2c093ab8
1st release

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mederic 0:cdb98fa5056a 1 #include "QT1070.h"
mederic 0:cdb98fa5056a 2
mederic 0:cdb98fa5056a 3 // Detection Status REG bits
mederic 0:cdb98fa5056a 4 #define QT1070_BIT_CALIB 7
mederic 0:cdb98fa5056a 5 #define QT1070_BIT_OVFLW 6
mederic 0:cdb98fa5056a 6 #define QT1070_BIT_TOUCH 0
mederic 0:cdb98fa5056a 7
mederic 0:cdb98fa5056a 8 // AVEAKS REG bits
mederic 0:cdb98fa5056a 9 #define QT1070_BIT_AVE 2
mederic 0:cdb98fa5056a 10
mederic 0:cdb98fa5056a 11 // FOMOGRD REG bits
mederic 0:cdb98fa5056a 12 #define QT1070_BIT_FO 5
mederic 0:cdb98fa5056a 13 #define QT1070_BIT_MAX_CAL 4
mederic 0:cdb98fa5056a 14 #define QT1070_MSL_GUARD 0xF0
mederic 0:cdb98fa5056a 15
mederic 0:cdb98fa5056a 16 QT1070::QT1070(I2C *i2c, PinName change):_i2c(i2c),_change(change){
mederic 0:cdb98fa5056a 17 reset();
mederic 0:cdb98fa5056a 18 }
mederic 0:cdb98fa5056a 19
mederic 0:cdb98fa5056a 20 char QT1070::key(void){
mederic 0:cdb98fa5056a 21 return read(REG_KEYSTAT);
mederic 0:cdb98fa5056a 22 }
mederic 0:cdb98fa5056a 23
mederic 0:cdb98fa5056a 24 bool QT1070::change(void){
mederic 0:cdb98fa5056a 25 if(_change.is_connected()){
mederic 0:cdb98fa5056a 26 return !_change;
mederic 0:cdb98fa5056a 27 }else{
mederic 0:cdb98fa5056a 28 return (read(REG_STATUS)&(1<<QT1070_BIT_TOUCH));
mederic 0:cdb98fa5056a 29 }
mederic 0:cdb98fa5056a 30 }
mederic 0:cdb98fa5056a 31
mederic 0:cdb98fa5056a 32 unsigned short QT1070::signal(char key){
mederic 0:cdb98fa5056a 33 key%=KEY_NUM;
mederic 0:cdb98fa5056a 34 return readW(REG_KEYSIG0+(key<<1));
mederic 0:cdb98fa5056a 35 }
mederic 0:cdb98fa5056a 36
mederic 0:cdb98fa5056a 37 unsigned short QT1070::ref(char key){
mederic 0:cdb98fa5056a 38 key%=KEY_NUM;
mederic 0:cdb98fa5056a 39 return readW(REG_REFDAT0+(key<<1));
mederic 0:cdb98fa5056a 40 }
mederic 0:cdb98fa5056a 41
mederic 0:cdb98fa5056a 42 char QT1070::nthresh(char key, char val){
mederic 0:cdb98fa5056a 43 key%=KEY_NUM;
mederic 0:cdb98fa5056a 44 if (val){
mederic 0:cdb98fa5056a 45 write(REG_NTHR0+key,val);
mederic 0:cdb98fa5056a 46 }
mederic 0:cdb98fa5056a 47 return read(REG_NTHR0+key);
mederic 0:cdb98fa5056a 48 }
mederic 0:cdb98fa5056a 49
mederic 0:cdb98fa5056a 50 char QT1070::aksAve(char key, char group, char ave){
mederic 0:cdb98fa5056a 51 key%=KEY_NUM;
mederic 0:cdb98fa5056a 52 ave%=AVEMAX;
mederic 0:cdb98fa5056a 53 group%=AKSMAX;
mederic 0:cdb98fa5056a 54 write(REG_AVEAKS0+key,(ave<<QT1070_BIT_AVE)|(group));
mederic 0:cdb98fa5056a 55 return read(REG_AVEAKS0+key);
mederic 0:cdb98fa5056a 56 }
mederic 0:cdb98fa5056a 57
mederic 0:cdb98fa5056a 58 void QT1070::detectInt(char key, char val){
mederic 0:cdb98fa5056a 59 key%=KEY_NUM;
mederic 0:cdb98fa5056a 60 val |= 0x02;
mederic 0:cdb98fa5056a 61 write(REG_DI0+key,val);
mederic 0:cdb98fa5056a 62 }
mederic 0:cdb98fa5056a 63
mederic 0:cdb98fa5056a 64 void QT1070::foMaxCal(bool fo, bool maxcal){
mederic 0:cdb98fa5056a 65 char reg = read(REG_FOMOGRD);
mederic 0:cdb98fa5056a 66 reg &= ~((1<<QT1070_BIT_FO) | (1<<QT1070_BIT_MAX_CAL));
mederic 0:cdb98fa5056a 67 reg |= (fo<<QT1070_BIT_FO) | (maxcal<<QT1070_BIT_MAX_CAL);
mederic 0:cdb98fa5056a 68 write(REG_FOMOGRD, reg);
mederic 0:cdb98fa5056a 69 }
mederic 0:cdb98fa5056a 70
mederic 0:cdb98fa5056a 71 void QT1070::guard(char key){
mederic 0:cdb98fa5056a 72 key%=KEY_NUM;
mederic 0:cdb98fa5056a 73 char reg = read(REG_FOMOGRD);
mederic 0:cdb98fa5056a 74 reg &= QT1070_MSL_GUARD;
mederic 0:cdb98fa5056a 75 reg |= key;
mederic 0:cdb98fa5056a 76 write(REG_FOMOGRD ,reg);
mederic 0:cdb98fa5056a 77 }
mederic 0:cdb98fa5056a 78
mederic 0:cdb98fa5056a 79 void QT1070::lowpwr(unsigned short ms){
mederic 0:cdb98fa5056a 80 char reg = (ms%2040)>>3;
mederic 0:cdb98fa5056a 81 write(REG_LOWPWR, reg);
mederic 0:cdb98fa5056a 82
mederic 0:cdb98fa5056a 83 }
mederic 0:cdb98fa5056a 84
mederic 0:cdb98fa5056a 85 void QT1070::maxOnDuration(unsigned short ms){
mederic 0:cdb98fa5056a 86 write(REG_MAXOND , ms>>4);
mederic 0:cdb98fa5056a 87 }
mederic 0:cdb98fa5056a 88
mederic 0:cdb98fa5056a 89 void QT1070::calibrate(void){
mederic 0:cdb98fa5056a 90 write(REG_CALIB ,255);
mederic 0:cdb98fa5056a 91 }
mederic 0:cdb98fa5056a 92
mederic 0:cdb98fa5056a 93 void QT1070::reset(void){
mederic 0:cdb98fa5056a 94 write(REG_RESET ,255);
mederic 0:cdb98fa5056a 95 }
mederic 0:cdb98fa5056a 96
mederic 0:cdb98fa5056a 97 void QT1070::write(char reg, char data){
mederic 0:cdb98fa5056a 98 char buf[2] = {reg,data};
mederic 0:cdb98fa5056a 99 _i2c->write(I2C_ADDR, buf, 2);
mederic 0:cdb98fa5056a 100 }
mederic 0:cdb98fa5056a 101
mederic 0:cdb98fa5056a 102 void QT1070::writeW(char reg, unsigned short data){
mederic 0:cdb98fa5056a 103 char buf[3] = {reg,data>>8,data&0xff};
mederic 0:cdb98fa5056a 104 _i2c->write(I2C_ADDR, buf, 3);
mederic 0:cdb98fa5056a 105 }
mederic 0:cdb98fa5056a 106
mederic 0:cdb98fa5056a 107 char QT1070::read(char reg){
mederic 0:cdb98fa5056a 108 char ret;
mederic 0:cdb98fa5056a 109 _i2c->write(I2C_ADDR, &reg, 1);
mederic 0:cdb98fa5056a 110 _i2c->read(I2C_ADDR, &ret, 1);
mederic 0:cdb98fa5056a 111 return ret;
mederic 0:cdb98fa5056a 112 }
mederic 0:cdb98fa5056a 113
mederic 0:cdb98fa5056a 114 unsigned short QT1070::readW(char reg){
mederic 0:cdb98fa5056a 115 char ret[2];
mederic 0:cdb98fa5056a 116 _i2c->write(I2C_ADDR, &reg, 1);
mederic 0:cdb98fa5056a 117 _i2c->read(I2C_ADDR, ret, 2);
mederic 0:cdb98fa5056a 118 return ret[0]<<8 | ret[1];
mederic 0:cdb98fa5056a 119 }
mederic 0:cdb98fa5056a 120