mikrocontroller.net

Forum: Compiler & IDEs I2C Anfänger-Probleme


Autor: Till H. (mohman)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen, ich versuche den i2c-bus zum laufen zu bringen! ich 
hoffe ihr könnt mir weiter helfen! ich seh das problem nicht...seh den 
wald vor lauter bäumen nicht...:(

hier einmal der code für den master!





MfG
Till

Autor: Till H. (mohman)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
und hier und die funktionen vom master!

Autor: Till H. (mohman)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
und das gleiche für den slave

Autor: Till H. (mohman)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hmm

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
[c]
//-------------------------------------------------------------
//TWI.h : header file for the master Two-wire Serial Interface
//-------------------------------------------------------------

#ifndef TWI_H
#define TWI_H

//-------------------------------------------
// Definition of global includes
//-------------------------------------------

#include "MyTypeDefs.h"

//-------------------------------------------
// Definition of global constants
//-------------------------------------------

#define F_SCL  400000UL     // 400 kHz for SCL

//-------------------------------------------
// Declaration of global functions
//-------------------------------------------

void TWI_init(void);

u08 TWI_read (u08 TWI_adr, u08 *val, u08 count);
u08 TWI_write(u08 TWI_adr, u08 *val, u08 count);

#endif
[\c]

[c]
//--------------------------------------------------------
//TWI.c : source file for the master Two-wire Serial Interface
//--------------------------------------------------------

//-------------------------------------------
// Definition of local includes
//-------------------------------------------

#include <util/twi.h>
#include <util/delay.h>
#include "TWI.h"

//-------------------------------------------
// Definition of local constants
//-------------------------------------------

#define TW_MT_ACK (u08)0x08  // master transfer acknowledge for address 
or data

//-------------------------------------------
// Declaration of local variables
//-------------------------------------------

static volatile u16 I2C_timer;

//-------------------------------------------
// Declaration of local functions
//-------------------------------------------

//-------------------------------------------
// Code for functions
//-------------------------------------------

void delay_us(u08 delay)
{
  while (delay--) _delay_us(1);
}

//--------------------------------------------------------
// Intialize the I2C-Bus Interface
// as Master with SCL 100kHz, non interrupt driven
//--------------------------------------------------------


void TWI_init(void)
{
  //--------------------------------------------------------
  // SCL = F_CPU/(16+2*TWBR*4^TWSR)
  // TWSR=0 => TWBR = F_CPU/2/F_SCL-8
  //--------------------------------------------------------
  TWBR = (u08)(F_CPU/2/F_SCL-7.5);
  TWSR = 0x00;                     // TWI-clock prescaler = (TWSR+1) = 1
  TWCR = (1<<TWEA)|(1<<TWEN);      // no interrupt mode
}

u08 TWI_read(u08 TWI_adr, u08 *val, u08 count)
//------------------------------------------------
// Read n=count bytes from I2C-Bus in polled mode
// needs about 200us for reading addr + one byte
//------------------------------------------------
{
  u08 i=0, rc=0;
  TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);     // send START condition
  while (!(TWCR & (1<<TWINT)));               // wait for response
  if ((TWSR & 0xF8) == TW_START)              // if START was successful
  {
    TWDR = (TWI_adr | 0x01);                  // put slave address+READ 
to TWDR
    TWCR = (1<<TWINT)|(1<<TWEN);              // and start transmission
    while (!(TWCR & (1<<TWINT)));             // wait for response
    if ((TWSR & 0xF8) == TW_MR_SLA_ACK)       // if acknowledge ok
    {
      while (--count>0)                       // while more than one 
byte to read
      {
        TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN);  // then start transfer 
with acknowledge
        while (!(TWCR & (1<<TWINT)));         // wait for response
        val[i++]=TWDR;                        // read databyte from TWDR
      }
      TWCR=(1<<TWINT)|(1<<TWEN);              // start last byte 
transfer without acknowledge
      while (!(TWCR & (1<<TWINT)));           // wait for response
      val[i]=TWDR;                            // read databyte from TWDR
    }
    else
    {
      //printl_I("Error: I2C[R] Addr");
      rc = 0x10;
    }
  }
  else
  {
    //printl_I("Error: I2C[R] Start");
    rc = 0x20;
  }
  TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);      // transmit STOP 
