@@ -68,6 +68,9 @@ static const PinMap PinMap_I2C_SCL[] = {
68
68
{NC , NC , 0 }
69
69
};
70
70
71
+ static int address_save_int ;
72
+ static int Byte_count ;
73
+ static char address_save [4 ];
71
74
static uint16_t i2c_target_addr [4 ];
72
75
static SAL_I2C_TRANSFER_BUF i2ctxtranbuf [4 ];
73
76
static SAL_I2C_TRANSFER_BUF i2crxtranbuf [4 ];
@@ -223,6 +226,9 @@ void i2c_frequency(i2c_t *obj, int hz) {
223
226
}
224
227
225
228
inline int i2c_start (i2c_t * obj ) {
229
+ address_save_int = 0 ;
230
+ Byte_count = 0 ;
231
+ memset (address_save , 0 , sizeof (address_save ));
226
232
return 0 ;
227
233
}
228
234
@@ -268,7 +274,6 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) {
268
274
length = length - pSalI2CHND -> pRXBuf -> DataLen ;
269
275
return ((int )length );
270
276
} else {
271
- //DBG_8195A(">\n");
272
277
/* Calculate user time out parameters */
273
278
I2CInTOTcnt = 300 ;
274
279
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) {
315
320
pSalI2CHND = & (pSalI2CMngtAdpt -> pSalHndPriv -> SalI2CHndPriv );
316
321
address = (address & 0xFE ) >>1 ;
317
322
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 );
323
326
324
327
/* Check if the it's the last byte or not */
325
328
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) {
337
340
length = length - pSalI2CHND -> pTXBuf -> DataLen ;
338
341
return ((int )length );
339
342
} else {
340
- //DBG_8195A("(\n");
341
343
/* Calculate user time out parameters */
342
344
I2CInTOTcnt = 300 ;
343
345
if ((I2CInTOTcnt != 0 ) && (I2CInTOTcnt != I2C_TIMEOOUT_ENDLESS )) {
@@ -395,25 +397,40 @@ int i2c_byte_read(i2c_t *obj, int last) {
395
397
}
396
398
397
399
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 ;
398
413
399
414
PSAL_I2C_MNGT_ADPT pSalI2CMngtAdpt = NULL ;
400
415
PSAL_I2C_HND pSalI2CHND = NULL ;
401
416
pSalI2CMngtAdpt = & (obj -> SalI2CMngtAdpt );
402
417
pSalI2CHND = & (pSalI2CMngtAdpt -> pSalHndPriv -> SalI2CHndPriv );
403
418
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 );
406
422
423
+ pSalI2CHND -> I2CExd &= (~I2C_EXD_MTR_HOLD_BUS );
407
424
pSalI2CHND -> pTXBuf = & i2ctxtranbuf [pSalI2CHND -> DevNum ];
408
- pSalI2CHND -> pTXBuf -> DataLen = 1 ;
425
+ pSalI2CHND -> pTXBuf -> DataLen = 3 ;
409
426
pSalI2CHND -> pTXBuf -> TargetAddr = i2c_target_addr [pSalI2CHND -> DevNum ];
410
427
pSalI2CHND -> pTXBuf -> RegAddr = 0 ;
411
- pSalI2CHND -> pTXBuf -> pDataBuf = ( unsigned char * ) & data ;
428
+ pSalI2CHND -> pTXBuf -> pDataBuf = address_save + 1 ;
412
429
413
430
if (RtkI2CSend (pSalI2CHND ) != HAL_OK ) {
414
431
return 0 ;
415
432
}
416
-
433
+ address_save_int ++ ;
417
434
return 1 ;
418
435
}
419
436
0 commit comments