8000 MPU6050 connection failed · ArduinoWorks/i2cdevlib@43cf365 · GitHub
[go: up one dir, main page]

Skip to content

Commit 43cf365

Browse files
committed
MPU6050 connection failed
1 parent cde3972 commit 43cf365

File tree

6 files changed

+4455
-887
lines changed

6 files changed

+4455
-887
lines changed

dsPIC30F/I2Cdev/I2CdevdsPic30F.X/nbproject/Makefile-genesis.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#
2-
#Wed Mar 15 15:13:12 CST 2017
2+
#Tue Apr 04 10:56:56 CST 2017
33
default.com-microchip-mplab-nbide-toolchainXC16-XC16LanguageToolchain.md5=ebaa75370c1463d650408e4144ba15de
44
default.languagetoolchain.dir=/opt/microchip/xc16/v1.30/bin
55
configurations-xml=e23099a44127c530cab293bfc5554ec5

dsPIC30F/MPU6050/Examples/MPU6050_example.X/I2Cdev.c

Lines changed: 59 additions & 156 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,34 @@ THE SOFTWARE.
3434

3535
#include "I2Cdev.h"
3636

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+
3765
/*uint16_t config2;
3866
uint16_t config1 = (I2C_ON & I2C_IDLE_CON & I2C_CLK_HLD &
3967
I2C_IPMI_DIS & I2C_7BIT_ADD &
@@ -73,7 +101,7 @@ int8_t I2Cdev_readBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_
73101
while(!IFS0bits.MI2CIF); // Wait for 9th clock cycle
74102
IFS0bits.MI2CIF = 0; // Clear interrupt flag
75103
//while(I2CSTATbits.ACKSTAT);
76-
104+
//delay_ms_I2C(10);
77105
/*Master send RA*/
78106
/* Write Register Address */
79107
MasterWriteI2C(regAddr);
@@ -84,12 +112,13 @@ int8_t I2Cdev_readBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_
84112
/*Slave send ACK*/
85113
while(!IFS0bits.MI2CIF); // Wait for 9th clock cycle
86114
IFS0bits.MI2CIF = 0; // Clear interrupt flag
87-
//while(I2CSTATbits.ACKSTAT);
115+
while(I2CSTATbits.ACKSTAT);
88116

117+
//delay_ms_I2C(10);
89118
/*Master Start*/
90-
//RestartI2C();
119+
RestartI2C();
91120
/* Wait till Start sequence is completed */
92-
//while(I2CCONbits.SEN);
121+
while(I2CCONbits.SEN);
93122

94123
/*Master send AD+R*/
95124
/* Write Slave Address (Read)*/
@@ -100,7 +129,8 @@ int8_t I2Cdev_readBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_
100129
/*Slave send Ack*/
101130
while(!IFS0bits.MI2CIF); // Wait for 9th clock cycle
102131
IFS0bits.MI2CIF = 0; // Clear interrupt flag
103-
//while(I2CSTATbits.ACKSTAT);
132+
while(I2CSTATbits.ACKSTAT);
133+
//delay_ms_I2C(10);
104134

105135
/*Slave send DATA*/
106136
//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_
113143
for (i = 1 ; i < length ; i++ ){
114144
AckI2C();
115145
while(I2CCONbits.ACKEN == 1);
146+
//delay_ms_I2C(10);
116147
data[i] = MasterReadI2C();
117148
}
118149
NotAckI2C();
@@ -144,93 +175,13 @@ int8_t I2Cdev_readByte(uint8_t devAddr, uint8_t regAddr, uint8_t *data) {
144175
* @return Number of words read (-1 indicates failure)
145176
*/
146177
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];
222183
}
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;
234185
}
235186

236187
/** 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
328279
* @return Status of operation (true = success)
329280
*/
330281
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);
332284
IFS0bits.MI2CIF = 0;
333285
IEC0bits.MI2CIE = 0;
334-
IdleI2C();
286+
//IdleI2C();
335287
/*Master Start*/
336288
StartI2C();
337289
/* Wait util Start sequence is completed */
338290
while(I2CCONbits.SEN);
339291
/* Clear interrupt flag */
340292
IFS0bits.MI2CIF = 0;
293+
//delay_ms_I2C(10);
341294

342295
/*Master send AD+W*/
343296
/* Write Slave address (Write)*/
@@ -349,6 +302,7 @@ bool I2Cdev_writeBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t
349302
while(!IFS0bits.MI2CIF); // Wait for 9th clock cycle
350303
IFS0bits.MI2CIF = 0; // Clear interrupt flag
351304
while(I2CSTATbits.ACKSTAT);
305+
//delay_ms_I2C(10);
352306

353307
/*Master send RA*/
354308
/* Write Slave address (Write)*/
@@ -359,17 +313,20 @@ bool I2Cdev_writeBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t
359313
/*Slave send ACK*/
360314
while(!IFS0bits.MI2CIF); // Wait for 9th clock cycle
361315
IFS0bits.MI2CIF = 0; // Clear interrupt flag
316+
//delay_ms_I2C(10);
362317
while(I2CSTATbits.ACKSTAT);
363318

364319
/*Master send data*/
365320
/* Transmit string of data */
366321
MasterputsI2C(data);
322+
while(!IFS0bits.MI2CIF); // Wait for 9th clock cycle
323+
IFS0bits.MI2CIF = 0; // Clear interrupt flag
367324

368325
StopI2C();
369326
/* Wait till stop sequence is completed */
370327
while(I2CCONbits.PEN);
371328
//CloseI2C();
372-
329+
IdleI2C();
373330
return true;
374331
}
375332

@@ -391,68 +348,13 @@ bool I2Cdev_writeByte(uint8_t devAddr, uint8_t regAddr, uint8_t data) {
391348
* @return Status of operation (true = success)
392349
*/
393350
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;
438356
}
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);
456358
return true;
457359
}
458360

@@ -517,7 +419,8 @@ bool I2Cdev_writeBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_
517419
data &= mask; // zero all non-important bits in data
518420
b &= ~(mask); // zero all important bits in existing byte
519421
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);
521424
} else {
522425
return false;
523426
}

0 commit comments

Comments
 (0)
0