Реализация I2C

Komandir
Offline
Зарегистрирован: 18.08.2018

DIVGENY Для Wire надо писать именно 0x29 и она сама сделает 0x52 при чтении и 0x53 при записи.

DIVGENY
Offline
Зарегистрирован: 23.08.2016

 зачем делать СВОЮ библиотеку и идти по граблям других 

 

#define sda 4 //?
#define scl 5  //?

char Data = 0;
int8_t i8;

      
void iic_SetSDA() {
  PORTC |= (1 << sda);
  //    delayMicroseconds(30);
  delayMicroseconds(5);
}

void iic_ClrSDA() {
  PORTC &= ~(1 << sda);
  //   delayMicroseconds(30);
  delayMicroseconds(5);
}

char iic_GetSDA() {
  return (PINC & (1<<sda)) != 0;
}

void iic_SetSCL() {
  PORTC |= (1 << scl);
  //  delayMicroseconds(30);
  delayMicroseconds(10);
}

void iic_ClrSCL() {
  PORTC &= ~(1 << scl);
  //  delayMicroseconds(30);
  delayMicroseconds(5);
}

char iic_GetSCL() {
  return (PINC & (1<<scl)) != 0;
}

void iic_Start() {
  iic_ClrSDA();
}

void iic_Write(char c) {
  int i;
  for(i=0;i<8;i++) {
    iic_ClrSCL();
    if(c & 0x80) iic_SetSDA();
    else iic_ClrSDA();
    c = c << 1;
    iic_SetSCL();
  }
  iic_ClrSCL();
  iic_ClrSDA();//ACK
  iic_SetSCL();
}

char iic_Read() {
  int i;
  char c = 0;
  iic_ClrSCL();//!
  DDRC  &= ~(1 << sda);//in
  iic_SetSDA();
  for(i=0;i<8;i++) {
    iic_ClrSCL();//5us
    delayMicroseconds(5);

    iic_SetSCL();
    c = c << 1;
    if(PINC & (1 << sda)) c++;

  }
  iic_ClrSCL();
  DDRC |= (1 << sda);//out   
  iic_SetSDA();//NACK 
  iic_SetSCL();
  return c;
}

void iic_Stop() {
  iic_ClrSCL();
  iic_ClrSDA();
  iic_SetSCL();
  iic_SetSDA();
}

void iic_init() {
  DDRC |= (1 << sda) | (1 << scl);//out
  PORTC |= (1 << sda) | (1 << scl);//1
}


void iic_read(char addr) {
  iic_Start();
  iic_Write(addr);
  Data = iic_Read();
}

void setup(){

   iic_init();
       //------------------- инициализация XX
   iic_Start();
   iic_Write(0xXX);
   iic_Stop();

        //-------------------
  }

 void loop () {
 } 

 

-NMi-
Offline
Зарегистрирован: 20.08.2018

void iic_Write(char c) {

045   int i;
046   for(i=0;i<8;i++) {
047     iic_ClrSCL();
048     if(c & 0x80) iic_SetSDA();
049     else iic_ClrSDA();
050     c = c << 1;
051     iic_SetSCL();
052   }
053   iic_ClrSCL();
054   iic_ClrSDA();//ACK
055   iic_SetSCL();
056

}

Да уж. На ассемблере этот кусочек кода будет раз в 20 короче и во столько-же раз бысрее. "библиАтекари )))

 

Logik
Offline
Зарегистрирован: 05.08.2014

DIVGENY пишет:

 зачем делать СВОЮ библиотеку и идти по граблям других 

По граблям - это твой код использовать. Потому и пишем свое что такие криворукие как ты такой говнокод публикуют. Рекомендации лучших собаководов. Уверен что контроль ACK стр.53-55 реализован согласно стандарту? Хоть раз пробовал узнать, приняты ли данны или и так сойдет )))

Почитай, здесь доступно  http://www.gaw.ru/html.cgi/txt/doc/micros/avr/arh_xmega_a/19_3.htm

Обрати внимание например на

Таких устройств - валом. И если твой код работает с 1602 прошлого века, в котором такого нет то это ниче не значить. Теперь смотри, ты выставил SCL в 1, так просто порт в HIGH, а не как положено отпустил в расчете что подтяжка есть к VCC. А слейв сделал 0 для задержки синхронизации. Что сгорит первым? прием ACK аналогично.

DIVGENY
Offline
Зарегистрирован: 23.08.2016

 замечангия приняты и отчасти справедливы.

-NMi-

всегда на ассемблере пишешь, что тогда тут делаешь.??

Logik

код писался для управления одним простым устройством и не претендует на гениальность, а тем более для использования как библиотеки и выложен как пример. Я читал твой предыдущий пост по этому поводу.

всем удачи и беригите нервы...

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Нашы нервы - из толстых проводов, нам ничо не страшна. 

-NMi-
Offline
Зарегистрирован: 20.08.2018

DIVGENY пишет:

 -NMi-

всегда на ассемблере пишешь

 что тогда тут делаешь.??

Почти ВСЕГДА, если критично ко времени и размеру кода!

Чо делаю - с ДеДом бухаю!!!