Hallo, Ich habe mit Altium Designer eine Schaltung aufgebaut (Wishbone-Interface), einen Softprozessor sowie eine I2C - Schnittstelle plaziert. Damit der Prozessor weiß was er tun muss, soll er programmiert werden. Das ist bestimmt sehr, sehr simpel ..aber wie sieht meine C-Datei aus ? Natürlich steht in den Datenblätter welche Bits bei welchen Registern was machen, aber wie realisiere ich denn so einen Schreib und einen Lesezyklus ?? Es geht mir also um die Kommuniktion zwischen Prozessor und I2C-Controller. Ich habe auch schon bei der Programmierung von uC nachgeschlagen, da war viel hilfreiches dabei. Ich schicke euch mal den relevanten Auschnitt meiner Schaltung und morgen poste ich das an Code, was ich bis jetzt habe. Also es ist garnicht so wichtig, ob ihr mit Wishbone oder Altium oder sonst was arbeitet, sondern die allgemeine Vorgehensweise - die Syntax (Signale, Register, Bitwerte ändern, Timing??) interessiert mich und das halt in C. Hat jemand vielleicht auch ein kleines Beispiel .. aber ihr sollt natürlich nicht meine Arbeit machen. Nur kann ich mich damit nicht ewig aufhalten, das Projekt hat eigentlich andere Ziele. Wie gesagt, morgen poste ich mal den Code. Hmm .. ich danke euch. Und ja, es gibt schon viele Threads zum Thema, aber ich habe die heimliche Hoffnung, dass sich hier vielleicht doch ein Altium-Designer Nutzer befindet, der mir auch gleich sagen kannn, ob ich den Interconnect auch noch programmieren muss... Ps. ich glaube ich habe einfach ein Verständnisproblem! Wenn ich schon spezielle Interface-Komponenten auf den Schaltplan packe, warum muss ich denn beim Programmieren immer noch jedes Signal beim Schreib/Lese-zyklus selbst vereinbaren ..weiterschicken ..terminieren, Flags in Registern setzen ..? Warum reicht es nicht, per 3-Bit Unique-Adresse ein Controlregister anzustossen und der ganz Zyklus läuft automatisiert ab? Wo ist mein Denkfehler? Würdet ihr bei solchen einfachen Sachen denn eher zu C oder Assembler tendieren ? Und ..lässt sich das ganze auch (schneller, hardwareeffizienter..) in VHDL regeln ? Soviele Fragen. viele Grüße
#include "hardware.h" #include "defines.h" #include "stdio.h" //main void main(void) { ... } //single write void writeHost2I2CM(void) { while (ADR_I & 0x100) { // host presents data and asserts WE_O s0_DAT_O=0x0; s0_WE_0=1; // I2CM_W prepares to receive data in register //Host begins transfer s0_STB_O= ~(s0_STB_O); s0_CYC_O= ~(s0_CYC_O); // I2CM_W while ((s0_STB_O = 1)&( s0_CYC_O = 1)) { // latch data von DAT_I ins Register s0_ACK_I =~ (s0_ACK_I); } // Host antwortet while (s0_CLK_O & 1) { s0_STB_O=~(s0_STB_O); s0_CYC_O=~(s0_CYC_O); s0_ACK_I=~(s0_ACK_I); // Data transfer terminated } } } //single Read void ReadInteralRegisters(void) { while (ADR_I & 0x100) { // host presents unique ID and asserts WE_O to specify read cycle s0_WE_0=0; // I2CM receives ID; prepares to transmit data from the select. reg // host begins transfer s0_STB_O= ~(s0_STB_O); s0_CYC_O= ~(s0_CYC_O); // I2CM while (s0_CLK_O & 1) { s0_DAT_I=0x0; s0_ACK_I=~(s0_ACK_I); // Data is present } //host reacts while (s0_CLK_O & 0xF) { //daten werden von DAT_I ins reg gelatcht s0_STB_O=~(s0_STB_O); s0_CYC_O=~(s0_CYC_O); s0_ACK_I=~(s0_ACK_I); // Data transfer terminated } } } Es zird fehlerlos kompiliert, allerdings hab ich es nocht nicht aufs Board hochgeladen.
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.