Forum: Mikrocontroller und Digitale Elektronik I2C Controller testen


von Peter M. (whitsha)


Lesenswert?

Hallo,

nachdem ich in EDK ein I2C Controller erstellt habe, wollte ich 
ausprobieren ob dieser auch Daten senden kann.
Dazu habe ich 2 Pins von diesem Controller als extern gemacht (SDA und 
SCL) und folgendes C-Programm geschrieben.


#include "xparameters.h"
#include "xiic_l.h"

/* xparameters */

#define IIC_BASE_ADDRESS    XPAR_IIC_0_BASEADDR

#define Slave_Address  0x00

/************************** Function Prototypes 
******************************/

int DatenSenden(Xuint32 Basis,Xuint8  Slave, Xuint8 *Daten);

/************************** Variable Definitions 
*****************************/

int main(void)
{
//  Xuint8 GesDat=5; /* Xuint8 entspricht unsigned char*/
    Xuint8 Daten = 9;


    /*
     * Run the example, specify the Base Address that is generated in
     * xparameters.h
     */
    DatenSenden(IIC_BASE_ADDRESS, Slave_Address, &Daten);



    return 0;
}

/*Funktion selber zum Datensenden*/

int DatenSenden(Xuint32 Basis, Xuint8  Slave, Xuint8 *Daten)
{
    int ByteCount;

    xil_printf("Zuerst %d\t", ByteCount);


    ByteCount = XIic_Send(Basis, Slave, Daten, 1, XIIC_STOP);

    xil_printf("ByteCount %d\t", ByteCount);

    return ByteCount;


}


Als Ergebnis auf Hyperterminal bekomme ich 0. D.h. der Controller hat 
nicht gesendet.

als Slaveadrese habe ich 0x00. Kann man mit so einer Methode überprüfen 
ob der Controller sendet oder nicht?

Gruß, Peter

von Peter D. (peda)


Lesenswert?

Peter M. schrieb:
> #define Slave_Address  0x00

Du mußt Dir zuerst mal die I2C Spezifikation durchlesen, damit Du 
überhaupt weißt, was Du tust.

0x00 ist ein General Call.


> int DatenSenden(Xuint32 Basis,Xuint8  Slave, Xuint8 *Daten);

Da fehlt aber noch die Länge der Daten. Der Master muß doch wissen, 
wieviel Bytes er senden soll.


> Als Ergebnis auf Hyperterminal bekomme ich 0. D.h. der Controller hat
> nicht gesendet.

Vollkommen klar.
An SDA/SCL muß je ein Pullup und ein Slave, der auf die gesendeten 
Adresse+Daten ACK sendet.

Ohne Verständnis des I2C gehts nunmal nicht.


Was ist ein EDK?


Peter

von Peter M. (whitsha)


Lesenswert?

I2C Spezifikation habe ich schon durchgelesen und soweit verstanden.

> Da fehlt aber noch die Länge der Daten. Der Master muß doch wissen,
> wieviel Bytes er senden soll.

Die Funktion, die fürs senden zuständig ist ist ja weiter unten und da 
ist auch als 4 Parameter eine 1, d.h. ein Byte senden.

ByteCount = XIic_Send(Basis, Slave, Daten, 1, XIIC_STOP);


> Vollkommen klar.
> An SDA/SCL muß je ein Pullup und ein Slave, der auf die gesendeten
> Adresse+Daten ACK sendet.

die externen Pins habe ich mit internen Pullups versehen.

meine Frage ist es jetzt ob man ohne ein Slave an die Pins anzuschlißen, 
sehen kann ob der Master sendet bzw. mit Logic Analyzer die 
Startbedingung vom Master sehen. Ich wollte zuerst sehen ob das 
C-Programm und die Hardware funktioniert und erst dann den Slave 
anschließen.

> Was ist ein EDK?
EDK (Embedded Development Kit) ist ein Tool mit dem ich den 
Microcontroller als embedded System erstelle und im FPGA von Xilinx 
implementiere.

von Peter D. (peda)


Lesenswert?

Peter M. schrieb:
> meine Frage ist es jetzt ob man ohne ein Slave an die Pins anzuschlißen,
> sehen kann ob der Master sendet bzw. mit Logic Analyzer die
> Startbedingung vom Master sehen.

Mit Pullups solltest Du das START, das Adreßbyte, das NACK und das STOP 
sehen.
Und die Senderoutine sollte einen Fehlercode zurückgeben, daß die 
Adresse mit NACK beantwortet wurde.


Peter

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.