Other Parts Discussed in Thread: DLPC3479
1.我用一个循环重复运行投影仪的示例代码dlpc347x_samples.c
//dlpc347x_samples.c
//main函数
while (true)
{
InitConnectionAndCommandLayer();
bool Status = CYPRESS_I2C_RequestI2CBusAccess();
if (Status != true)
{
printf("Error Request I2C Bus ACCESS!!!");
return;
}
DLPC34XX_ControllerDeviceId_e DeviceId = DLPC34XX_CDI_DLPC3479;
DLPC34XX_ReadControllerDeviceId(&DeviceId);
printf("Controller Devicde Id = %d \n", DeviceId);
uint16_t PixelsPerLine, LinesPerFrame;
DLPC34XX_ReadInputImageSize(&PixelsPerLine, &LinesPerFrame);
printf("Input Image Size = 0x%x, 0x%x \n", PixelsPerLine, LinesPerFrame);
LoadPreBuildPatternData();
LoadPatternOrderTableEntryfromFlash();
DLPC34XX_WriteTriggerOutConfiguration(DLPC34XX_TT_TRIGGER2,
DLPC34XX_TE_ENABLE, DLPC34XX_TI_NOT_INVERTED, 0);
DLPC34XX_WriteOperatingModeSelect(DLPC34XX_OM_SENS_INTERNAL_PATTERN);
DLPC34XX_WriteInternalPatternControl(DLPC34XX_PC_START, 0x0);
WaitForSeconds(3);
if (CYPRESS_I2C_RelinquishI2CBusAccess())
{
printf("RelinquishI2CBusAccess\n\n");
}
}
运行结果如下,循环只成功执行了一次,随后卡住约10分钟自动退出

经过debug,发现代码在第二次循环调用CYPRESS_I2C_RequestI2CBusAccess()函数时,陷入在该函数的循环里,直到超时
//cypress_i2c.c
//bool CYPRESS_I2C_RequestI2CBusAccess()
while ((time(NULL) - StartTime) < I2C_TIMEOUT_MILLISECONDS)
{
//printf("%d", &Value);
if (!CYPRESS_I2C_GetCyGpio(I2C_ACCESS_GRANTED_GPIO, &Value))
{
break;
}
if (Value == 1)
{
if (!CYPRESS_I2C_SetCyGpio(START_I2C_TRANSACTION_GPIO, 1))
{
break;
}
CyI2cReset(s_Handle, false);
CyI2cReset(s_Handle, true);
return true;
}
}
2.后来我将主函数下的所有关于写入的函数注释掉,并再次运行,代码如下
//dlpc347x_samples.c
//main函数,移除写入操作
while (true)
{
InitConnectionAndCommandLayer();
bool Status = CYPRESS_I2C_RequestI2CBusAccess();
if (Status != true)
{
printf("Error Request I2C Bus ACCESS!!!");
return;
}
DLPC34XX_ControllerDeviceId_e DeviceId = DLPC34XX_CDI_DLPC3479;
DLPC34XX_ReadControllerDeviceId(&DeviceId);
printf("Controller Devicde Id = %d \n", DeviceId);
uint16_t PixelsPerLine, LinesPerFrame;
DLPC34XX_ReadInputImageSize(&PixelsPerLine, &LinesPerFrame);
printf("Input Image Size = 0x%x, 0x%x \n", PixelsPerLine, LinesPerFrame);
//LoadPreBuildPatternData();
//LoadPatternOrderTableEntryfromFlash();
//DLPC34XX_WriteTriggerOutConfiguration(DLPC34XX_TT_TRIGGER2,
// DLPC34XX_TE_ENABLE, DLPC34XX_TI_NOT_INVERTED, 0);
//DLPC34XX_WriteOperatingModeSelect(DLPC34XX_OM_SENS_INTERNAL_PATTERN);
//DLPC34XX_WriteInternalPatternControl(DLPC34XX_PC_START, 0x0);
//WaitForSeconds(3);
if (CYPRESS_I2C_RelinquishI2CBusAccess())
{
printf("RelinquishI2CBusAccess\n\n");
}
}
此时运行结果如下,循环正常运行

3.经过debug,我发现只要程序经DLPC_COMMON_SendWrite()函数成功写入过数据,主函数循环就只能执行一次。只能通过断电重置投影仪,再次运行出现同样的问题
这意味着投影仪无法正常待机,我每次使用投影仪必须先断开电源,请问如何解决?