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

 
 
> 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
 
Start new topic
Ответов
avva
сообщение Sep 18 2008, 12:01
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 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



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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 20:12
Рейтинг@Mail.ru


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