Skip to content

Commit 9a113e8

Browse files
authored
Merge pull request #1 from ABOSTM/PR_590
update on PR Added the repeated-start feature in I2C driver stm32duino#590
2 parents 551f908 + 1bb59af commit 9a113e8

File tree

2 files changed

+36
-8
lines changed

2 files changed

+36
-8
lines changed

cores/arduino/stm32/twi.c

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -716,8 +716,16 @@ i2c_status_e i2c_master_write(i2c_t *obj, uint8_t dev_address,
716716
return i2c_IsDeviceReady(obj, dev_address, 1);
717717
}
718718

719+
#if defined(I2C_OTHER_FRAME)
720+
uint32_t XferOptions = obj->handle.XferOptions; // save XferOptions value, because handle can be modified by HAL, which cause issue in case of NACK from slave
721+
#endif
722+
719723
do {
720-
if (HAL_I2C_Master_Seq_Transmit_IT(&(obj->handle), dev_address, data, size, obj->handle.XferOptions) == HAL_OK) {
724+
#if defined(I2C_OTHER_FRAME)
725+
if (HAL_I2C_Master_Seq_Transmit_IT(&(obj->handle), dev_address, data, size, XferOptions) == HAL_OK) {
726+
#else
727+
if (HAL_I2C_Master_Transmit_IT(&(obj->handle), dev_address, data, size) == HAL_OK) {
728+
#endif
721729
ret = I2C_OK;
722730
// wait for transfer completion
723731
while ((HAL_I2C_GetState(&(obj->handle)) != HAL_I2C_STATE_READY)
@@ -777,8 +785,16 @@ i2c_status_e i2c_master_read(i2c_t *obj, uint8_t dev_address, uint8_t *data, uin
777785
uint32_t tickstart = HAL_GetTick();
778786
uint32_t delta = 0;
779787

788+
#if defined(I2C_OTHER_FRAME)
789+
uint32_t XferOptions = obj->handle.XferOptions; // save XferOptions value, because handle can be modified by HAL, which cause issue in case of NACK from slave
790+
#endif
791+
780792
do {
781-
if (HAL_I2C_Master_Seq_Receive_IT(&(obj->handle), dev_address, data, size, obj->handle.XferOptions) == HAL_OK) {
793+
#if defined(I2C_OTHER_FRAME)
794+
if (HAL_I2C_Master_Seq_Receive_IT(&(obj->handle), dev_address, data, size, XferOptions) == HAL_OK) {
795+
#else
796+
if (HAL_I2C_Master_Receive_IT(&(obj->handle), dev_address, data, size) == HAL_OK) {
797+
#endif
782798
ret = I2C_OK;
783799
// wait for transfer completion
784800
while ((HAL_I2C_GetState(&(obj->handle)) != HAL_I2C_STATE_READY)

libraries/Wire/src/Wire.cpp

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ extern "C" {
2727

2828
#include "Wire.h"
2929

30-
#define I2C_NO_OPTION_FRAME 0xFFFF0000U /*!< XferOptions default value */
3130
// Initialize Class Variables //////////////////////////////////////////////////
3231
uint8_t *TwoWire::rxBuffer = nullptr;
3332
uint8_t TwoWire::rxBufferAllocated = 0;
@@ -117,6 +116,10 @@ void TwoWire::setClock(uint32_t frequency)
117116

118117
uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity, uint32_t iaddress, uint8_t isize, uint8_t sendStop)
119118
{
119+
#if !defined(I2C_OTHER_FRAME)
120+
UNUSED(sendStop);
121+
#endif
122+
120123
if (_i2c.isMaster == 1) {
121124
allocateRxBuffer(quantity);
122125
// error if no memory block available to allocate the buffer
@@ -146,11 +149,15 @@ uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity, uint32_t iaddres
146149

147150
// perform blocking read into buffer
148151
uint8_t read = 0;
149-
if (sendStop != 0) {
150-
_i2c.handle.XferOptions = I2C_LAST_FRAME;
152+
153+
#if defined(I2C_OTHER_FRAME)
154+
if (sendStop == 0) {
155+
_i2c.handle.XferOptions = I2C_OTHER_FRAME ;
151156
} else {
152-
_i2c.handle.XferOptions = I2C_NO_OPTION_FRAME;
157+
_i2c.handle.XferOptions = I2C_OTHER_AND_LAST_FRAME;
153158
}
159+
#endif
160+
154161
if (I2C_OK == i2c_master_read(&_i2c, address << 1, rxBuffer, quantity)) {
155162
read = quantity;
156163
}
@@ -216,13 +223,18 @@ void TwoWire::beginTransmission(int address)
216223
//
217224
uint8_t TwoWire::endTransmission(uint8_t sendStop)
218225
{
226+
#if !defined(I2C_OTHER_FRAME)
227+
UNUSED(sendStop);
228+
#endif
219229
int8_t ret = 4;
220230
// check transfer options and store it in the I2C handle
231+
#if defined(I2C_OTHER_FRAME)
221232
if (sendStop == 0) {
222-
_i2c.handle.XferOptions = I2C_FIRST_FRAME;
233+
_i2c.handle.XferOptions = I2C_OTHER_FRAME ;
223234
} else {
224-
_i2c.handle.XferOptions = I2C_FIRST_AND_LAST_FRAME;
235+
_i2c.handle.XferOptions = I2C_OTHER_AND_LAST_FRAME;
225236
}
237+
#endif
226238

227239
if (_i2c.isMaster == 1) {
228240
// transmit buffer (blocking)

0 commit comments

Comments
 (0)