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 12:51:18 2020 +0000
Revision:
0:4907da2299a4
Child:
2:bd4b620316aa
this is a first compil 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 t

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