Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LPC2478 и I2C
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Alexander_84
Вообщем проблема в том, что дальше start condition обмен данными не идет. Т.е. START проходит нормально в I2C0STAT оявляется 0x08, а дальше в I2C0STAT постоянно 0xF8. Плата от Embedded Artists LPC2478 OEM Board
код

Код
main
{

I2C_Init();
I2C_Transfer();

}

void I2C_Init(void)
{
  
  PCONP_bit.PCI2C0 = 1;
  I2C0SCLH = 0x0191;
  I2C0SCLL = 0x0190;
  PINSEL1_bit.P0_27 = 1;
  PINSEL1_bit.P0_28 = 1;
  I2C0CONCLR = 0xFF;
  VIC_SetVectoredIRQ(I2C0IntrHandler, 0, VIC_I2C0);
  VICINTENABLE |= 1 <<  VIC_I2C0;
  I2C0CONSET_bit.I2EN = 1;
}

void I2C_Transfer(void)
{
  
  
  I2C0CONSET_bit.STA = 1;
  
}

void I2C0IntrHandler (void)
{
  switch(I2C0STAT)
  {
    case(0x08): //старт проходит нормально, а дальше в I2C0STAT 0xF8
      I2C0DAT = 0xC0;
      I2C0CONCLR_bit.STAC = 1;  
    break;
    
    case(0x18):
      I2C0DAT = 0x09;
    break;

    default:
      FIO2CLR_bit.P2_10=1;
    break;
  }
I2C0CONCLR_bit.SIC = 1;

}
Qwertty
Цитата(Alexander_84 @ Sep 14 2008, 15:35) *
Вообщем проблема в том, что дальше start condition обмен данными не идет. Т.е. START проходит нормально в I2C0STAT оявляется 0x08, а дальше в I2C0STAT постоянно 0xF8. Плата от Embedded Artists LPC2478 OEM Board
код


А I2C0IntrHandler это обработчик прерывания?
Конструкции типа VIC_SetVectoredIRQ(I2C0IntrHandler, 0, VIC_I2C0); недостаточно. Если это просто функция, то она отработает один раз only, при выходе процессор останется в режиме irq с запрещенными прерываниями - ну и т.д.
Alexander_84
обработчик сделан вот так, функция уже из него вызывается
Код
__irq __arm void IRQ_Handler (void)
{
void (*interrupt_function)();
unsigned int vector;
//FIO2CLR_bit.P2_10=1;

  vector = VICADDRESS;     // Get interrupt vector.
  interrupt_function = (void(*)())vector;
  if(interrupt_function != 0)
  {
   // FIO2CLR_bit.P2_10=1;
    interrupt_function();  // Call vectored interrupt function.
  
  }
  else
  { //FIO2CLR_bit.P2_10=1;
    VICADDRESS = 0;      // Clear interrupt in VIC.
  }
  VICADDRESS=0;
}


прерывания по таймеру работают нормально
Сейчас еще осциллографом посмотрел SDA ставится в 0 примерно на 5мкс и отпускается а SCL вообще в 0 не ставится
avva
вы забыли устанавливать ACK, который показывает что это не последний байт
вот так будет правильно

// only master mode ()

case(0x10): //repeated start
case(0x08): //старт проходит нормально, а дальше в I2C0STAT 0xF8
I2C0DAT = 0xC0;
I2C0CONSET_bit.AA = 1;
I2C0CONCLR_bit.STAC = 1;
break;

case(0x18): //SLA+W transmitted && ACK received
if (data_count>1) {
I2C0CONSET_bit.AA = 1; //AA=0x04 если передача более одного байта последовательно иначе передавайте 0
I2C0DAT = 0x09;
data_count -=1;
}else{
I2C0CONSET =0x14; //set STOP && AA
}
break;

case(0x28): //data transmitted & ack received то же самое что и 0х18, тока ешё если repeated_start нужен, то посылаем 0х24

if (data_count>1) {
I2C0CONSET_bit.AA = 1; //0x04 если передача более одного байта последовательно иначе передавайте 0
I2C0DAT = 0x09;
data_count -=1;
}else{
I2C0CONSET =0x14; //set STOP && AA
}else if (need_repeated_start){
I2C0CONSET =0x24; //set REPEATED START && AA
}
break;
CAWA
В 0x10: и 0x08:
очищать надо же не STA а SI

I2C0CONCLR_bit.SIC = 1;//не STAC = 1; ни фига
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.