@@ -151,6 +151,7 @@ uint8_t TwoWire::requestFrom(uint8_t address, size_t quantity, bool stopBit)
151151 {
152152 return 0 ;
153153 }
154+ uint32_t start;
154155
155156 size_t byteRead = 0 ;
156157 rxBuffer.clear ();
@@ -162,22 +163,42 @@ uint8_t TwoWire::requestFrom(uint8_t address, size_t quantity, bool stopBit)
162163 _p_twim->RXD .MAXCNT = quantity;
163164 _p_twim->TASKS_STARTRX = 0x1UL ;
164165
165- while (!_p_twim->EVENTS_RXSTARTED && !_p_twim->EVENTS_ERROR );
166+ start = millis ();
167+ while (!_p_twim->EVENTS_RXSTARTED && !_p_twim->EVENTS_ERROR ) {
168+ if (millis () - start >= 3 ) {
169+ return 0 ;
170+ }
171+ }
166172 _p_twim->EVENTS_RXSTARTED = 0x0UL ;
167173
168- while (!_p_twim->EVENTS_LASTRX && !_p_twim->EVENTS_ERROR );
174+ start = millis ();
175+ while (!_p_twim->EVENTS_LASTRX && !_p_twim->EVENTS_ERROR ) {
176+ if (millis () - start >= 3 ) {
177+ return 0 ;
178+ }
179+ }
169180 _p_twim->EVENTS_LASTRX = 0x0UL ;
170181
171182 if (stopBit || _p_twim->EVENTS_ERROR )
172183 {
173184 _p_twim->TASKS_STOP = 0x1UL ;
174- while (!_p_twim->EVENTS_STOPPED );
185+ start = millis ();
186+ while (!_p_twim->EVENTS_STOPPED ) {
187+ if (millis () - start >= 3 ) {
188+ return 0 ;
189+ }
190+ }
175191 _p_twim->EVENTS_STOPPED = 0x0UL ;
176192 }
177193 else
178194 {
179195 _p_twim->TASKS_SUSPEND = 0x1UL ;
180- while (!_p_twim->EVENTS_SUSPENDED );
196+ start = millis ();
197+ while (!_p_twim->EVENTS_SUSPENDED ) {
198+ if (millis () - start >= 3 ) {
199+ return 0 ;
200+ }
201+ }
181202 _p_twim->EVENTS_SUSPENDED = 0x0UL ;
182203 }
183204
@@ -212,6 +233,7 @@ void TwoWire::beginTransmission(uint8_t address) {
212233// 4 : Other error
213234uint8_t TwoWire::endTransmission (bool stopBit)
214235{
236+ uint32_t start;
215237 transmissionBegun = false ;
216238
217239 // Start I2C transmission
@@ -224,24 +246,44 @@ uint8_t TwoWire::endTransmission(bool stopBit)
224246
225247 _p_twim->TASKS_STARTTX = 0x1UL ;
226248
227- while (!_p_twim->EVENTS_TXSTARTED && !_p_twim->EVENTS_ERROR );
249+ start = millis ();
250+ while (!_p_twim->EVENTS_TXSTARTED && !_p_twim->EVENTS_ERROR ) {
251+ if (millis () - start >= 3 ) {
252+ return 4 ;
253+ }
254+ }
228255 _p_twim->EVENTS_TXSTARTED = 0x0UL ;
229256
257+ start = millis ();
230258 if (txBuffer.available ()) {
231- while (!_p_twim->EVENTS_LASTTX && !_p_twim->EVENTS_ERROR );
259+ while (!_p_twim->EVENTS_LASTTX && !_p_twim->EVENTS_ERROR ) {
260+ if (millis () - start >= 3 ) {
261+ return 4 ;
262+ }
263+ }
232264 }
233265 _p_twim->EVENTS_LASTTX = 0x0UL ;
234266
235267 if (stopBit || _p_twim->EVENTS_ERROR )
236268 {
237269 _p_twim->TASKS_STOP = 0x1UL ;
238- while (!_p_twim->EVENTS_STOPPED );
270+ start = millis ();
271+ while (!_p_twim->EVENTS_STOPPED ) {
272+ if (millis () - start >= 3 ) {
273+ return 4 ;
274+ }
275+ }
239276 _p_twim->EVENTS_STOPPED = 0x0UL ;
240277 }
241278 else
242279 {
243280 _p_twim->TASKS_SUSPEND = 0x1UL ;
244- while (!_p_twim->EVENTS_SUSPENDED );
281+ start = millis ();
282+ while (!_p_twim->EVENTS_SUSPENDED ) {
283+ if (millis () - start >= 3 ) {
284+ return 4 ;
285+ }
286+ }
245287 _p_twim->EVENTS_SUSPENDED = 0x0UL ;
246288 }
247289
0 commit comments