this is a first compilation of a library for IQS5xx. For now, it work with the iqs572ev02 devellopment board. The code is inspired with the sample code provide by Azotech. I have some issu with the interrupt pin RDY, which seem to be high even I don't touch de board.

Dependencies:   mbed

Committer:
skydarc
Date:
Wed Jan 01 16:39:19 2020 +0000
Revision:
2:bd4b620316aa
Parent:
0:4907da2299a4
done ! the rdy pin is functionnal. the "system config 1" register need to be properly configured.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
skydarc 0:4907da2299a4 1 /* IQS572.cpp
skydarc 0:4907da2299a4 2 * Tested with mbed board: LPC1768
skydarc 0:4907da2299a4 3 * Author: skydarc
skydarc 0:4907da2299a4 4 * skydarc@gmail.com
skydarc 0:4907da2299a4 5 */
skydarc 0:4907da2299a4 6
skydarc 0:4907da2299a4 7 #include "mbed.h"
skydarc 0:4907da2299a4 8 #include "IQS5xx.h"
skydarc 0:4907da2299a4 9 #include <new>
skydarc 0:4907da2299a4 10
skydarc 0:4907da2299a4 11
skydarc 0:4907da2299a4 12 IQS5xx::IQS5xx(PinName sda, PinName scl, PinName rdy) : i2c_(*reinterpret_cast<I2C*>(i2cRaw)), _readyPin(rdy) {
skydarc 0:4907da2299a4 13
skydarc 0:4907da2299a4 14 // Placement new to avoid additional heap memory allocation.
skydarc 0:4907da2299a4 15 new(i2cRaw) I2C(sda, scl);
skydarc 0:4907da2299a4 16
skydarc 0:4907da2299a4 17 //_readyPin.input();
skydarc 0:4907da2299a4 18 }
skydarc 0:4907da2299a4 19
skydarc 0:4907da2299a4 20 //*****************************************************************************
skydarc 0:4907da2299a4 21 //
skydarc 0:4907da2299a4 22 //! Acknowledge the reset flag
skydarc 0:4907da2299a4 23 //!
skydarc 0:4907da2299a4 24 //! This function simply sets the ACK_RESET bit found in the SYSTEM_CONTROL_0
skydarc 0:4907da2299a4 25 //! register. By setting this bit the SHOW_RESET flag is cleared in the
skydarc 0:4907da2299a4 26 //! SYSTEM_INFO_0 register. During normal operation, the SHOW_RESET bit can be
skydarc 0:4907da2299a4 27 //! monitored and if it becomes set, then an unexpected reset has occurred.
skydarc 0:4907da2299a4 28 //! If any device configuration is needed, it must then be repeated.
skydarc 0:4907da2299a4 29 //!
skydarc 0:4907da2299a4 30 //! \param None
skydarc 0:4907da2299a4 31 //!
skydarc 0:4907da2299a4 32 //! \return None
skydarc 0:4907da2299a4 33 //
skydarc 0:4907da2299a4 34 //*****************************************************************************
skydarc 0:4907da2299a4 35 void IQS5xx::AcknowledgeReset(void) {
skydarc 0:4907da2299a4 36 static uint8_t System_ctrl_0 = ACK_RESET;
skydarc 0:4907da2299a4 37
skydarc 0:4907da2299a4 38 I2C_Write(SystemControl0_adr, &System_ctrl_0, 1);
skydarc 0:4907da2299a4 39 }
skydarc 0:4907da2299a4 40
skydarc 0:4907da2299a4 41 void IQS5xx::checkVersion(void) {
skydarc 0:4907da2299a4 42
skydarc 0:4907da2299a4 43 uint8_t ui8DataBuffer[15]; // defaut size : 6
skydarc 0:4907da2299a4 44 //
skydarc 0:4907da2299a4 45 // Dont wait for RDY here, since the device could be in EventMode, and then
skydarc 0:4907da2299a4 46 // there will be no communication window to complete this. Rather do a
skydarc 0:4907da2299a4 47 // forced communication, where clock stretching will be done on the IQS5xx
skydarc 0:4907da2299a4 48 // until an appropriate time to complete the i2c.
skydarc 0:4907da2299a4 49 //
skydarc 0:4907da2299a4 50 I2C_Read(ProductNumber_adr, &ui8DataBuffer[0] ,6);
skydarc 0:4907da2299a4 51
skydarc 0:4907da2299a4 52 printf("Product %d ", (ui8DataBuffer[0]<<8) + ui8DataBuffer[1]);
skydarc 0:4907da2299a4 53 printf("Project %d ", (ui8DataBuffer[2]<<8) + ui8DataBuffer[3]);
skydarc 0:4907da2299a4 54 printf("Version %d.%d\n", ui8DataBuffer[4], ui8DataBuffer[5]);
skydarc 0:4907da2299a4 55
skydarc 0:4907da2299a4 56 ////////////////////////
skydarc 0:4907da2299a4 57 // check other address :
skydarc 0:4907da2299a4 58 ////////////////////////
skydarc 2:bd4b620316aa 59
skydarc 2:bd4b620316aa 60 // System Config 1
skydarc 2:bd4b620316aa 61 ui8DataBuffer[0] = 3;
skydarc 2:bd4b620316aa 62 I2C_Write(SystemConfig1_adr, &ui8DataBuffer[0] ,1);
skydarc 2:bd4b620316aa 63 I2C_Read(SystemConfig1_adr, &ui8DataBuffer[0] ,1);
skydarc 2:bd4b620316aa 64 printf("System Config : %d\n", ui8DataBuffer[0]);
skydarc 0:4907da2299a4 65
skydarc 0:4907da2299a4 66 // swipe initial distance
skydarc 2:bd4b620316aa 67 ui8DataBuffer[1] = 150; ui8DataBuffer[0] = 0;
skydarc 0:4907da2299a4 68 I2C_Write(SwipeInitDistance_adr, &ui8DataBuffer[0] ,2);
skydarc 0:4907da2299a4 69 I2C_Read(SwipeInitDistance_adr, &ui8DataBuffer[0] ,2);
skydarc 0:4907da2299a4 70 printf("Swp init dist. : %d\n", (ui8DataBuffer[0]<<8) + ui8DataBuffer[1]);
skydarc 0:4907da2299a4 71
skydarc 2:bd4b620316aa 72 // X resolution
skydarc 2:bd4b620316aa 73 ui8DataBuffer[1] = 0; ui8DataBuffer[0] = 8;
skydarc 2:bd4b620316aa 74 I2C_Write(XResolution_adr, &ui8DataBuffer[0] ,2);
skydarc 2:bd4b620316aa 75 I2C_Read(XResolution_adr, &ui8DataBuffer[0] ,2);
skydarc 2:bd4b620316aa 76 printf("X resolution : %d\n", (ui8DataBuffer[0]<<8) + ui8DataBuffer[1]);
skydarc 2:bd4b620316aa 77
skydarc 2:bd4b620316aa 78 // Yresolution
skydarc 2:bd4b620316aa 79 ui8DataBuffer[1] = 0; ui8DataBuffer[0] = 8;
skydarc 2:bd4b620316aa 80 I2C_Write(YResolution_adr, &ui8DataBuffer[0] ,2);
skydarc 2:bd4b620316aa 81 I2C_Read(YResolution_adr, &ui8DataBuffer[0] ,2);
skydarc 2:bd4b620316aa 82 printf("Y resolution : %d\n", (ui8DataBuffer[0]<<8) + ui8DataBuffer[1]);
skydarc 2:bd4b620316aa 83
skydarc 0:4907da2299a4 84 // Rx mapping
skydarc 0:4907da2299a4 85 I2C_Read(RxMapping_adr, &ui8DataBuffer[0] ,10);
skydarc 0:4907da2299a4 86 printf("mapping Rx :");
skydarc 0:4907da2299a4 87 printf(" %d,", ui8DataBuffer[0]);
skydarc 0:4907da2299a4 88 printf(" %d,", ui8DataBuffer[1]);
skydarc 0:4907da2299a4 89 printf(" %d,", ui8DataBuffer[2]);
skydarc 0:4907da2299a4 90 printf(" %d,", ui8DataBuffer[3]);
skydarc 0:4907da2299a4 91 printf(" %d,", ui8DataBuffer[4]);
skydarc 0:4907da2299a4 92 printf(" %d,", ui8DataBuffer[5]);
skydarc 0:4907da2299a4 93 printf(" %d,", ui8DataBuffer[6]);
skydarc 0:4907da2299a4 94 printf(" %d\n", ui8DataBuffer[7]);
skydarc 0:4907da2299a4 95
skydarc 0:4907da2299a4 96 // Tx mapping
skydarc 0:4907da2299a4 97 I2C_Read(TxMapping_adr, &ui8DataBuffer[0] ,10);
skydarc 0:4907da2299a4 98 printf("mapping Tx :");
skydarc 0:4907da2299a4 99 printf(" %d,", ui8DataBuffer[0]);
skydarc 0:4907da2299a4 100 printf(" %d,", ui8DataBuffer[1]);
skydarc 0:4907da2299a4 101 printf(" %d,", ui8DataBuffer[2]);
skydarc 0:4907da2299a4 102 printf(" %d,", ui8DataBuffer[3]);
skydarc 0:4907da2299a4 103 printf(" %d,", ui8DataBuffer[4]);
skydarc 0:4907da2299a4 104 printf(" %d,", ui8DataBuffer[5]);
skydarc 0:4907da2299a4 105 printf(" %d,", ui8DataBuffer[6]);
skydarc 0:4907da2299a4 106 printf(" %d\n", ui8DataBuffer[7]);
skydarc 0:4907da2299a4 107
skydarc 0:4907da2299a4 108 // total chanel Rx
skydarc 2:bd4b620316aa 109 ui8DataBuffer[0] = 3;
skydarc 2:bd4b620316aa 110 I2C_Write(TotalRx_adr, &ui8DataBuffer[0] ,1);
skydarc 0:4907da2299a4 111 I2C_Read(TotalRx_adr, &ui8DataBuffer[0] ,1);
skydarc 0:4907da2299a4 112 printf("nombre cannaux Rx : %d\n", ui8DataBuffer[0]);
skydarc 0:4907da2299a4 113
skydarc 0:4907da2299a4 114 // total chanel Tx
skydarc 2:bd4b620316aa 115 ui8DataBuffer[0] = 4;
skydarc 2:bd4b620316aa 116 I2C_Write(TotalTx_adr, &ui8DataBuffer[0] ,1);
skydarc 0:4907da2299a4 117 I2C_Read(TotalTx_adr, &ui8DataBuffer[0] ,1);
skydarc 0:4907da2299a4 118 printf("nombre cannaux Tx : %d\n", ui8DataBuffer[0]);
skydarc 0:4907da2299a4 119 }
skydarc 0:4907da2299a4 120
skydarc 0:4907da2299a4 121 //*****************************************************************************
skydarc 0:4907da2299a4 122 //
skydarc 0:4907da2299a4 123 //! Display a snap state change
skydarc 0:4907da2299a4 124 //!
skydarc 0:4907da2299a4 125 //! If the state of any snap output has changed, then this function can be used
skydarc 0:4907da2299a4 126 //! to display which Rx/Tx channel has changed status.
skydarc 0:4907da2299a4 127 //!
skydarc 0:4907da2299a4 128 //! \param None
skydarc 0:4907da2299a4 129 //!
skydarc 0:4907da2299a4 130 //! \return None
skydarc 0:4907da2299a4 131 //
skydarc 0:4907da2299a4 132 //*****************************************************************************
skydarc 0:4907da2299a4 133 void IQS5xx::DisplaySnap(void)
skydarc 0:4907da2299a4 134 {
skydarc 0:4907da2299a4 135 uint8_t ui8Tx, ui8Rx;
skydarc 0:4907da2299a4 136 uint16_t ui16ToggledBits;
skydarc 0:4907da2299a4 137
skydarc 0:4907da2299a4 138 for(ui8Tx = 0; ui8Tx < 15; ui8Tx++)
skydarc 0:4907da2299a4 139 {
skydarc 0:4907da2299a4 140 ui16ToggledBits = ui16PrevSnap[ui8Tx] ^ ui16SnapStatus[ui8Tx];
skydarc 0:4907da2299a4 141
skydarc 0:4907da2299a4 142 for(ui8Rx = 0; ui8Rx < 10; ui8Rx++)
skydarc 0:4907da2299a4 143 {
skydarc 0:4907da2299a4 144 if(BitIsSet(ui16ToggledBits, ui8Rx))
skydarc 0:4907da2299a4 145 {
skydarc 0:4907da2299a4 146 if(BitIsSet(ui16SnapStatus[ui8Tx], ui8Rx))
skydarc 0:4907da2299a4 147 {
skydarc 0:4907da2299a4 148 printf("Snap set on Rx:");
skydarc 0:4907da2299a4 149 }
skydarc 0:4907da2299a4 150 else
skydarc 0:4907da2299a4 151 {
skydarc 0:4907da2299a4 152 printf("Snap released on Rx:");
skydarc 0:4907da2299a4 153 }
skydarc 0:4907da2299a4 154 printf(" %d / Tx: %d channel \n", ui8Rx, ui8Tx);
skydarc 0:4907da2299a4 155 }
skydarc 0:4907da2299a4 156 }
skydarc 0:4907da2299a4 157 }
skydarc 0:4907da2299a4 158 }
skydarc 0:4907da2299a4 159
skydarc 0:4907da2299a4 160 //*****************************************************************************
skydarc 0:4907da2299a4 161 //
skydarc 0:4907da2299a4 162 //! Process the data received
skydarc 0:4907da2299a4 163 //!
skydarc 0:4907da2299a4 164 //! This function sorts the read bytes from the IQS5xx and prints relevant data
skydarc 0:4907da2299a4 165 //! on serial port.
skydarc 0:4907da2299a4 166 //! REL_X[n]: Relative X Position of the finger n; n is from (1 to 5)
skydarc 0:4907da2299a4 167 //! REL_Y[n]: Relative X Position of the finger n; n is from (1 to 5)
skydarc 0:4907da2299a4 168 //! ABS_X[n]: Absolute X Position of the finger n; n is from (1 to 5)
skydarc 0:4907da2299a4 169 //! ABS_Y[n]: Absolute Y Position of the finger n; n is from (1 to 5)
skydarc 0:4907da2299a4 170 //! ui16TouchStrength[n] : Touch strength of finger n; n is from (1 to 5)
skydarc 0:4907da2299a4 171 //! ui8Area[n] : Touch area of finger n; this is number of channels under touch
skydarc 0:4907da2299a4 172 //! for a particular finger;
skydarc 0:4907da2299a4 173 //! Where 'n' is from (1 to 5)
skydarc 0:4907da2299a4 174 //!
skydarc 0:4907da2299a4 175 //! \param None
skydarc 0:4907da2299a4 176 //!
skydarc 0:4907da2299a4 177 //! \return None
skydarc 0:4907da2299a4 178 //
skydarc 0:4907da2299a4 179 //*****************************************************************************
skydarc 0:4907da2299a4 180 void IQS5xx::Process_XY(void)
skydarc 0:4907da2299a4 181 {
skydarc 0:4907da2299a4 182 uint8_t i;
skydarc 0:4907da2299a4 183 static uint8_t ui8FirstTouch = 0;
skydarc 0:4907da2299a4 184 uint8_t ui8NoOfFingers;
skydarc 0:4907da2299a4 185 uint8_t ui8SystemFlags[2];
skydarc 0:4907da2299a4 186 int16_t i16RelX[6];
skydarc 0:4907da2299a4 187 int16_t i16RelY[6];
skydarc 0:4907da2299a4 188 uint16_t ui16AbsX[6];
skydarc 0:4907da2299a4 189 uint16_t ui16AbsY[6];
skydarc 0:4907da2299a4 190 uint16_t ui16TouchStrength[6];
skydarc 0:4907da2299a4 191 uint8_t ui8Area[6];
skydarc 0:4907da2299a4 192
skydarc 0:4907da2299a4 193 ui8SystemFlags[0] = Data_Buff[2];
skydarc 0:4907da2299a4 194 ui8SystemFlags[1] = Data_Buff[3];
skydarc 0:4907da2299a4 195 ui8NoOfFingers = Data_Buff[4];
skydarc 0:4907da2299a4 196 //
skydarc 0:4907da2299a4 197 // Re-initialize the device if unexpected RESET detected
skydarc 0:4907da2299a4 198 //
skydarc 0:4907da2299a4 199 if((ui8SystemFlags[0] & SHOW_RESET) != 0)
skydarc 0:4907da2299a4 200 {
skydarc 2:bd4b620316aa 201 printf("RESET DETECTED\n");
skydarc 0:4907da2299a4 202 AcknowledgeReset();
skydarc 0:4907da2299a4 203 return;
skydarc 0:4907da2299a4 204 }
skydarc 0:4907da2299a4 205
skydarc 0:4907da2299a4 206 if((ui8SystemFlags[1] & SNAP_TOGGLE) != 0)
skydarc 0:4907da2299a4 207 {
skydarc 0:4907da2299a4 208 // A snap state has changed, thus indicate which channel
skydarc 0:4907da2299a4 209 //
skydarc 0:4907da2299a4 210 DisplaySnap();
skydarc 0:4907da2299a4 211 return;
skydarc 0:4907da2299a4 212 }
skydarc 0:4907da2299a4 213
skydarc 0:4907da2299a4 214 if((Data_Buff[0]) == SINGLE_TAP)
skydarc 0:4907da2299a4 215 {
skydarc 0:4907da2299a4 216 printf("Single Tap \n");
skydarc 0:4907da2299a4 217 }
skydarc 0:4907da2299a4 218 else if((Data_Buff[1]) == TWO_FINGER_TAP)
skydarc 0:4907da2299a4 219 {
skydarc 0:4907da2299a4 220 printf("2 Finger Tap\n");
skydarc 0:4907da2299a4 221 }
skydarc 0:4907da2299a4 222
skydarc 0:4907da2299a4 223 if(ui8NoOfFingers != 0)
skydarc 0:4907da2299a4 224 {
skydarc 0:4907da2299a4 225 if (!(ui8FirstTouch))
skydarc 0:4907da2299a4 226 {
skydarc 0:4907da2299a4 227 printf("Gestures: \n");
skydarc 0:4907da2299a4 228 //printf(" RelX: ");
skydarc 0:4907da2299a4 229 //printf("RelY: ");
skydarc 0:4907da2299a4 230 //printf("Fig: ");
skydarc 0:4907da2299a4 231 //printf("X1: "); printf("Y1: "); printf("TS1: "); printf("TA1: ");
skydarc 0:4907da2299a4 232 //printf("X2: "); printf("Y2: "); printf("TS2: "); printf("TA2:\n");
skydarc 0:4907da2299a4 233 //printf("X3: "); printf("Y3: "); printf("TS3: "); printf("TA3: ");
skydarc 0:4907da2299a4 234 //printf("X4: "); printf("Y4: "); printf("TS4: "); printf("TA4: ");
skydarc 0:4907da2299a4 235 //printf("X5: "); printf("Y5: "); printf("TS5: "); printf("TA5: \n");
skydarc 0:4907da2299a4 236 ui8FirstTouch = 1;
skydarc 0:4907da2299a4 237 }
skydarc 0:4907da2299a4 238
skydarc 0:4907da2299a4 239 switch (Data_Buff[0])
skydarc 0:4907da2299a4 240 {
skydarc 0:4907da2299a4 241 case SINGLE_TAP : printf("Single Tap \n");
skydarc 0:4907da2299a4 242 break;
skydarc 0:4907da2299a4 243 case TAP_AND_HOLD : printf("Tap & Hold \n");
skydarc 0:4907da2299a4 244 break;
skydarc 0:4907da2299a4 245 case SWIPE_X_NEG : printf("Swipe X- \n");
skydarc 0:4907da2299a4 246 break;
skydarc 0:4907da2299a4 247 case SWIPE_X_POS : printf("Swipe X+ \n");
skydarc 0:4907da2299a4 248 break;
skydarc 0:4907da2299a4 249 case SWIPE_Y_POS : printf("Swipe Y+ \n");
skydarc 0:4907da2299a4 250 break;
skydarc 0:4907da2299a4 251 case SWIPE_Y_NEG : printf("Swipe Y- \n");
skydarc 0:4907da2299a4 252 break;
skydarc 0:4907da2299a4 253 }
skydarc 0:4907da2299a4 254
skydarc 0:4907da2299a4 255 switch (Data_Buff[1])
skydarc 0:4907da2299a4 256 {
skydarc 0:4907da2299a4 257 case TWO_FINGER_TAP : printf("2 Finger Tap\n");
skydarc 0:4907da2299a4 258 break;
skydarc 0:4907da2299a4 259 case SCROLL : printf("Scroll \n");
skydarc 0:4907da2299a4 260 break;
skydarc 0:4907da2299a4 261 case ZOOM : printf("Zoom \n");
skydarc 0:4907da2299a4 262 break;
skydarc 0:4907da2299a4 263 }
skydarc 0:4907da2299a4 264 if((Data_Buff[0] | Data_Buff[1]) == 0)
skydarc 0:4907da2299a4 265 {
skydarc 0:4907da2299a4 266 //printf(" ");
skydarc 0:4907da2299a4 267 }
skydarc 0:4907da2299a4 268
skydarc 0:4907da2299a4 269 /*i16RelX[1] = ((Data_Buff[5] << 8) | (Data_Buff[6]));
skydarc 0:4907da2299a4 270 i16RelY[1] = ((Data_Buff[7] << 8) | (Data_Buff[8]));
skydarc 0:4907da2299a4 271
skydarc 0:4907da2299a4 272 Print_signed(i16RelX[1]);
skydarc 0:4907da2299a4 273 Print_signed(i16RelY[1]);
skydarc 0:4907da2299a4 274 Print_unsigned(ui8NoOfFingers);
skydarc 0:4907da2299a4 275
skydarc 0:4907da2299a4 276 for (i = 0; i < 2; i++)
skydarc 0:4907da2299a4 277 {
skydarc 0:4907da2299a4 278 ui16AbsX[i+1] = ((Data_Buff[(7*i)+9] << 8) | (Data_Buff[(7*i)+10])); //9-16-23-30-37//10-17-24-31-38
skydarc 0:4907da2299a4 279 ui16AbsY[i+1] = ((Data_Buff[(7*i)+11] << 8) | (Data_Buff[(7*i)+12])); //11-18-25-32-39//12-19-26-33-40
skydarc 0:4907da2299a4 280 ui16TouchStrength[i+1] = ((Data_Buff[(7*i)+13] << 8) | (Data_Buff[(7*i)+14])); //13-20-27-34-11/14-21-28-35-42
skydarc 0:4907da2299a4 281 ui8Area[i+1] = (Data_Buff[7*i+15]); //15-22-29-36-43
skydarc 0:4907da2299a4 282
skydarc 0:4907da2299a4 283 Print_unsigned(ui16AbsX[i+1]);
skydarc 0:4907da2299a4 284 Print_unsigned(ui16AbsY[i+1]);
skydarc 0:4907da2299a4 285 Print_unsigned(ui16TouchStrength[i+1]);
skydarc 0:4907da2299a4 286 Print_unsigned(ui8Area[i+1]);
skydarc 0:4907da2299a4 287 }
skydarc 0:4907da2299a4 288 printf("");*/
skydarc 0:4907da2299a4 289 }
skydarc 0:4907da2299a4 290 else
skydarc 0:4907da2299a4 291 {
skydarc 0:4907da2299a4 292 ui8FirstTouch = 0;
skydarc 0:4907da2299a4 293 }
skydarc 0:4907da2299a4 294 }
skydarc 0:4907da2299a4 295
skydarc 0:4907da2299a4 296 //*****************************************************************************
skydarc 0:4907da2299a4 297 //
skydarc 0:4907da2299a4 298 //! Terminate communication window
skydarc 0:4907da2299a4 299 //!
skydarc 0:4907da2299a4 300 //! The IQS5xx B000 does not close the communication window on the reception of
skydarc 0:4907da2299a4 301 //! the STOP bit; therefore this function sends the END COMMUNICATION WINDOW
skydarc 0:4907da2299a4 302 //! COMMAND (Please see datasheet for more information). RDY will go low after
skydarc 0:4907da2299a4 303 //! receiving any write to 0xEEEE followed by a STOP.
skydarc 0:4907da2299a4 304 //!
skydarc 0:4907da2299a4 305 //! \param None
skydarc 0:4907da2299a4 306 //!
skydarc 0:4907da2299a4 307 //! \return None
skydarc 0:4907da2299a4 308 //
skydarc 0:4907da2299a4 309 //*****************************************************************************
skydarc 0:4907da2299a4 310 void IQS5xx::Close_Comms()
skydarc 0:4907da2299a4 311 {
skydarc 0:4907da2299a4 312 uint8_t ui8DataBuffer[1];
skydarc 0:4907da2299a4 313
skydarc 0:4907da2299a4 314 I2C_Write(END_WINDOW, &ui8DataBuffer[0], 1);
skydarc 0:4907da2299a4 315 }
skydarc 0:4907da2299a4 316
skydarc 0:4907da2299a4 317 //*****************************************************************************
skydarc 0:4907da2299a4 318 //
skydarc 0:4907da2299a4 319 //! I2C write function
skydarc 0:4907da2299a4 320 //!
skydarc 0:4907da2299a4 321 //! This function writes the provided data to the address specified. If
skydarc 0:4907da2299a4 322 //! anything in the write process is not successful, then it will be repeated
skydarc 0:4907da2299a4 323 //! up till four more times. If still not successful, it will write an error
skydarc 0:4907da2299a4 324 //! message on the serial terminal.
skydarc 0:4907da2299a4 325 //!
skydarc 0:4907da2299a4 326 //! \param ui16RegisterAddress is the 16-bit memory map address on the IQS5xx
skydarc 0:4907da2299a4 327 //! \param pData is a pointer to the first byte of a block of data to write
skydarc 0:4907da2299a4 328 //! \param ui8NoOfBytes indicates how many bytes of data to write
skydarc 0:4907da2299a4 329 //!
skydarc 0:4907da2299a4 330 //! \return Boolean indicating success/fail of write attempt
skydarc 0:4907da2299a4 331 //
skydarc 0:4907da2299a4 332 //*****************************************************************************
skydarc 0:4907da2299a4 333 uint8_t IQS5xx::I2C_Write(uint16_t ui16RegisterAddress, uint8_t *pData, uint8_t ui8NoOfBytes) {
skydarc 0:4907da2299a4 334
skydarc 0:4907da2299a4 335 uint8_t ui8Retry = 4;
skydarc 0:4907da2299a4 336
skydarc 0:4907da2299a4 337 ui8Success = I2C_Write2(ui16RegisterAddress, pData, ui8NoOfBytes);
skydarc 0:4907da2299a4 338
skydarc 0:4907da2299a4 339 //
skydarc 0:4907da2299a4 340 // If comms was not successful, retry 4 more times
skydarc 0:4907da2299a4 341 //
skydarc 0:4907da2299a4 342 while((!ui8Success) && (ui8Retry != 0))
skydarc 0:4907da2299a4 343 {
skydarc 0:4907da2299a4 344 wait_ms(5);
skydarc 0:4907da2299a4 345 ui8Success = I2C_Write2(ui16RegisterAddress, pData, ui8NoOfBytes);
skydarc 0:4907da2299a4 346 ui8Retry--;
skydarc 0:4907da2299a4 347 }
skydarc 0:4907da2299a4 348
skydarc 0:4907da2299a4 349 if(ui8Success) return(true);
skydarc 0:4907da2299a4 350 else {
skydarc 0:4907da2299a4 351 printf("Comms write error\n");
skydarc 0:4907da2299a4 352 return(false);
skydarc 0:4907da2299a4 353 }
skydarc 0:4907da2299a4 354 }
skydarc 0:4907da2299a4 355
skydarc 0:4907da2299a4 356 //*****************************************************************************
skydarc 0:4907da2299a4 357 //
skydarc 0:4907da2299a4 358 //! I2C read function
skydarc 0:4907da2299a4 359 //!
skydarc 0:4907da2299a4 360 //! This function reads data from the address specified and stores this data
skydarc 0:4907da2299a4 361 //! in the area provided by the pointer. If anything in the read process is
skydarc 0:4907da2299a4 362 //! not successful, then it will be repeated up till four more times.
skydarc 0:4907da2299a4 363 //! If still not successful, it will write an error message on the serial
skydarc 0:4907da2299a4 364 //! terminal.
skydarc 0:4907da2299a4 365 //!
skydarc 0:4907da2299a4 366 //! \param ui16RegisterAddress is the 16-bit memory map address on the IQS5xx
skydarc 0:4907da2299a4 367 //! \param pData is a pointer to where the read data must be stored
skydarc 0:4907da2299a4 368 //! \param ui8NoOfBytes indicates how many bytes of data to read
skydarc 0:4907da2299a4 369 //!
skydarc 0:4907da2299a4 370 //! \return Boolean indicating success/fail of read attempt
skydarc 0:4907da2299a4 371 //
skydarc 0:4907da2299a4 372 //*****************************************************************************
skydarc 0:4907da2299a4 373 uint8_t IQS5xx::I2C_Read(uint16_t ui16RegisterAddress, uint8_t *pData, uint8_t ui8NoOfBytes) {
skydarc 0:4907da2299a4 374
skydarc 0:4907da2299a4 375 uint8_t ui8Retry = 4;
skydarc 0:4907da2299a4 376
skydarc 0:4907da2299a4 377 ui8Success = I2C_Read2(ui16RegisterAddress, pData, ui8NoOfBytes);
skydarc 0:4907da2299a4 378
skydarc 0:4907da2299a4 379 //
skydarc 0:4907da2299a4 380 // If comms was not successful, retry 4 more times
skydarc 0:4907da2299a4 381 //
skydarc 0:4907da2299a4 382 while((!ui8Success) && (ui8Retry != 0)) {
skydarc 0:4907da2299a4 383 wait_ms(5);
skydarc 0:4907da2299a4 384 ui8Success = I2C_Read2(ui16RegisterAddress, pData, ui8NoOfBytes);
skydarc 0:4907da2299a4 385 ui8Retry--;
skydarc 0:4907da2299a4 386 }
skydarc 0:4907da2299a4 387
skydarc 0:4907da2299a4 388 if(ui8Success) return(true);
skydarc 0:4907da2299a4 389 else {
skydarc 0:4907da2299a4 390 printf("Comms read error\n");
skydarc 0:4907da2299a4 391 return(false);
skydarc 0:4907da2299a4 392 }
skydarc 0:4907da2299a4 393 }
skydarc 0:4907da2299a4 394
skydarc 0:4907da2299a4 395 uint8_t IQS5xx::I2C_Write2(uint16_t ui16RegisterAddress, uint8_t *pData, uint8_t ui8NoOfBytes)
skydarc 0:4907da2299a4 396 {
skydarc 0:4907da2299a4 397 uint8_t i;
skydarc 0:4907da2299a4 398
skydarc 0:4907da2299a4 399 i2c_.start();
skydarc 0:4907da2299a4 400
skydarc 0:4907da2299a4 401 if(i2c_.write(IQS5xx_ADDR<<1) == false) return(false);
skydarc 0:4907da2299a4 402
skydarc 0:4907da2299a4 403 if(i2c_.write((uint8_t)(ui16RegisterAddress>>8)) == false) return(false);
skydarc 0:4907da2299a4 404 if(i2c_.write((uint8_t)ui16RegisterAddress) == false) return(false);
skydarc 0:4907da2299a4 405
skydarc 0:4907da2299a4 406 for(i = 0; i < ui8NoOfBytes; i++) {
skydarc 0:4907da2299a4 407 if(i2c_.write(*pData) == false) return(false);
skydarc 0:4907da2299a4 408 pData++;
skydarc 0:4907da2299a4 409 }
skydarc 0:4907da2299a4 410
skydarc 0:4907da2299a4 411 i2c_.stop();
skydarc 0:4907da2299a4 412
skydarc 0:4907da2299a4 413 return(true);
skydarc 0:4907da2299a4 414 }
skydarc 0:4907da2299a4 415
skydarc 0:4907da2299a4 416 uint8_t IQS5xx::I2C_Read2(uint16_t ui16RegisterAddress, uint8_t *pData, uint8_t ui8NoOfBytes) {
skydarc 0:4907da2299a4 417
skydarc 0:4907da2299a4 418 uint8_t i;
skydarc 0:4907da2299a4 419
skydarc 0:4907da2299a4 420 if(ui8NoOfBytes == 0) ui8NoOfBytes++;
skydarc 0:4907da2299a4 421
skydarc 0:4907da2299a4 422 i2c_.start();
skydarc 0:4907da2299a4 423
skydarc 0:4907da2299a4 424 if(i2c_.write(IQS5xx_ADDR<<1) == false) return(false);
skydarc 0:4907da2299a4 425
skydarc 0:4907da2299a4 426 if(i2c_.write((uint8_t)(ui16RegisterAddress>>8)) == false) return(false);
skydarc 0:4907da2299a4 427 if(i2c_.write((uint8_t)ui16RegisterAddress) == false) return(false);
skydarc 0:4907da2299a4 428
skydarc 0:4907da2299a4 429 i2c_.start();
skydarc 0:4907da2299a4 430
skydarc 0:4907da2299a4 431 if(i2c_.write((IQS5xx_ADDR<<1) + 0x01) == false) return(false);
skydarc 0:4907da2299a4 432
skydarc 0:4907da2299a4 433 for(i = 0; i < ui8NoOfBytes; i++)
skydarc 0:4907da2299a4 434 {
skydarc 0:4907da2299a4 435 if(i == (ui8NoOfBytes - 1)) {
skydarc 0:4907da2299a4 436 *pData = i2c_.read(0);
skydarc 0:4907da2299a4 437 }
skydarc 0:4907da2299a4 438 else {
skydarc 0:4907da2299a4 439 *pData = i2c_.read(1);
skydarc 0:4907da2299a4 440 }
skydarc 0:4907da2299a4 441 pData++;
skydarc 0:4907da2299a4 442 }
skydarc 0:4907da2299a4 443
skydarc 0:4907da2299a4 444 i2c_.stop();
skydarc 0:4907da2299a4 445
skydarc 0:4907da2299a4 446 return(true);
skydarc 0:4907da2299a4 447 }
skydarc 0:4907da2299a4 448
skydarc 0:4907da2299a4 449 //*****************************************************************************
skydarc 0:4907da2299a4 450 //
skydarc 0:4907da2299a4 451 //! Print a signed value on serial display
skydarc 0:4907da2299a4 452 //!
skydarc 0:4907da2299a4 453 //! Print the signed integer on the serial port with adjusted tabs
skydarc 0:4907da2299a4 454 //! on serial port for easy column reading.
skydarc 0:4907da2299a4 455 //!
skydarc 0:4907da2299a4 456 //! \param None
skydarc 0:4907da2299a4 457 //!
skydarc 0:4907da2299a4 458 //! \return None
skydarc 0:4907da2299a4 459 //
skydarc 0:4907da2299a4 460 //*****************************************************************************
skydarc 0:4907da2299a4 461 void IQS5xx::Print_signed(int16_t i16Num)
skydarc 0:4907da2299a4 462 {
skydarc 0:4907da2299a4 463 if(i16Num < (-99))
skydarc 0:4907da2299a4 464 {
skydarc 0:4907da2299a4 465 printf(" ");
skydarc 0:4907da2299a4 466 }
skydarc 0:4907da2299a4 467 else if(i16Num < (-9))
skydarc 0:4907da2299a4 468 {
skydarc 0:4907da2299a4 469 printf(" ");
skydarc 0:4907da2299a4 470 }
skydarc 0:4907da2299a4 471 else if(i16Num < 0)
skydarc 0:4907da2299a4 472 {
skydarc 0:4907da2299a4 473 printf(" ");
skydarc 0:4907da2299a4 474 }
skydarc 0:4907da2299a4 475 else if(i16Num < 10)
skydarc 0:4907da2299a4 476 {
skydarc 0:4907da2299a4 477 printf(" ");
skydarc 0:4907da2299a4 478 }
skydarc 0:4907da2299a4 479 else if(i16Num < 100)
skydarc 0:4907da2299a4 480 {
skydarc 0:4907da2299a4 481 printf(" ");
skydarc 0:4907da2299a4 482 }
skydarc 0:4907da2299a4 483 else if(i16Num < 1000)
skydarc 0:4907da2299a4 484 {
skydarc 0:4907da2299a4 485 printf(" ");
skydarc 0:4907da2299a4 486 }
skydarc 0:4907da2299a4 487 printf("%d", i16Num);
skydarc 0:4907da2299a4 488 }
skydarc 0:4907da2299a4 489
skydarc 0:4907da2299a4 490 //*****************************************************************************
skydarc 0:4907da2299a4 491 //
skydarc 0:4907da2299a4 492 //! Print an unsigned value on serial display
skydarc 0:4907da2299a4 493 //!
skydarc 0:4907da2299a4 494 //! Print the unsigned integer on the serial port with adjusted tabs
skydarc 0:4907da2299a4 495 //! on serial port for easy column reading.
skydarc 0:4907da2299a4 496 //!
skydarc 0:4907da2299a4 497 //! \param None
skydarc 0:4907da2299a4 498 //!
skydarc 0:4907da2299a4 499 //! \return None
skydarc 0:4907da2299a4 500 //
skydarc 0:4907da2299a4 501 //*****************************************************************************
skydarc 0:4907da2299a4 502 void IQS5xx::Print_unsigned(uint16_t ui16Num)
skydarc 0:4907da2299a4 503 {
skydarc 0:4907da2299a4 504 if(ui16Num < 10)
skydarc 0:4907da2299a4 505 {
skydarc 0:4907da2299a4 506 printf(" ");
skydarc 0:4907da2299a4 507 }
skydarc 0:4907da2299a4 508 else if(ui16Num < 100)
skydarc 0:4907da2299a4 509 {
skydarc 0:4907da2299a4 510 printf(" ");
skydarc 0:4907da2299a4 511 }
skydarc 0:4907da2299a4 512 else if(ui16Num < 1000)
skydarc 0:4907da2299a4 513 {
skydarc 0:4907da2299a4 514 printf(" ");
skydarc 0:4907da2299a4 515 }
skydarc 0:4907da2299a4 516 else if(ui16Num < 10000)
skydarc 0:4907da2299a4 517 {
skydarc 0:4907da2299a4 518 printf(" ");
skydarc 0:4907da2299a4 519 }
skydarc 0:4907da2299a4 520
skydarc 0:4907da2299a4 521 if(ui16Num > 10000)
skydarc 0:4907da2299a4 522 {
skydarc 0:4907da2299a4 523 printf(" xxx");
skydarc 0:4907da2299a4 524 }
skydarc 0:4907da2299a4 525 else
skydarc 0:4907da2299a4 526 {
skydarc 0:4907da2299a4 527 printf("%d", ui16Num);
skydarc 0:4907da2299a4 528 }
skydarc 0:4907da2299a4 529 }