
Проверил - работает в CW и в IAR.
Код
//#define _DEBUG_LOOP_
#ifdef _DEBUG_LOOP_ /* для установки отладочных ловушек объявить этот символ */
#define DebugLoop(a) a { DisableIRQ_FIQ(); while (1); }
#else
#define DebugLoop(a) {}
#endif
int I2CEngine(uInt wrCnt, uInt rdCnt)
{
long time_out = 100000; // можно сделать зависимость от wrCnt и rdCnt
I2CWrLength = wrCnt;
I2CRdLength = rdCnt;
I2CRdIndex = 0;
I2CWrIndex = 0;
if (I2CStart() == 0) return I2C_ERROR;
while (--time_out >= 0)
{
if (I2CMasterState >= I2C_SUCCESS) // дальше I2C_SUCCESS все ошибки
{
DebugLoop(if (I2CMasterState != I2C_SUCCESS)); // <<<------------------------- обратите внимание на это
return I2CMasterState;
}
}
DebugLoop();
return I2C_TIMEOUT;
}
#ifdef _DEBUG_LOOP_ /* для установки отладочных ловушек объявить этот символ */
#define DebugLoop(a) a { DisableIRQ_FIQ(); while (1); }
#else
#define DebugLoop(a) {}
#endif
int I2CEngine(uInt wrCnt, uInt rdCnt)
{
long time_out = 100000; // можно сделать зависимость от wrCnt и rdCnt
I2CWrLength = wrCnt;
I2CRdLength = rdCnt;
I2CRdIndex = 0;
I2CWrIndex = 0;
if (I2CStart() == 0) return I2C_ERROR;
while (--time_out >= 0)
{
if (I2CMasterState >= I2C_SUCCESS) // дальше I2C_SUCCESS все ошибки
{
DebugLoop(if (I2CMasterState != I2C_SUCCESS)); // <<<------------------------- обратите внимание на это
return I2CMasterState;
}
}
DebugLoop();
return I2C_TIMEOUT;
}
Если это кто-то уже изобрёл до меня - дайте плиз ссылку. Хотелось бы убедиться
