Skip to content

Commit c76c86f

Browse files
committed
fix multiple i2c peripherals possible conflicting issue
1 parent 32e86bb commit c76c86f

File tree

1 file changed

+20
-21
lines changed

1 file changed

+20
-21
lines changed

targets/TARGET_Realtek/TARGET_AMEBA/i2c_api.c

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,9 @@ static const PinMap PinMap_I2C_SCL[] = {
6868
{NC, NC, 0}
6969
};
7070

71-
static int address_save_int;
72-
static int Byte_count;
73-
static char address_save[4];
71+
static int address_save_int[4];
72+
static int Byte_count[4];
73+
static u32 address_save[4];
7474
static uint16_t i2c_target_addr[4];
7575
static SAL_I2C_TRANSFER_BUF i2ctxtranbuf[4];
7676
static SAL_I2C_TRANSFER_BUF i2crxtranbuf[4];
@@ -228,8 +228,8 @@ void i2c_frequency(i2c_t *obj, int hz)
228228

229229
inline int i2c_start(i2c_t *obj)
230230
{
231-
address_save_int = 0;
232-
Byte_count = 0;
231+
memset(address_save_int , 0, sizeof(address_save_int));
232+
memset(Byte_count , 0, sizeof(Byte_count));
233233
memset(address_save, 0, sizeof(address_save));
234234
return 0;
235235
}
@@ -400,24 +400,23 @@ int i2c_byte_read(i2c_t *obj, int last)
400400

401401
int i2c_byte_write(i2c_t *obj, int data)
402402
{
403-
if(Byte_count<3){
404-
address_save[Byte_count]=data;
405-
Byte_count++;
406-
if(Byte_count==3){
407-
address_save_int = (address_save[1]<<8)+address_save[2];
408-
}
409-
return 1;
410-
}
411-
412-
int address = (address_save[0] & 0xFE ) >> 1;
413-
address_save[1]= (unsigned char)(address_save_int >> 8);
414-
address_save[2]= (unsigned char)(address_save_int & 0xFF);
415-
address_save[3]= (unsigned char)data;
416-
417403
PSAL_I2C_MNGT_ADPT pSalI2CMngtAdpt = NULL;
418404
PSAL_I2C_HND pSalI2CHND = NULL;
419405
pSalI2CMngtAdpt = &(obj->SalI2CMngtAdpt);
420406
pSalI2CHND = &(pSalI2CMngtAdpt->pSalHndPriv->SalI2CHndPriv);
407+
u8 * dp = (u8 *)&address_save[pSalI2CHND->DevNum];
408+
if(Byte_count[pSalI2CHND->DevNum]<3){
409+
dp[Byte_count[pSalI2CHND->DevNum]] = data;
410+
Byte_count[pSalI2CHND->DevNum]++;
411+
if(Byte_count[pSalI2CHND->DevNum]==3){
412+
address_save_int[pSalI2CHND->DevNum] = (dp[1]<<8)+dp[2];
413+
}
414+
return 1;
415+
}
416+
int address = (dp[0] & 0xFE ) >> 1;
417+
dp[1]= (unsigned char)(address_save_int[pSalI2CHND->DevNum] >> 8);
418+
dp[2]= (unsigned char)(address_save_int[pSalI2CHND->DevNum] & 0xFF);
419+
dp[3]= (unsigned char)data;
421420

422421
pSalI2CHND->pInitDat->I2CAckAddr = address;
423422
i2c_target_addr[pSalI2CHND->DevNum] = address;
@@ -428,12 +427,12 @@ int i2c_byte_write(i2c_t *obj, int data)
428427
pSalI2CHND->pTXBuf->DataLen = 3;
429428
pSalI2CHND->pTXBuf->TargetAddr= i2c_target_addr[pSalI2CHND->DevNum];
430429
pSalI2CHND->pTXBuf->RegAddr = 0;
431-
pSalI2CHND->pTXBuf->pDataBuf = address_save+1;
430+
pSalI2CHND->pTXBuf->pDataBuf = dp+1;
432431

433432
if (RtkI2CSend(pSalI2CHND) != HAL_OK) {
434433
return 0;
435434
}
436-
address_save_int++;
435+
address_save_int[pSalI2CHND->DevNum]++;
437436
return 1;
438437
}
439438

0 commit comments

Comments
 (0)