hi Team,
SAIC EP39 project DMH model use 947+948, now receive SAIC back-end information, the vehicle during the customer use of the vertical line of projection screen problem;
Details are as follows:
(1) The occurrence of malfunction phenomenon is sporadic and irregular;
(2) The duration of the failure varies, may be flashing for 1 second self-recovery, or lasting for 5-6 seconds self-recovery;
(3) No other special operations were carried out before and after the breakdown;
The problem only occurs in the meter display map interface (projection screen area);
Number: Up to now, 3 cases of malfunctions, sales of about 10,000 units;
See attached video for symptoms;
below is the 947 script.
void TI947_INIT(void)
{
if(DS90UB947_read_status ==0)
{
DS90UB947_Init_Delay_Cnt--;
}
if(DS90UB947_Init_Delay_Cnt == 62)
{
if(DS90UB947_read_status==0)
{
ds_reg = 0x23;
wbuf[0] = 0x80;
ret_io = hal_i2c_write_reg_data(i2c_handle, 0x0c, &ds_reg, 1, wbuf,1);
ds_reg = 0x24;
wbuf[0] = 0x80;
ret_io = hal_i2c_write_reg_data(i2c_handle, 0x0c, &ds_reg, 1, wbuf,1);
DS90UB947_read_count = 0;
DS90UB947_read_status = 1;
}else
{
if(ti947_count< 3)
{
ti947_count++;
}else
{
ti947_count = 0;
ds_reg=0x24;
ret_io = hal_i2c_read_reg_data(i2c_handle, 0x0c, &ds_reg, 1, wbuf, 1);
printf("read24_status=%d,ret_io=%d\n", wbuf[0],ret_io);
if((wbuf[0]&0x1F) == 0x1B)
{
DS90UB947_read_status = 0;
DS90UB947_read_count = 0;
ds_reg = 0x24;
wbuf[0] = 0x00;
hal_i2c_write_reg_data(i2c_handle, 0x0c, &ds_reg, 1, wbuf,1);
ds_reg = 0x23;
wbuf[0] = 0x00;
hal_i2c_write_reg_data(i2c_handle, 0x0c, &ds_reg, 1, wbuf,1);
}else
{
if(DS90UB947_read_count< 499) // 10s
{
DS90UB947_read_count++;
}else
{
DS90UB947_read_count = 0;
ds_reg = 0x01;
wbuf[0] = 0x01;
hal_i2c_write_reg_data(i2c_handle, 0x34, &ds_reg, 1, wbuf,1);
}
}
}
}
}else if(DS90UB947_Init_Delay_Cnt == 52)
{
ds_reg = 0x17;
wbuf[0] = 0xde;
hal_i2c_write_reg_data(i2c_handle, 0x0c, &ds_reg, 1, wbuf,1);
ds_reg = 0x03;
wbuf[0] = 0xda;
hal_i2c_write_reg_data(i2c_handle, 0x0c, &ds_reg, 1, wbuf,1);
}else if(DS90UB947_Init_Delay_Cnt == 42)
{
Task_io_ds90ub947_init2();
}else if(DS90UB947_Init_Delay_Cnt == 22)
{
Task_io_ds90ub948_Read1();
}else if(DS90UB947_Init_Delay_Cnt == 2)
{
DS90UB947_read_status = 1;
if(ti948_count < 3)
{
ti948_count++;
}else
{
ti948_count = 0;
Task_io_ds90ub948_Read2();
}
}else
{
}
}
void Task_io_ds90ub947_init2(void)
{
uint8_t ds_reg[10] = {0x40, 0x41, 0x42, 0x41, 0x42, 0x42, 0x42, 0x42, 0x41, 0x42};
uint8_t wbuf[10] = {0x10, 0x49, 0x16, 0x47, 0x20, 0xA0, 0x20, 0x00, 0x49, 0x00};
uint8_t temp8 = 0;
for(temp8 = 0;temp8<10;temp8++)
{
hal_i2c_write_reg_data(i2c_handle, 0x0c, &ds_reg[temp8], 1, &wbuf[temp8],1);
}
}
void Task_io_ds90ub948_Read1(void)
{
uint8_t ds_reg[2] = {0x00, 0x00};
uint8_t wbuf[2] = {0x00, 0x00};
ds_reg[0]=0x03;
wbuf[0]=0xFA;
hal_i2c_write_reg_data(i2c_handle, 0x0C, &ds_reg[0], 1, &wbuf[0],1);
ds_reg[0]=0x03;
wbuf[0]=0xDA;
hal_i2c_write_reg_data(i2c_handle, 0x0C, &ds_reg[0], 1, &wbuf[0],1);
ds_reg[0]=0x68;
wbuf[0]=0x19;
hal_i2c_write_reg_data(i2c_handle, 0x34, &ds_reg[0], 1, &wbuf[0],1);
}
void Task_io_ds90ub948_Read2(void)
{
uint8_t ds_reg = 0x00;
uint8_t wbuf[2] = {0x00, 0x00};
uint16_t Hhigh=0;
uint16_t Hlow=0;
uint16_t Vhigh=0;
uint16_t Vlow=0;
int ret_ti948 = 0;
ds_reg=0x68;
wbuf[0]=0x19;
hal_i2c_write_reg_data(i2c_handle, 0x34, &ds_reg, 1, &wbuf[0],1); // H active High monitor
ds_reg=0x69;
ret_ti948 = hal_i2c_read_reg_data(i2c_handle, 0x34, &ds_reg, 1, wbuf, 1);
Hhigh=wbuf[0];
ds_reg=0x68;
wbuf[0]=0x09;
hal_i2c_write_reg_data(i2c_handle, 0x34, &ds_reg, 1, &wbuf[0],1); // H active Low monitor
ds_reg=0x69;
ret_ti948 = hal_i2c_read_reg_data(i2c_handle, 0x34, &ds_reg, 1, wbuf, 1);
Hlow=wbuf[0];
ds_reg=0x68;
wbuf[0]=0x39;
hal_i2c_write_reg_data(i2c_handle, 0x34, &ds_reg, 1, &wbuf[0],1); // V active High monitor
ds_reg=0x69;
ret_ti948 = hal_i2c_read_reg_data(i2c_handle, 0x34, &ds_reg, 1, wbuf, 1);
Vhigh=wbuf[0];
ds_reg=0x68;
wbuf[0]=0x29;
hal_i2c_write_reg_data(i2c_handle, 0x34, &ds_reg, 1, &wbuf[0],1); // V active Low monitor
ds_reg=0x69;
ret_ti948 = hal_i2c_read_reg_data(i2c_handle, 0x34, &ds_reg, 1, wbuf, 1);
Vlow=wbuf[0];
Hhigh=Hhigh&0x3F;
Hlow=Hlow&0x3F;
Vhigh=Vhigh&0x3F;
Vlow=Vlow&0x3F;
Hhigh<<=6;
Hhigh=Hhigh|Hlow;
Vhigh<<=6;
Vhigh=Vhigh|Vlow;
printf("Hactive=%d,Vactive=%d\n", Hhigh,Vhigh);
if((Hhigh == 1920U)&&(Vhigh == 720U))
{
DS90UB947_read_status = 0;
DS90UB948_read_count = 0;
}else
{
if(DS90UB948_read_count < 4)
{
DS90UB948_read_count++;
}else
{
DS90UB948_read_count = 0;
DS90UB947_Init_Delay_Cnt = 43;
DS90UB947_read_status = 0;
DS90UB947_read_count = 0;
}
}
}
