Цитата(aaarrr @ Nov 19 2007, 16:22)

Странно: из регистра 0x0F читается 0x0F, а с остальными все в порядке. Похоже на программный глюк. После сброса там точно 0x2a должно быть.
Код
LPC2294CEClear(); //Ресет САА
for(long i=1;i<1000000;i++)
{}
LPC2294CESet();
for(long i=1;i<10000000;i++)
{}
printf( "Tr1 \n\r" );
for(char i=1;i<=23;i++)
{
saa7113WSub(i, Saa7113InitMass[i]); //Запись байта Saa7113InitMass[i] в регистр i
for(long j=1;j<10000000;j++)
{}
printf("%d = %d\n\r", Saa7113InitMass[i], saa7113RSub(i));
while(saa7113RSub(i)!=Saa7113InitMass[i]) //Чтение байта из регистра i
{
printf("Error #%d\n\r", i);
saa7113WSub(i, Saa7113InitMass[i]);
for(long j=1;j<1000000;j++)
{}
}
printf("%d\n\r",i);
}
//Функция чтения байта
unsigned char saa7113RSub(unsigned char Sub)
{
I2CSub = Sub; // задать функцию
wr_rd = 1; //установить признак чтения
end_rd = 0; //сбросить признак окончания чтения
I2CONCLR = 0xFF; // сбросить все флаги I2C
I2CONSET = 0x40; // разрешение I2C
I2CONSET = 0x20; // передать условие START I2C
while (end_rd == 0); // ожидать окончания чтения
return I2DAT; //возврат прочитанного байта
}
//Функция записи байта
void saa7113WSub(unsigned char Sub, unsigned char data_I2C)
{
I2CSub = Sub; // задать функцию
I2Cwr_byte = data_I2C; // задать байт данных для записи
wr_rd = 0; //установить признак записи
I2CONCLR = 0xFF; // сбросить все флаги I2C
I2CONSET = 0x40; // разрешение I2C
I2CONSET = 0x20; // передать условие START I2C
}
//функция-обработчик прерывания от I2C --------------------------------------------
static void I2CInterrupt()
{
switch(I2STAT)
{
case (0x08): // было передано условие START
I2CONCLR = 0x20; //сброс флага START I2C
I2DAT=72; //передача адреса устр на шине и признака записи (W)
break;
case (0x10): // было передано условие повторный START
I2CONCLR = 0x20; //сброс флага START I2C
I2DAT=73; //передача адреса устр на шине и признака чтения (R)
break;
case (0x18): // был передан адрес ведомого + W, получен ACK
//передача адреса
I2DAT=I2CSub;
break;
case (0x28): // был передан байт данных, получен ACK
switch(wr_rd)
{
case (0):
//передача байта данных
I2DAT=I2Cwr_byte;
break;
case (1):
// передать условие START I2C
I2CONSET = 0x20; // повторный START
break;
default:
break;
}
break;
case (0x40): // был передан адрес ведомого + R, получен ACK
I2CONCLR = 0x04; //сброс флага ACC I2C, чтобы возвратить NOT ACK
break;
case (0x58): // был получен байт данных, возвращен ACK
I2CONSET = 0x10; // передать условие STOP I2C
end_rd = 1; //установить признак окончания чтения
break;
default:
break;
}
I2CONCLR = 0x08; // сброс прерывания от I2C
}
Вродебы всё идёт так как и должно итти, я имею в виду чтение там, запись...