fix multiple i2c peripherals possible conflicting issue

pull/4438/head
Yuguo Zou 2017-05-22 20:17:54 +08:00 committed by Martin Kojtal
parent 92ca664fda
commit c31d5479be
1 changed files with 20 additions and 21 deletions

View File

@ -68,9 +68,9 @@ static const PinMap PinMap_I2C_SCL[] = {
{NC, NC, 0}
};
static int address_save_int;
static int Byte_count;
static char address_save[4];
static int address_save_int[4];
static int Byte_count[4];
static u32 address_save[4];
static uint16_t i2c_target_addr[4];
static SAL_I2C_TRANSFER_BUF i2ctxtranbuf[4];
static SAL_I2C_TRANSFER_BUF i2crxtranbuf[4];
@ -228,8 +228,8 @@ void i2c_frequency(i2c_t *obj, int hz)
inline int i2c_start(i2c_t *obj)
{
address_save_int = 0;
Byte_count = 0;
memset(address_save_int , 0, sizeof(address_save_int));
memset(Byte_count , 0, sizeof(Byte_count));
memset(address_save, 0, sizeof(address_save));
return 0;
}
@ -400,24 +400,23 @@ int i2c_byte_read(i2c_t *obj, int last)
int i2c_byte_write(i2c_t *obj, int data)
{
if(Byte_count<3){
address_save[Byte_count]=data;
Byte_count++;
if(Byte_count==3){
address_save_int = (address_save[1]<<8)+address_save[2];
}
return 1;
}
int address = (address_save[0] & 0xFE ) >> 1;
address_save[1]= (unsigned char)(address_save_int >> 8);
address_save[2]= (unsigned char)(address_save_int & 0xFF);
address_save[3]= (unsigned char)data;
PSAL_I2C_MNGT_ADPT pSalI2CMngtAdpt = NULL;
PSAL_I2C_HND pSalI2CHND = NULL;
pSalI2CMngtAdpt = &(obj->SalI2CMngtAdpt);
pSalI2CHND = &(pSalI2CMngtAdpt->pSalHndPriv->SalI2CHndPriv);
u8 * dp = (u8 *)&address_save[pSalI2CHND->DevNum];
if(Byte_count[pSalI2CHND->DevNum]<3){
dp[Byte_count[pSalI2CHND->DevNum]] = data;
Byte_count[pSalI2CHND->DevNum]++;
if(Byte_count[pSalI2CHND->DevNum]==3){
address_save_int[pSalI2CHND->DevNum] = (dp[1]<<8)+dp[2];
}
return 1;
}
int address = (dp[0] & 0xFE ) >> 1;
dp[1]= (unsigned char)(address_save_int[pSalI2CHND->DevNum] >> 8);
dp[2]= (unsigned char)(address_save_int[pSalI2CHND->DevNum] & 0xFF);
dp[3]= (unsigned char)data;
pSalI2CHND->pInitDat->I2CAckAddr = address;
i2c_target_addr[pSalI2CHND->DevNum] = address;
@ -428,12 +427,12 @@ int i2c_byte_write(i2c_t *obj, int data)
pSalI2CHND->pTXBuf->DataLen = 3;
pSalI2CHND->pTXBuf->TargetAddr= i2c_target_addr[pSalI2CHND->DevNum];
pSalI2CHND->pTXBuf->RegAddr = 0;
pSalI2CHND->pTXBuf->pDataBuf = address_save+1;
pSalI2CHND->pTXBuf->pDataBuf = dp+1;
if (RtkI2CSend(pSalI2CHND) != HAL_OK) {
return 0;
}
address_save_int++;
address_save_int[pSalI2CHND->DevNum]++;
return 1;
}