реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> LPC2478 и I2C
Alexander_84
сообщение Sep 14 2008, 11:35
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 14-09-08
Пользователь №: 40 181



Вообщем проблема в том, что дальше 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;

}
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Sep 14 2008, 16:34
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(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 с запрещенными прерываниями - ну и т.д.
Go to the top of the page
 
+Quote Post
Alexander_84
сообщение Sep 15 2008, 06:14
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 14-09-08
Пользователь №: 40 181



обработчик сделан вот так, функция уже из него вызывается
Код
__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 не ставится

Сообщение отредактировал Alexander_84 - Sep 15 2008, 06:43
Go to the top of the page
 
+Quote Post
avva
сообщение Sep 18 2008, 12:01
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 15-02-07
Из: Москва
Пользователь №: 25 386



вы забыли устанавливать 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;


--------------------
С уважением,
Go to the top of the page
 
+Quote Post
CAWA
сообщение Mar 6 2014, 14:36
Сообщение #5





Группа: Новичок
Сообщений: 1
Регистрация: 6-03-14
Из: Saratov
Пользователь №: 80 837



В 0x10: и 0x08:
очищать надо же не STA а SI

I2C0CONCLR_bit.SIC = 1;//не STAC = 1; ни фига
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 11th July 2025 - 03:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.0162 секунд с 7
ELECTRONIX ©2004-2016