Программа выглядит примерно так:
Код
main()
{
//.......
while (1)
{
EEPR_ReadData(...);
}
}
void Timer0IRQ(void)
{
// что-то делаю (~80 мкс)
}
int AT91F_TWI_ReadData(LPVOID Data, int Size)
{
int Error=0;
int Status,Count=0;
AT91PS_TWI pTwi = AT91C_BASE_TWI;
BYTE *pData = (BYTE*)Data;
pTwi->TWI_MMR |= AT91C_TWI_MREAD;
{
pTwi->TWI_CR = AT91C_TWI_START;
for(Count=0; Count<Size; Count++)
{
if (Count == (Size - 1)) pTwi->TWI_CR = AT91C_TWI_STOP;
Status = pTwi->TWI_SR;
while (!(Status & AT91C_TWI_RXRDY))
{
Status = pTwi->TWI_SR; // <---------- В этом цикле происходит зависание
}
*pData++ = pTwi->TWI_RHR;
}
}
return 0;
}
{
//.......
while (1)
{
EEPR_ReadData(...);
}
}
void Timer0IRQ(void)
{
// что-то делаю (~80 мкс)
}
int AT91F_TWI_ReadData(LPVOID Data, int Size)
{
int Error=0;
int Status,Count=0;
AT91PS_TWI pTwi = AT91C_BASE_TWI;
BYTE *pData = (BYTE*)Data;
pTwi->TWI_MMR |= AT91C_TWI_MREAD;
{
pTwi->TWI_CR = AT91C_TWI_START;
for(Count=0; Count<Size; Count++)
{
if (Count == (Size - 1)) pTwi->TWI_CR = AT91C_TWI_STOP;
Status = pTwi->TWI_SR;
while (!(Status & AT91C_TWI_RXRDY))
{
Status = pTwi->TWI_SR; // <---------- В этом цикле происходит зависание
}
*pData++ = pTwi->TWI_RHR;
}
}
return 0;
}
Т.е. получается что TWI не любит когда его прерывают на длительное время? Как с этим бороться, ведь теоретически прерывания могут длиться любое время.