mikrocontroller.net

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


Autor: Chris Kl (chrisch)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Chris Kl (chrisch)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.