condition
  delay_us(10);                                // wait until STOP is 
transmitted
  return rc;
}

u08 TWI_write(u08 TWI_adr, u08 *val, u08 count)
//------------------------------------------------
// write n=count bytes to I2C-Bus in polled mode
// needs about 200us for writing Addr + one byte
//------------------------------------------------
{
  u08 rc=0;
  TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);   // send START condition
  while (!(TWCR & (1<<TWINT)));             // wait for response
  if ((TWSR & 0xF8) == TW_START)            // if START was successful
  {
    TWDR = (TWI_adr & 0xFE);                // put slave address+WRITE 
to TWDR
    TWCR = (1<<TWINT)|(1<<TWEN);            // and start transmission
    for (u08 i=0; i<count; i++)
    {
      while (!(TWCR & (1<<TWINT)));         // wait for response
      if ((TWSR & 0xC8) == TW_MT_ACK)       // if acknowledge ok
      {
        TWDR = val[i];                      // put databyte  to TWDR
        TWCR = (1<<TWINT)|(1<<TWEN);        // and start transmission
      }
      else
      {
        //printl_I("Error: I2C[W] Data");
        rc=0x10;
      }
    }
  }
  else
  {
    //printl_I("Error: I2C[W] Start");
    rc=0x20;
  }
  while (!(TWCR & (1<<TWINT)));             // wait for response
  TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);   // transmit STOP condition
  delay_us(10);                             // wait until STOP is 
transmitted
  return rc;
}
[\c]

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
//-------------------------------------------------------------
//TWI.h : header file for the master Two-wire Serial Interface
//-------------------------------------------------------------

#ifndef TWI_H
#define TWI_H

//-------------------------------------------
// Definition of global includes
//-------------------------------------------

#include "MyTypeDefs.h"

//-------------------------------------------
// Definition of global constants
//-------------------------------------------

#define F_SCL  400000UL     // 400 kHz for SCL

//-------------------------------------------
// Declaration of global functions
//-------------------------------------------

void TWI_init(void);

u08 TWI_read (u08 TWI_adr, u08 *val, u08 count);
u08 TWI_write(u08 TWI_adr, u08 *val, u08 count);

#endif
//--------------------------------------------------------
//TWI.c : source file for the master Two-wire Serial Interface
//--------------------------------------------------------

//-------------------------------------------
// Definition of local includes
//-------------------------------------------

#include <util/twi.h>
#include <util/delay.h>
#include "TWI.h"

//-------------------------------------------
// Definition of local constants
//-------------------------------------------

#define TW_MT_ACK (u08)0x08  // master transfer acknowledge for address
or data

//-------------------------------------------
// Declaration of local variables
//-------------------------------------------

static volatile u16 I2C_timer;

//-------------------------------------------
// Declaration of local functions
//-------------------------------------------

//-------------------------------------------
// Code for functions
//-------------------------------------------

void delay_us(u08 delay)
{
  while (delay--) _delay_us(1);
}

//--------------------------------------------------------
// Intialize the I2C-Bus Interface
// as Master with SCL 100kHz, non interrupt driven
//--------------------------------------------------------


void TWI_init(void)
{
  //--------------------------------------------------------
  // SCL = F_CPU/(16+2*TWBR*4^TWSR)
  // TWSR=0 => TWBR = F_CPU/2/F_SCL-8
  //--------------------------------------------------------
  TWBR = (u08)(F_CPU/2/F_SCL-7.5);
  TWSR = 0x00;                     // TWI-clock prescaler = (TWSR+1) = 1
  TWCR = (1<<TWEA)|(1<<TWEN);      // no interrupt mode
}

