FRAM lesen/schreiben

Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2134
Registered: 03 / 2003
Subject:

FRAM lesen/schreiben

 · 
Posted: 02.01.2015 - 23:07  ·  #1
Hallo @ all,

nachdem ich schon eine ganze Weile mit einem FRAM rumspiele und es nicht schaffe da was zu schreiben und zu lesen ..... HILFEEEEEEEEEEE :D

Typ FM24CL64

Code

Procedure ReadFM;                      // FM24CL64 lesen
  Begin
    TWIout(EEPROMaddr,0,0);
    TWIinp(EEPROMaddr,FMArr);
    If FMArr[2] in [0..40]
      then
        Contrast:=FMArr[2];
      else
        Contrast:=20;
      EndIf;
    If FMArr[3] in [0..25]
      then
        Backlight:=FMArr[3];
      else
        Backlight:=10;
      EndIf;
  End ReadFM;
  

Procedure WriteFM;                     // FM24CL64 schreiben
  Begin
    If Contrast in [0..40]
      then
        FMArr[2]:=Contrast;
      else
        FMArr[2]:=20;
      EndIf;
    If Backlight in [0..25]
      then
        FMArr[3]:=Backlight;
      else
        FMArr[3]:=10;
      EndIf;
    TWIout(EEPROMaddr,0,0);
    TWIout(EEPROMaddr,0,FMArr);
  End WriteFM;


Das Teil will von mir
lesen: I2C-Adresse ($50), Adresse MSB, Adresse LSB, I2C-Adresse ($50), Daten1, Daten2, ........
schreiben: I2C-Adresse ($50), Adresse MSB, Adresse LSB, Daten1, Daten2, ........

Ich komm damit irgendwie nicht klar :(
Hat jemand ein bisschen Code dafür ? Oder eine Erklärung ?

Gruss & Danke
Harry

PS: Ich hab mir grad mal das gesamt Array nach dem lesen anzeigen lassen und das steht überall $FF drin. Entweder funktioniert das schreiben nicht oder das lesen.
miparo
Administrator
Avatar
Gender:
Location: Germany
Age: 58
Posts: 959
Registered: 09 / 2007
Subject:

Re: FRAM lesen/schreiben

 · 
Posted: 03.01.2015 - 17:06  ·  #2
Hallo Harry,
warum machst Du dir das so schwer :yawinkle:

Nimm den Device Treiber S.239 im StdManual.
Dort gibt es auch ein Sample dazu.

Gruß
miparo
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2134
Registered: 03 / 2003
Subject:

Re: FRAM lesen/schreiben

 · 
Posted: 03.01.2015 - 17:52  ·  #3
Hi miparo,

das hab ich noch gar nicht gesehen :banghead: :confused5: ..... schau ich mir an. Danke.

Gruss
Harry
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2134
Registered: 03 / 2003
Subject:

Re: FRAM lesen/schreiben

 · 
Posted: 03.01.2015 - 19:49  ·  #4
Falls es jemand interessiert: Die Adresse muß als Word gesendet werden, dann geht es auch. Mit 2 Bytes in Folge funktioniert das nicht.
Da ich nur eine Konfiguration mit 2 Bytes + 2 Dummybytes speichere hab ich die Adresse als Konstante definiert.

DANKE miparo :)

Code

Procedure ReadFM;                      // FM24CL64 lesen
  Const Adr : Word = $0000;
  Begin
    TWIout(FMaddr,Adr);
    TWIinp(FMaddr,FMArr);
    If FMArr[2] in [0..40]
      then
        Contrast:=FMArr[2];
      else
        Contrast:=20;
      EndIf;
    If FMArr[3] in [0..25]
      then
        Backlight:=FMArr[3];
      else
        Backlight:=10;
      EndIf;
  End ReadFM;
  

Procedure WriteFM;                     // FM24CL64 schreiben
  Const Adr : Word = $0000;
  Begin
    If Contrast in [0..40]
      then
        FMArr[2]:=Contrast;
      else
        FMArr[2]:=20;
      EndIf;
    If Backlight in [0..25]
      then
        FMArr[3]:=Backlight;
      else
        FMArr[3]:=10;
      EndIf;
    TWIout(FMaddr,Adr,FMArr);
  End WriteFM;
Lschreyer
Schreiberling
Avatar
Gender: n/a
Posts: 527
Registered: 02 / 2007
Subject:

Re: FRAM lesen/schreiben

 · 
Posted: 19.01.2019 - 17:58  ·  #5
Ich hatte das hier mal zum Anlass genommen um ein FRAM FM25LS16B (2Kx8) per SPI ans Userdevice zu binden.
Falls jemand das mal benötigt ist hier eine Demodatei die zeigt wie das geht.
Etwas trickreich ist das Schreiben, man muss erst ein WREN-Befehl senden, CS wieder hoch setzen und dann erst schreiben, sonst klappt nicht.

Das Userdevice ist sehr praktisch, damit kann man direkt auf die Variablen zugreifen, und dank Fram ist es superschnell und unendlich oft beschreibbar.
Attachments
{XMEGA Demo for Avrco "Userdevice"

Written for the FM25L16B FRAM (2Kx8) 8-pin device
Connection with SPI

Creates a userdevice which saves and reads the data to the FRAM
}

program UserData;

Device = xmega256A3U, VCC = 3.3;

import SysTick, SerPortE0, SPI_C, UserPort;


define
// The XMegas don't provide any Oscillator fuses.
// So the application must setup the desired values
// possible OSC types: extXTAL, extClock, ext32kHz, int32Khz, int2MHz, int32MHz

OSCtype = int32MHz,
PLLmul = 6,
prescB = 1,
prescC = 1,
overdrive;

SysTick = 10;

StackSize = $150, iData;
FrameSize = $100, iData;

UserPort = 2048; {2048Byte extern} // define Mem expansion size

SerPortE0 = 38400, Stop2, Timeout;
TxBufferE0 = 64, iData;
RxBufferE0 = 8, iData;

SPIorderC = MSB;
SPImodeC = 0;
SPIprescC = 2;
SPI_SSC = NONE;

implementation

{$UDATA} // place vars into User Device
var
usrb : byte;
usri : integer;
usrArr : array[0..10] of byte;
uStr : string[8];
uRec : record
ub : byte;
uw : word;
uSt : string[4];
end;

{$IDATA}

// FRAM FM25L16B special Aliases and Constants
var
FMCS[@PORTC, 4] : bit;
Framstatus : byte;

alias // Edit here for other SPI Ports and the CS line of the Fram
FRAMCS = FMCS;
FRAMOutByte = SPIoutByteC;
FRAMInpByte = SPIInpByteC;

const
FM_WREN: byte = %00000110;//Set write enable latch 0000 0110b
FM_WRDI: byte = %00000100;// Write disable 0000 0100b
FM_RDSR: byte = %00000101;// Read Status Register 0000 0101b
FM_WRSR: byte = %00000001;// Write Status Register 0000 0001b
FM_READ: byte = %00000011;// Read memory data 0000 0011b
FM_WRITE: byte = %00000010;// Write memory data 0000 0010b
Filename: userdata.pas
Filesize: 3.29 KB
Title: Xmega Userdata Fram SPI Demo
Download counter: 75
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 15 · Cache Hits: 15   93   108 · Page-Gen-Time: 0.041585s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI