8000 Fix I2C Read Sequence extra unused byte transmission error · ArduinoWorks/i2cdevlib@86c4e0e · GitHub
[go: up one dir, main page]

Skip to content

Commit 86c4e0e

Browse files
committed
Fix I2C Read Sequence extra unused byte transmission error
Due to extra unused byte transmission in the Read Sequence,causing I2C cannot successfully pass test_connection function. Bug discription: Predicted Reading Sequence Master |S|AD+W| |RA| |S|AD+R| | |NACK|P| Slave | | |ACK| |ACK| | |ACK|DATA| | | But,in the second Start condition,original code could cause extra byte(because using RestartI2C() function). Using StopI2C() and then StartI2C() can fix this error
1 parent 43cf365 commit 86c4e0e

File tree

5 files changed

+184
-98
lines changed

5 files changed

+184
-98
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-
#Tue Apr 04 10:56:56 CST 2017
2+
#Tue Apr 04 21:56:23 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: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ int8_t I2Cdev_readBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_
101101
while(!IFS0bits.MI2CIF); // Wait for 9th clock cycle
102102
IFS0bits.MI2CIF = 0; // Clear interrupt flag
103103
//while(I2CSTATbits.ACKSTAT);
104-
//delay_ms_I2C(10);
104+
//delay_us_I2C(100);
105105
/*Master send RA*/
106106
/* Write Register Address */
107107
MasterWriteI2C(regAddr);
@@ -114,36 +114,43 @@ int8_t I2Cdev_readBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_
114114
IFS0bits.MI2CIF = 0; // Clear interrupt flag
115115
while(I2CSTATbits.ACKSTAT);
116116

117-
//delay_ms_I2C(10);
117+
//delay_us_I2C(100);
118+
119+
/*Master Pause*/
120+
StopI2C();
121+
/* Wait till stop sequence is completed */
122+
while(I2CCONbits.PEN);
123+
118124
/*Master Start*/
< 10000 code>119-
RestartI2C();
125+
StartI2C();
120126
/* Wait till Start sequence is completed */
121127
while(I2CCONbits.SEN);
122128

123129
/*Master send AD+R*/
124130
/* Write Slave Address (Read)*/
125131
MasterWriteI2C(devAddr << 1 | 0x01);
132+
//while(!MasterWriteI2C(devAddr << 1 | 0x01));
126133
/* Wait until address is transmitted */
127134
while(I2CSTATbits.TBF); // 8 clock cycles
128135

129136
/*Slave send Ack*/
130137
while(!IFS0bits.MI2CIF); // Wait for 9th clock cycle
131138
IFS0bits.MI2CIF = 0; // Clear interrupt flag
132139
while(I2CSTATbits.ACKSTAT);
133-
//delay_ms_I2C(10);
140+
//delay_us_I2C(100);
134141

135142
/*Slave send DATA*/
136143
//uint16_t flag = MastergetsI2C(length,data,I2C_DATA_WAIT);
137144

138145
/*Slave send NACK*/
146+
//MastergetsI2C(length,data,100);
139147
//NotAckI2C();
140148

141149
data[0] = MasterReadI2C();
142150
unsigned int i;
143151
for (i = 1 ; i < length ; i++ ){
144152
AckI2C();
145153
while(I2CCONbits.ACKEN == 1);
146-
//delay_ms_I2C(10);
147154
data[i] = MasterReadI2C();
148155
}
149156
NotAckI2C();
@@ -153,8 +160,8 @@ int8_t I2Cdev_readBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_
153160
/* Wait till stop sequence is completed */
154161
while(I2CCONbits.PEN);
155162
//CloseI2C();
156-
IdleI2C();
157-
return true;
163+
//IdleI2C();
164+
return length;
158165
}
159166

160167
/** Read single byte from an 8-bit device register.
@@ -290,7 +297,6 @@ bool I2Cdev_writeBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t
290297
while(I2CCONbits.SEN);
291298
/* Clear interrupt flag */
292299
IFS0bits.MI2CIF = 0;
293-
//delay_ms_I2C(10);
294300

295301
/*Master send AD+W*/
296302
/* Write Slave address (Write)*/
@@ -302,7 +308,7 @@ bool I2Cdev_writeBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t
302308
while(!IFS0bits.MI2CIF); // Wait for 9th clock cycle
303309
IFS0bits.MI2CIF = 0; // Clear interrupt flag
304310
while(I2CSTATbits.ACKSTAT);
305-
//delay_ms_I2C(10);
311+
//delay_us_I2C(100);
306312

307313
/*Master send RA*/
308314
/* Write Slave address (Write)*/
@@ -313,20 +319,31 @@ bool I2Cdev_writeBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t
313319
/*Slave send ACK*/
314320
while(!IFS0bits.MI2CIF); // Wait for 9th clock cycle
315321
IFS0bits.MI2CIF = 0; // Clear interrupt flag
316-
//delay_ms_I2C(10);
322+
//delay_us_I2C(100);
317323
while(I2CSTATbits.ACKSTAT);
318324

319325
/*Master send data*/
320326
/* Transmit string of data */
321327
MasterputsI2C(data);
328+
//uint8_t i;
329+
//for (i = 0 ; i < length ; i++){
330+
// MasterWriteI2C(data[i]);
331+
/* Wait till address is transmitted */
332+
// while(I2CSTATbits.TBF); // 8 clock cycles
333+
334+
/*Slave send ACK*/
335+
// while(!IFS0bits.MI2CIF); // Wait for 9th clock cycle
336+
// IFS0bits.MI2CIF = 0; // Clear interrupt flag
337+
//delay_us_I2C(100);
338+
//}
322339
while(!IFS0bits.MI2CIF); // Wait for 9th clock cycle
323340
IFS0bits.MI2CIF = 0; // Clear interrupt flag
324-
341+
325342
StopI2C();
326343
/* Wait till stop sequence is completed */
327344
while(I2CCONbits.PEN);
328345
//CloseI2C();
329-
IdleI2C();
346+
//IdleI2C();
330347
return true;
331348
}
332349

@@ -419,7 +436,7 @@ bool I2Cdev_writeBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_
419436
data &= mask; // zero all non-important bits in data
420437
b &= ~(mask); // zero all important bits in existing byte
421438
b |= data; // combine data with existing byte
422-
delay_ms_I2C(10);
439+
//delay_ms_I2C(10);
423440
return I2Cdev_writeByte(devAddr, regAddr, b);
424441
} else {
425442
return false;

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

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -90,17 +90,10 @@ void MPU6050(uint8_t address)
9090
*/
9191
void MPU6050_initialize()
9292
{
93-
94-
95-
MPU6050_setSleepEnabled(
96-
false); // thanks to Jack Elston for pointing this one out!
97-
delay_ms(20);
98-
MPU6050_setClockSource(MPU6050_CLOCK_PLL_XGYRO);
99-
delay_ms(20);
100-
MPU6050_setFullScaleAccelRange(MPU6050_ACCEL_FS_2);
101-
delay_ms(20);
102-
MPU6050_setFullScaleGyroRange(MPU6050_GYRO_FS_250);
103-
delay_ms(100);
93+
MPU6050_setClockSource(MPU6050_CLOCK_PLL_XGYRO);
94+
MPU6050_setFullScaleGyroRange(MPU6050_GYRO_FS_250);
95+
MPU6050_setFullScaleAccelRange(MPU6050_ACCEL_FS_2);
96+
MPU6050_setSleepEnabled(false);
10497
}
10598

10699
/** Verify the I2C connection.

0 commit comments

Comments
 (0)
0