u08 TWI_read(u08 TWI_adr, u08 *val, u08 count)
//------------------------------------------------
// Read n=count bytes from I2C-Bus in polled mode
// needs about 200us for reading addr + one byte
//------------------------------------------------
{
  u08 i=0, rc=0;
  TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);     // send START condition
  while (!(TWCR & (1<<TWINT)));               // wait for response
  if ((TWSR & 0xF8) == TW_START)              // if START was successful
  {
    TWDR = (TWI_adr | 0x01);                  // put slave address+READ
to TWDR
    TWCR = (1<<TWINT)|(1<<TWEN);              // and start transmission
    while (!(TWCR & (1<<TWINT)));             // wait for response
    if ((TWSR & 0xF8) == TW_MR_SLA_ACK)       // if acknowledge ok
    {
      while (--count>0)                       // while more than one
byte to read
      {
        TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN);  // then start transfer
with acknowledge
        while (!(TWCR & (1<<TWINT)));         // wait for response
        val[i++]=TWDR;                        // read databyte from TWDR
      }
      TWCR=(1<<TWINT)|(1<<TWEN);              // start last byte
transfer without acknowledge
      while (!(TWCR & (1<<TWINT)));           // wait for response
      val[i]=TWDR;                            // read databyte from TWDR
    }
    else
    {
      //printl_I("Error: I2C[R] Addr");
      rc = 0x10;
    }
  }
  else
  {
    //printl_I("Error: I2C[R] Start");
    rc = 0x20;
  }
  TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);      // transmit STOP
condition
  delay_us(10);                                // wait until STOP is
transmitted
  return rc;
}

u08 TWI_write(u08 TWI_adr, u08 *val, u08 count)
//------------------------------------------------
// write n=count bytes to I2C-Bus in polled mode
// needs about 200us for writing Addr + one byte
//------------------------------------------------
{
  u08 rc=0;
  TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);   // send START condition
  while (!(TWCR & (1<<TWINT)));             // wait for response
  if ((TWSR & 0xF8) == TW_START)            // if START was successful
  {
    TWDR = (TWI_adr & 0xFE);                // put slave address+WRITE
to TWDR
    TWCR = (1<<TWINT)|(1<<TWEN);            // and start transmission
    for (u08 i=0; i<count; i++)
    {
      while (!(TWCR & (1<<TWINT)));         // wait for response
      if ((TWSR & 0xC8) == TW_MT_ACK)       // if acknowledge ok
      {
        TWDR = val[i];                      // put databyte  to TWDR
        TWCR = (1<<TWINT)|(1<<TWEN);        // and start transmission
      }
      else
      {
        //printl_I("Error: I2C[W] Data");
        rc=0x10;
      }
    }
  }
  else
  {
    //printl_I("Error: I2C[W] Start");
    rc=0x20;
  }
  while (!(TWCR & (1<<TWINT)));             // wait for response
  TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);   // transmit STOP condition
  delay_us(10);                             // wait until STOP is
transmitted
  return rc;
}

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ADMINS

Hallo Admins! Ich finde es zum kotzen: Wie wär es, wenn ihr es endlich 
mal auf die Reihe kriegt, dass man mehr als 80 Zeichen auf eine Zeile 
bringt, ohne dass automatisch Zeilenumbrüche eingefügt werden. 120 
Zeichen wäre das Minimum. Oder viel besser: beliebig lang bis zum 
gewollten Zeilenumbruch, ansonsten dynamische Zeilenlängen (je nach 
Fensterbreite). Sowas ist heutzutage doch State-of-the-Art!!!

Autor: was-willst-du (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn was zum kotzen ist, dann der ton mancher user hier im forum

tststst

Autor: Till H. (mohman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hey danke für die schnelle antwort, guck mir das mal genauer an :) aber 
ist mein code total für die katz ?:(

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.