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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.