@@ -34,6 +34,34 @@ THE SOFTWARE.
34
34
35
35
#include "I2Cdev.h"
36
36
37
+ /*******************************************************************************/
38
+ // delay us using for-loop
39
+ /*******************************************************************************/
40
+ void delay_us_I2C ( unsigned int usec )
41
+ {
42
+ unsigned int i ;
43
+ //¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ //40 MIPS ,
44
+ for ( i = 0 ; i < usec * 2 ;
45
+ i ++ ) { //for-loop 8Tcy -> 1us -> add two NOP()
46
+ asm("NOP" );
47
+ asm("NOP" );
48
+ }
49
+ }
50
+ /*******************************************************************************/
51
+ // delay ms using Timer 1 interrupt
52
+ /*******************************************************************************/
53
+ void delay_ms_I2C ( unsigned int msec )
54
+ {
55
+ /*TIMER1_DELAY_VALUE = msec;
56
+ TMR1 = 0;
57
+ IEC0bits.T1IE = 1;
58
+ while(TIMER1_DELAY_VALUE);
59
+ */
60
+ int i = 0 ;
61
+ for (i = 0 ; i < msec ; i ++ )
62
+ delay_us_I2C (1000 );
63
+ }
64
+
37
65
/*uint16_t config2;
38
66
uint16_t config1 = (I2C_ON & I2C_IDLE_CON & I2C_CLK_HLD &
39
67
I2C_IPMI_DIS & I2C_7BIT_ADD &
@@ -73,7 +101,7 @@ int8_t I2Cdev_readBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_
73
101
while (!IFS0bits .MI2CIF ); // Wait for 9th clock cycle
74
102
IFS0bits .MI2CIF = 0 ; // Clear interrupt flag
75
103
//while(I2CSTATbits.ACKSTAT);
76
-
104
+ //delay_ms_I2C(10);
77
105
/*Master send RA*/
78
106
/* Write Register Address */
79
107
MasterWriteI2C (regAddr );
@@ -84,12 +112,13 @@ int8_t I2Cdev_readBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_
84
112
/*Slave send ACK*/
85
113
while (!IFS0bits .MI2CIF ); // Wait for 9th clock cycle
86
114
IFS0bits .MI2CIF = 0 ; // Clear interrupt flag
87
- // while(I2CSTATbits.ACKSTAT);
115
+ while (I2CSTATbits .ACKSTAT );
88
116
117
+ //delay_ms_I2C(10);
89
118
/*Master Start*/
90
- // RestartI2C();
119
+ RestartI2C ();
91
120
/* Wait till Start sequence is completed */
92
- // while(I2CCONbits.SEN);
121
+ while (I2CCONbits .SEN );
93
122
94
123
/*Master send AD+R*/
95
124
/* Write Slave Address (Read)*/
@@ -100,7 +129,8 @@ int8_t I2Cdev_readBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_
100
129
/*Slave send Ack*/
101
130
while (!IFS0bits .MI2CIF ); // Wait for 9th clock cycle
102
131
IFS0bits .MI2CIF = 0 ; // Clear interrupt flag
103
- //while(I2CSTATbits.ACKSTAT);
132
+ while (I2CSTATbits .ACKSTAT );
133
+ //delay_ms_I2C(10);
104
134
105
135
/*Slave send DATA*/
106
136
//uint16_t flag = MastergetsI2C(length,data,I2C_DATA_WAIT);
@@ -113,6 +143,7 @@ int8_t I2Cdev_readBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_
113
143
for (i = 1 ; i < length ; i ++ ){
114
144
AckI2C ();
115
145
while (I2CCONbits .ACKEN == 1 );
146
+ //delay_ms_I2C(10);
116
147
data [i ] = MasterReadI2C ();
117
148
}
118
149
NotAckI2C ();
@@ -144,93 +175,13 @@ int8_t I2Cdev_readByte(uint8_t devAddr, uint8_t regAddr, uint8_t *data) {
144
175
* @return Number of words read (-1 indicates failure)
145
176
*/
146
177
int8_t I2Cdev_readWords (uint8_t devAddr , uint8_t regAddr , uint8_t length , uint16_t * data ) {
147
- int8_t count = 0 ;
148
- IFS0bits .MI2CIF = 0 ;
149
- IEC0bits .MI2CIE = 0 ;
150
-
151
- IdleI2C ();
152
- /*master Start*/
153
- StartI2C ();
154
- /* Clear interrupt flag */
155
-
156
- /* Wait till Start sequence is completed */
157
- while (I2CCONbits .SEN );
158
-
159
- /*AD+W*/
160
- /* Write Slave Address (Write)*/
161
- MasterWriteI2C (devAddr << 1 | 0x00 );
162
-
163
- /* Wait until address is transmitted */
164
- while (I2CSTATbits .TBF ); // 8 clock cycles
165
-
166
- /*Slave Ack*/
167
- while (!IFS0bits .MI2CIF ); // Wait for 9th clock cycle
168
- IFS0bits .MI2CIF = 0 ; // Clear interrupt flag
169
- //while(I2CSTATbits.ACKSTAT);
170
-
171
- /*master send RA*/
172
- /* Write Register Address */
173
- MasterWriteI2C (regAddr );
174
-
175
- /* Wait until address is transmitted */
176
- while (I2CSTATbits .TBF ); // 8 clock cycles
177
-
178
- /*Slave ACK*/
179
- while (!IFS0bits .MI2CIF ); // Wait for 9th clock cycle
180
- IFS0bits .MI2CIF = 0 ; // Clear interrupt flag
181
- //while(I2CSTATbits.ACKSTAT);
182
-
183
- /*master Start*/
184
- //RestartI2C();
185
- /* Wait till Start sequence is completed */
186
- //while(I2CCONbits.SEN);
187
-
188
- /*master send AD+R*/
189
- /* Write Slave Address (Read)*/
190
- MasterWriteI2C (devAddr << 1 | 0x01 );
191
- /* Wait until address is transmitted */
192
- while (I2CSTATbits .TBF ); // 8 clock cycles
193
-
194
- /*Slave Ack*/
195
- while (!IFS0bits .MI2CIF ); // Wait for 9th clock cycle
196
- IFS0bits .MI2CIF = 0 ; // Clear interrupt flag
197
- //while(I2CSTATbits.ACKSTAT);
198
-
199
- /*Read Word Sequence*/
200
- for ( count = 0 ; count < length ; count ++ ) {
201
- // First byte is bits 15-8 (MSb=15)
202
- //IdleI2C();
203
- uint8_t high_byte = MasterReadI2C ();
204
-
205
- // NACK
206
- //IdleI2C();
207
- NotAckI2C ();
208
-
209
- // Second byte is bits 7-0 (LSb=0)
210
- IdleI2C ();
211
- uint8_t lower_byte = MasterReadI2C ();
212
- data [count ] = (high_byte << 8 ) | lower_byte ;
213
- if (count == length - 1 ) {
214
- // NACK
215
- IdleI2C ();
216
- NotAckI2C ();
217
- } else {
218
- // ACK
219
- IdleI2C ();
220
- AckI2C ();
221
- }
178
+ unsigned char Onebyte [100 ];
179
+ I2Cdev_readBytes (devAddr ,regAddr ,length * 2 ,Onebyte );
180
+ unsigned int i ;
181
+ for (int i = 0 ; i < length ; i ++ ){
182
+ data [i ] = Onebyte [i * 2 ] << 8 | Onebyte [i * 2 + 1 ];
222
183
}
223
-
224
- /*Slave send NACK*/
225
- NotAckI2C ();
226
-
227
- /*master enter P*/
228
- StopI2C ();
229
- /* Wait till stop sequence is completed */
230
- while (I2CCONbits .PEN );
231
- //CloseI2C();
232
-
233
- return count ;
184
+ return length ;
234
185
}
235
186
236
187
/** Read single word from a 16-bit device register.
@@ -328,16 +279,18 @@ int8_t I2Cdev_readBitsW(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint
328
279
* @return Status of operation (true = success)
329
280
*/
330
281
bool I2Cdev_writeBytes (uint8_t devAddr , uint8_t regAddr , uint8_t length , uint8_t * data ) {
331
- //OpenI2C(config1,config2);
282
+ if (data [length - 1 ] != '\0' && length != 1 )return false;
283
+ //OpenI2C(config1,config2);
332
284
IFS0bits .MI2CIF = 0 ;
333
285
IEC0bits .MI2CIE = 0 ;
334
- IdleI2C ();
286
+ // IdleI2C();
335
287
/*Master Start*/
336
288
StartI2C ();
337
289
/* Wait util Start sequence is completed */
338
290
while (I2CCONbits .SEN );
339
291
/* Clear interrupt flag */
340
292
IFS0bits .MI2CIF = 0 ;
293
+ //delay_ms_I2C(10);
341
294
342
295
/*Master send AD+W*/
343
296
/* Write Slave address (Write)*/
@@ -349,6 +302,7 @@ bool I2Cdev_writeBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t
349
302
while (!IFS0bits .MI2CIF ); // Wait for 9th clock cycle
350
303
IFS0bits .MI2CIF = 0 ; // Clear interrupt flag
351
304
while (I2CSTATbits .ACKSTAT );
305
+ //delay_ms_I2C(10);
352
306
353
307
/*Master send RA*/
354
308
/* Write Slave address (Write)*/
@@ -359,17 +313,20 @@ bool I2Cdev_writeBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t
359
313
/*Slave send ACK*/
360
314
while (!IFS0bits .MI2CIF ); // Wait for 9th clock cycle
361
315
IFS0bits .MI2CIF = 0 ; // Clear interrupt flag
316
+ //delay_ms_I2C(10);
362
317
while (I2CSTATbits .ACKSTAT );
363
318
364
319
/*Master send data*/
365
320
/* Transmit string of data */
366
321
MasterputsI2C (data );
322
+ while (!IFS0bits .MI2CIF ); // Wait for 9th clock cycle
323
+ IFS0bits .MI2CIF = 0 ; // Clear interrupt flag
367
324
368
325
StopI2C ();
369
326
/* Wait till stop sequence is completed */
370
327
while (I2CCONbits .PEN );
371
328
//CloseI2C();
372
-
329
+ IdleI2C ();
373
330
return true;
374
331
}
375
332
@@ -391,68 +348,13 @@ bool I2Cdev_writeByte(uint8_t devAddr, uint8_t regAddr, uint8_t data) {
391
348
* @return Status of operation (true = success)
392
349
*/
393
350
bool I2Cdev_writeWords (uint8_t devAddr , uint8_t regAddr , uint8_t length , uint16_t * data ) {
394
- IFS0bits .MI2CIF = 0 ;
395
- IEC0bits .MI2CIE = 0 ;
396
- //OpenI2C(config1,config2);
397
- IdleI2C ();
398
- /*Master Start*/
399
- StartI2C ();
400
- /* Wait util Start sequence is completed */
401
- while (I2CCONbits .SEN );
402
- /* Clear interrupt flag */
403
- IFS0bits .MI2CIF = 0 ;
404
-
405
- /*Master send AD+W*/
406
- /* Write Slave address (Write)*/
407
- MasterWriteI2C (devAddr << 1 | 0x00 );
408
- /* Wait till address is transmitted */
409
- while (I2CSTATbits .TBF ); // 8 clock cycles
410
-
411
- /*Slave send ACK*/
412
- while (!IFS0bits .MI2CIF ); // Wait for 9th clock cycle
413
- IFS0bits .MI2CIF = 0 ; // Clear interrupt flag
414
- while (I2CSTATbits .ACKSTAT );
415
-
416
- /*Master send RA*/
417
- /* Write Slave address (Write)*/
418
- MasterWriteI2C (regAddr );
419
- /* Wait till address is transmitted */
420
- while (I2CSTATbits .TBF ); // 8 clock cycles
421
-
422
- /*Slave send ACK*/
423
- while (!IFS0bits .MI2CIF ); // Wait for 9th clock cycle
424
- IFS0bits .MI2CIF = 0 ; // Clear interrupt flag
425
- while (I2CSTATbits .ACKSTAT );
426
-
427
- /*Master send RA*/
428
- /* Write Slave address (Write)*/
429
- uint8_t i ;
430
- for (i = 0 ; i < length ; i ++ ) {
431
- // Send MSB
432
- IdleI2C ();
433
- MasterWriteI2C (data [i ] >> 8 );
434
-
435
- // Send LSB
436
- IdleI2C ();
437
- MasterWriteI2C (data [i ] & 0xFF );
351
+ unsigned char OneByte [100 ];
352
+ unsigned int i ;
353
+ for (i = 0 ; i < length ; i ++ ){
354
+ OneByte [i * 2 ] = data [i ]>>8 ;
355
+ OneByte [i * 2 + 1 ] = data [i ] & 0XFF ;
438
356
}
439
- /* Wait till address is transmitted */
440
- while (I2CSTATbits .TBF ); // 8 clock cycles
441
-
442
- /*Slave send ACK*/
443
- while (!IFS0bits .MI2CIF ); // Wait for 9th clock cycle
444
- IFS0bits .MI2CIF = 0 ; // Clear interrupt flag
445
- while (I2CSTATbits .ACKSTAT );
446
-
447
- /*Master send data*/
448
- /* Transmit string of data */
449
- //MasterputsI2C(data);
450
-
451
- StopI2C ();
452
- /* Wait till stop sequence is completed */
453
- while (I2CCONbits .PEN );
454
- //CloseI2C();
455
-
357
+ I2Cdev_writeBytes (devAddr ,regAddr ,length * 2 ,OneByte );
456
358
return true;
457
359
}
458
360
@@ -517,7 +419,8 @@ bool I2Cdev_writeBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_
517
419
data &= mask ; // zero all non-important bits in data
518
420
b &= ~(mask ); // zero all important bits in existing byte
519
421
b |= data ; // combine data with existing byte
520
- return I2Cdev_writeByte (devAddr , regAddr , b );
422
+ delay_ms_I2C (10 );
423
+ return I2Cdev_writeByte (devAddr , regAddr , b );
521
424
} else {
522
425
return false;
523
426
}
0 commit comments