Hallo,
hat jemand schonmal im EFB-Block das I2C-Interface mit Wishbone Bus
erfolgreich zum Laufen gebracht?
Ich habe mir einen I2C-IP Core mit IPexpress erzeugt (Eckdaten fwb = 50
MHz und fi2c = 100kHz). Diesen wollte ich mittels des Reference Designs
von Lattice (rd1047) in Betrieb nehmen. Hierbei habe ich meinen
erzeugten I2C IP-Core an die Stelle des im Reference Design
eingebundenen Cores gesetzt und einige Parameter angepasst (Slave
Adresse). Ich wollte das Design mit dem Aldec simulieren jedoch bekomme
ich keine I2C Daten (sda)und keinen Takt (scl).
Ggf. kann mir jemand weiterhelfen bzw. sieht meinen Fehler.
Danke für die Hilfe.
Da ist mehr als nur ein paar Parameter anzupassen,
Der Hard I2C Block im MachXO2 ist ganz sicher nicht registerkompatibel
zu dem Soft I2C Block aus dem RD1046 Referenzdesign.
Hallo,
ich habe versucht die Register unter Anleitung des Lattice
Reference_Guide (TN1246) zu setzen, jedoch mach ich noch einen Fehler.
Dem User Guide ist zu entnehmen das jeder Wishbone Zyklus drei Takte
benötigt um das jeweilige Register zu setzen.
Somit warte ich immer auf ein ACK vom Wishbone Controller bevor ich das
nächste Register setze.
Also ACK da, neues Register wird gesetzt.
Der folgende Ausschnitt der State Machine zeigt wie ich die Register
setzte.
-- i2c core enable
when START =>
WB_WRITE_EN <= '1';
WB_CYCLE <= '1';
WB_STROBE <= '1;
-- CR
WB_ADRESS <= x"4A";
--CORE ENABLE
WB_DATA_IN <= x"8C";
if WB_ACK = '1' then
WB_WRITE_EN <= '0';
WB_CYCLE <= '0';
WB_STROBE <= '0';
STATE <= I_TXDR;
end if;
--initialize write cycle
when I_TXDR =>
WB_WRITE_EN <= '1';
WB_CYCLE <= '1';
WB_STROBE <= '1';
-- write to TXDR the slave address followed by Write bit ('0')
WB_ADRESS <= x"4E";
WB_DATA_IN <= SLAVE_ADRESS & '0';
if WB_ACK = '1' then
WB_WRITE_EN <= '0';
WB_CYCLE <= '0';
WB_STROBE <= '0';
STATE <= I_CMDR;
end if;
Alle weiteren Register setze ich nach diesem Schema.
Dabei habe ich mich an das State-Diagramm auf Seite 17-13 im UG
gehalten.
Nach Beenden des Write Prozesses, bekomme ich 0x20 vom WB-Controller
ausgegeben, das laut UG bedeutet im Staus Register SR ist RARC = 1.
SCL und SCA sind immer hochohmig 'Z'.
Ggf. hat jemand das Ding schon verwendet und kann mir weiterhelfen.
Vielen Dank.
In diesem Codeschnipsel ist nicht zu erkennen ob du den WB Cycle richtig
aufgesetzt hast.
Wie sieht die Simulation des WB aus?
PS: Verwende VHDL Tags für den geposteten Code. Wie die aussehen steht
in der Eingabe massen direkt über den Namen!
Dieser wird direkt auf den I2C-Core geführt. Das Signal S_WB_CLK
verwende ich in diesem Fall nicht.
Ich dachte eher ich habe bei der Initialisierung was falsch, denn der
O_WB_DATA liefert mir 0x20?
Wo setzt du denn die Startcondition?
Was mich auch stört, ist dass die toplevel I2C als 'z' angezeigt werden.
Ich weiss allerdings nicht wie man in einer VHDL Testbench einen Pullup
modelliert.
Ich habe gerade bemerkt, das ich im Resetfall in den State Start springe
den es nicht gibt. Also State START = POR.
Die Startcondition ist somit POR. Ich setze das CR (x"4A") mit I2CEN=1
(Bit 7),SDA_DEL_SEL =11 (Bit 3 + 2).
lattice_user schrieb:> Die Startcondition setze ich im State I_CMDR, dort schreibe ich auf das> Commando Register und setze Registerbit 7 (START) und 4 (Write) = x"94".
Ok, habe ich übersehen.
Ich muss also nochmal darauf zurückkommen:
Lattice User schrieb:> Was mich auch stört, ist dass die toplevel I2C als 'z' angezeigt werden.> Ich weiss allerdings nicht wie man in einer VHDL Testbench einen Pullup> modelliert.
Der I2CHardcore ist Multimasterfähig, d.h. es wird kein I2C Telegramm
gestartet wenn der I2C Bus nicht frei ist, und 'Z' auf SCL und SDA
erfüllt diese Bedingung nicht.
Siehe das Posting von Duke:
Beitrag "Re: Probleme bei Lattice I2C EFB mit Wishbone Interface"
wie man einen Pullup modelliert.
Ich habe in meiner Testbench die SCL und SDA mit high 'H' beschaltet.
Tut sich jedoch garnichts. Der Core liefert trotzdem immer 'Z'...für SCL
und SDA.
Hallo lattice_user !
Ich poste noch den Reg-Satz von dem Hardened Port I2C-Port #1 $40..$49,
bzw. $4A .. $53 I2C Secondary Port.(#2).
Address Mapping.
Das ist aus meinem WBone I2C-Bus #1 als "Master"-Config, auf ein I2C-BUS
Temp-Sensor
von TI Typ: TMP101. Damit ist das MachXo2 Pico Board ein Ref-Design.
Mit dem Mico8 kann man die Register von dem TempSensor via WBone-Bus
lesen bzw. schreiben.
Was hast du für ein Ref-Board ?.
Holger schrieb:> Ich poste noch den Reg-Satz von dem Hardened Port I2C-Port #1 $40..$49,> bzw. $4A .. $53 I2C Secondary Port.(#2).> Address Mapping.
Tipp: Mach das mal als aktiv "Master am "primary I2C-Bus Port.
Deine Source ist für das secondary I2C-Bus Port, und Slave mode.
------------------------------------------------------------------------
--
------------------------------------------------------------------------
--
Der 6-Pinnige TMP101NA/250 von TI Burr-Brown Temperatur Sensor hat Addr:
1001010, wenn Pin-5 an 'HIGH
liegt.
Fazit: Also somit der I2C-Bus-Addresss-Trigger bei
($4A). ist somit binär 100_1010
Das Datenblatt von TI ist mit dem Sromlaufplan von dem Machxo2 Pico
Board
via I2C-Addr schon mal konform.
------------------------------------------------------------------------
-
Das mit dem internen Oscillator via I2C-Bus is tricky gemacht.
Damit wird die Stromaufnahme von dem PICO Board als Standallone Coin
Cell Bat.App erst möglich.
------------------------------------------------------------------------
-
Trap: Mit den I2C-Bus-Addresss-Trigger via Machxo2 im "Slave "mode, geht
nur ein feste Adresse z.B $09 an primary Port, bzw. $0A an secondary
Port.
Die Machxo2-Pinne im primary I2C-Port sind fest, via Hardened Core
vorgegeben, auch mit ext. Pull-Up ect.
Der dedizierte I2C-Port-Pin() ist somit tristate,bidir,Open-Drain....
------------------------------------------------------------------------
-
Viel Erfolg bei den MachXo2 Pico Project.
Gruss Holger.
lattice_user schrieb:> Ich verwende das Lattice Breakout Board.
Damit sollte das gehen, wenn du einen aktiven Master via EFB damit
machst.
Die Simulation ist damit auch möglich.
Duch den aktiven Master wird das Modell einfacher zu duchschauen.
Gruss Holger.
Die Bilder im Anhang: Register und Wish-Bone Bus.
Asm Befehle.
Export ist schreiben auf den Wish-Bone Bus via Mico8 Code.
Import ist lesen auf den Wish-Bone Bus via Mico8 Code.
Obigen Anhang:
http://www.mikrocontroller.net/attachment/222781/Environment_Scanning.asm.bak
1
; Ich habe dem Code aus dem Obigen Anhang rausgeholt,
2
; der Code ist also fuer Master-Mode.
3
; Auf dem Lattice Pico Board befindet sich ein I2C-Bus Sensor.
4
;
5
; Achtung:
6
; 6 PIN-iger TMP101NA/250 von TI oder Burr Brown IC
7
; TEMPERATUR-SENSOR.
8
; Achtung: PIN 5 des Sensors ist an HIGH zu legen, somit ist die
9
; 7Bit Slave-Trigger-Arddess: 100_10_10 binary aktiv festgelegt.
10
; Der Sensor hat daraufhin die 7Bit-Adresse 100_10_10, ist also (0x4A)
11
; bingo>.
12
; Dieses Bit-Muster wird also im Master-Mode, in das
Holger schrieb:> Damit sollte das gehen, wenn du einen aktiven Master via EFB damit> machst.
Obigen Anhang:
Env_I2C_Scanning.asm
Reduziert auf nur das I2C-Bus interface am primaray Port.
Mit externen Pull-Ups an deinem Break-Out Port, sollte der Mastermode
die Pinne I2C-CLK u. I2C-DATA aktiv machen.
Also via Scope messen.
Gruss Holger.
Hier noch das sniplet für Enable Routine via 0x80 in Controll-Register.
Sonst ist der I2C-Core nicht aktiv via I/O Pinning.