Forum: FPGA, VHDL & Co. Register mit C ansprechen, Schreib/Lesezyklen


von Chris K. (chrisch)


Angehängte Dateien:

Lesenswert?

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

von Chris K. (chrisch)


Lesenswert?

#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
Noch kein Account? Hier anmelden.