I2C Master Read
Mittwoch, 23. Mai 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  PIC Mikrocontroller Allgemein  |  Schnittstellen (Allgemein)  |  I2C Master Read « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: I2C Master Read  (Gelesen 754 mal)
 
AnyKey
Newbie
*
Offline Offline

Beiträge: 35



Profil anzeigen
« am: Juni 09, 2011, 09:12:24 »

Hallo,
ich versuche mit dem Master des PIC von einem Slave zu lesen.
Das erste Byte bekomme ich noch mit, danach bekomme ich nur ich einen High Pegel auf der Datenleitung und den Clock auf der Clockleitung.
Im Beispiel, von MPLAB, wird nur ein Byte gelesen, ich möchte aber vier oder mehr Bytes lesen.
Hat Jemand ein Beispiel in dem mehrere Bytes von der I2C gelesen werden?
Oder sieht Jemand den Bug den ich gemacht habe?

Hier der angepasste Code:
Code:
void I2CRead(int device, char adr, unsigned char* data,int length)
{
int result=0;
int i=0;
I2C_7_BIT_ADDRESS slave;

//Start Einleiten
result = StartTransfer(device, FALSE);

// Adresse und R/W senden
I2C_FORMAT_7_BIT_ADDRESS(slave, adr, I2C_READ);
result = TransmitOneByte(device, slave.byte);
Wait();
//Daten lesen
while(i<length)
{
if(I2CReceiverEnable(device, TRUE) == I2C_RECEIVE_OVERFLOW)
{
   DBPRINTF("Error: I2C Receive Overflow\n");
}
else
{
   while(!I2CReceivedDataIsAvailable(device));
   *data = I2CGetByte(device);
Wait();
data++;
i++;
}
}
StopTransfer(device);
}

Gruß Robert
« Letzte Änderung: Juni 09, 2011, 13:15:10 von AnyKey » Gespeichert
AnyKey
Newbie
*
Offline Offline

Beiträge: 35



Profil anzeigen
« Antworten #1 am: Juni 09, 2011, 13:14:45 »

Für Alle die es benötigen:
Code:
/*********************************************

*********************************************/
void I2CRead(int device, char adr, unsigned char* data,int length)
{
int result=0;
I2C_7_BIT_ADDRESS slave;
//Start Einleiten
result = StartTransfer(device, FALSE);
// Adresse und R/W senden
I2C_FORMAT_7_BIT_ADDRESS(slave, adr, I2C_READ);
result = TransmitOneByte(device, slave.byte);
//Daten lesen
while(length--)
{
if(I2CReceiverEnable(device, TRUE) == I2C_RECEIVE_OVERFLOW)
{
    DBPRINTF("Error: I2C Receive Overflow\n");
}
else
{
    while(!I2CReceivedDataIsAvailable(device));
    *data = I2CGetByte(device);
if(length)
{
I2CAcknowledgeByte(device, TRUE);
I2C_Wait();
}
data++;
}
}
StopTransfer(device);
}

/*********************************************

*********************************************/
void I2C_Wait(void)
{
int i=20;//bei 400kHz I2C Freq
while(i--);
}

Gruß Robert
Gespeichert
Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  

Powered by MySQL Powered by PHP Made for Mozilla (Firefox) Made for Internet Explorer
Seite erstellt in 0.054 Sekunden mit 18 Zugriffen.
 
Top! Top!