Спасибо за оперативность и профессионализм. А также за уместную критику - сделал всё как Вы сказали(НО ПОКА БЕЗ РЕЗУЛЬТАТА): и последовательность инициалцизации и проверку флага.
Кстати, насчёт флага я посмотрел, вроде это то что нужно, цитирую, ARDYIFG
Прерывание «регистр доступен для чтения». Этот флаг устанавливается, когда ранее
запрограммированный перенос завершен, и биты статуса обновлены. Это прерыва-
ние используется для уведомления ЦПУ о том, что регистры I2C готовы к доступу.
В прерывании я сделал проще некуда
#pragma vector=USART0TX_VECTOR
__interrupt void I2C_ISR(void)
{
switch(I2CIV)
{
case 10: // Receive Ready
//if(i2c_n < 10)
i2c_buf[i2c_n] = I2CDRB;
i2c_n++;
I2CIE &= ~RXRDYIE;
break;
case 12:
I2CDRB = i2c_buf[i2c_tx_n];
i2c_tx_n --;
if(i2c_tx_n < 0)
I2CIE &= ~TXRDYIE; // disable interrupts
break; // Transmit Ready
}
}
Привидите пожалуйста пример в образовательных целях, если есть у кого. Спасибо.
Цитата(rezident @ Mar 12 2007, 19:24)

Как-то замысловато вы проверяете флаг. Зачем инвертировать содержимое регистра при проверке всего лишь одного бита? Кроме затрудения понимания смыла это операция еще и оверхед на пару команд создает. Сравните сами
Код
// 55 while (~I2CIFG&ARDYIFG); // ВОТ ЗДЕСЬ ФЛАГ НЕ ВЫСТАВЛЯЕТСЯ (иногда реальные данные уходят и ложаться в микруху
??i2c_write_byte_0:
MOV.B &0x51, R11
XOR.B #0xff, R11
BIT.B #0x8, R11
JNE ??i2c_write_byte_0
Попробуйте написать попроще, например, так
Код
while ((I2CIFG&ARDYIFG)==0);
Получится
Код
// 55 while ((I2CIFG&ARDYIFG)==0); // ВОТ ЗДЕСЬ ФЛАГ НЕ ВЫСТАВЛЯЕТСЯ (иногда реальные данные уходят и ложаться в микруху
??i2c_write_byte_0:
BIT.B #0x8, &0x51
JNC ??i2c_write_byte_0
Явное сравнение с нулем всегда более корректно компилируется и более доступно для понимания смысла операции.
По самой проверке флага, который якобы не устанавливается.
Вы внимательно прочитали описание событий по которому ARDYIFG устанавливается? Раздел
15.2.8 I2C Interrupts из User's Guide.
Кроме того в строке
Код
I2CIE = RXRDYIE + RXRDYIE + NACKIE;
У вас дважды суммируется флаг RXRDYIE, что дает неправильную маску для I2CIE (0x22, вместо желаемых 0x12).
Вся процедура инициализации неправильно построена. См. пояснения в разделе
15.2.1 I2C Module Initialization из User's Guide. Там приведен вполне конкретный порядок для инициализации регистров USART в режиме I2C.
Ну и другое по мелочи. Типа вроде как используете прерывания, а процедуру обработки прерываний от I2C здесь не привели.