Skip to content

Commit e151acd

Browse files
committed
protecting access to rxBuffer to avoid stop of I2C communication
1 parent fe0b901 commit e151acd

File tree

1 file changed

+15
-3
lines changed

1 file changed

+15
-3
lines changed

libraries/Wire/Wire.cpp

+15-3
Original file line numberDiff line numberDiff line change
@@ -122,14 +122,22 @@ size_t arduino::MbedI2C::write(const uint8_t* data, int len) {
122122
}
123123

124124
int arduino::MbedI2C::read() {
125+
int rv = -1;
126+
core_util_critical_section_enter();
127+
125128
if (rxBuffer.available()) {
126-
return rxBuffer.read_char();
129+
130+
rv = rxBuffer.read_char();
127131
}
128-
return -1;
132+
core_util_critical_section_exit();
133+
return rv;
129134
}
130135

131136
int arduino::MbedI2C::available() {
132-
return rxBuffer.available();
137+
core_util_critical_section_enter();
138+
int rv = rxBuffer.available();
139+
core_util_critical_section_exit();
140+
return rv;
133141
}
134142

135143
int arduino::MbedI2C::peek() {
@@ -151,13 +159,16 @@ void arduino::MbedI2C::receiveThd() {
151159
onRequestCb();
152160
}
153161
if (usedTxBuffer != 0) {
162+
core_util_critical_section_enter();
154163
slave->write((const char *) txBuffer, usedTxBuffer);
164+
core_util_critical_section_exit();
155165
usedTxBuffer = 0;
156166
}
157167
//slave->stop();
158168
break;
159169
case mbed::I2CSlave::WriteGeneral:
160170
case mbed::I2CSlave::WriteAddressed:
171+
core_util_critical_section_enter();
161172
rxBuffer.clear();
162173
char buf[240];
163174
c = slave->read(buf, sizeof(buf));
@@ -171,6 +182,7 @@ void arduino::MbedI2C::receiveThd() {
171182
if (rxBuffer.available() > 0 && onReceiveCb != NULL) {
172183
onReceiveCb(rxBuffer.available());
173184
}
185+
core_util_critical_section_exit();
174186
//slave->stop();
175187
break;
176188
case mbed::I2CSlave::NoData:

0 commit comments

Comments
 (0)