Skip to content

Commit ebb5a2f

Browse files
committed
an I2C fix
an I2C fix for updated CI-test
1 parent 24c248a commit ebb5a2f

File tree

1 file changed

+29
-12
lines changed

1 file changed

+29
-12
lines changed

targets/TARGET_Realtek/TARGET_AMEBA/i2c_api.c

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +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];
7174
static uint16_t i2c_target_addr[4];
7275
static SAL_I2C_TRANSFER_BUF i2ctxtranbuf[4];
7376
static SAL_I2C_TRANSFER_BUF i2crxtranbuf[4];
@@ -223,6 +226,9 @@ void i2c_frequency(i2c_t *obj, int hz) {
223226
}
224227

225228
inline int i2c_start(i2c_t *obj) {
229+
address_save_int = 0;
230+
Byte_count = 0;
231+
memset(address_save, 0, sizeof(address_save));
226232
return 0;
227233
}
228234

@@ -268,7 +274,6 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) {
268274
length = length - pSalI2CHND->pRXBuf->DataLen;
269275
return ((int)length);
270276
} else {
271-
//DBG_8195A(">\n");
272277
/* Calculate user time out parameters */
273278
I2CInTOTcnt = 300;
274279
if ((I2CInTOTcnt != 0) && (I2CInTOTcnt != I2C_TIMEOOUT_ENDLESS)) {
@@ -315,11 +320,9 @@ int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) {
315320
pSalI2CHND = &(pSalI2CMngtAdpt->pSalHndPriv->SalI2CHndPriv);
316321
address = (address & 0xFE ) >>1;
317322

318-
if (i2c_target_addr[pSalI2CHND->DevNum] != address) {
319-
pSalI2CHND->pInitDat->I2CAckAddr = address;
320-
i2c_target_addr[pSalI2CHND->DevNum] = address;
321-
HalI2CSetTarRtl8195a(pSalI2CHND->pInitDat);
322-
}
323+
pSalI2CHND->pInitDat->I2CAckAddr = address;
324+
i2c_target_addr[pSalI2CHND->DevNum] = address;
325+
HalI2CSetTarRtl8195a(pSalI2CHND->pInitDat);
323326

324327
/* Check if the it's the last byte or not */
325328
pSalI2CHND->I2CExd &= (~I2C_EXD_MTR_HOLD_BUS);
@@ -337,7 +340,6 @@ int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) {
337340
length = length - pSalI2CHND->pTXBuf->DataLen;
338341
return ((int)length);
339342
} else {
340-
//DBG_8195A("(\n");
341343
/* Calculate user time out parameters */
342344
I2CInTOTcnt = 300;
343345
if ((I2CInTOTcnt != 0) && (I2CInTOTcnt != I2C_TIMEOOUT_ENDLESS)) {
@@ -395,25 +397,40 @@ int i2c_byte_read(i2c_t *obj, int last) {
395397
}
396398

397399
int i2c_byte_write(i2c_t *obj, int data) {
400+
if(Byte_count<3){
401+
address_save[Byte_count]=data;
402+
Byte_count++;
403+
if(Byte_count==3){
404+
address_save_int = (address_save[1]<<8)+address_save[2];
405+
}
406+
return 1;
407+
}
408+
409+
int address = (address_save[0] & 0xFE ) >> 1;
410+
address_save[1]= (unsigned char)(address_save_int >> 8);
411+
address_save[2]= (unsigned char)(address_save_int & 0xFF);
412+
address_save[3]= (unsigned char)data;
398413

399414
PSAL_I2C_MNGT_ADPT pSalI2CMngtAdpt = NULL;
400415
PSAL_I2C_HND pSalI2CHND = NULL;
401416
pSalI2CMngtAdpt = &(obj->SalI2CMngtAdpt);
402417
pSalI2CHND = &(pSalI2CMngtAdpt->pSalHndPriv->SalI2CHndPriv);
403418

404-
pSalI2CHND->I2CExd &= (~I2C_EXD_MTR_HOLD_BUS);
405-
pSalI2CHND->I2CExd |= I2C_EXD_MTR_HOLD_BUS;
419+
pSalI2CHND->pInitDat->I2CAckAddr = address;
420+
i2c_target_addr[pSalI2CHND->DevNum] = address;
421+
HalI2CSetTarRtl8195a(pSalI2CHND->pInitDat);
406422

423+
pSalI2CHND->I2CExd &= (~I2C_EXD_MTR_HOLD_BUS);
407424
pSalI2CHND->pTXBuf = &i2ctxtranbuf[pSalI2CHND->DevNum];
408-
pSalI2CHND->pTXBuf->DataLen = 1;
425+
pSalI2CHND->pTXBuf->DataLen = 3;
409426
pSalI2CHND->pTXBuf->TargetAddr= i2c_target_addr[pSalI2CHND->DevNum];
410427
pSalI2CHND->pTXBuf->RegAddr = 0;
411-
pSalI2CHND->pTXBuf->pDataBuf = (unsigned char*)&data;
428+
pSalI2CHND->pTXBuf->pDataBuf = address_save+1;
412429

413430
if (RtkI2CSend(pSalI2CHND) != HAL_OK) {
414431
return 0;
415432
}
416-
433+
address_save_int++;
417434
return 1;
418435
}
419436

0 commit comments

Comments
 (0)