Frage

Ich versuche, auf einen FM24CL64-GTR FRAM Chip zu lesen / schreiben, die über einen I2C-Bus auf Adresse 0b 1010 011 verbunden ist.

Wenn ich versuche, 3 Bytes zu schreiben (Datenadresse 2 Bytes, + Daten ein Byte), erhalte ich eine Kernel-Nachricht ([12406.360000] i2c-adapter i2c-0: sendbytes: NAK bailout.), sowie die Schreib Rendite = 3. Siehe Code unten:

#include <linux/i2c-dev.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdint.h>

int file;
char filename[20];
int addr = 0x53; // 0b1010011; /* The I2C address */
uint16_t dataAddr = 0x1234;
uint8_t val = 0x5c;
uint8_t buf[3];

sprintf(filename,"/dev/i2c-%d",0);
if ((file = open(filename,O_RDWR)) < 0)
    exit(1);

if (ioctl(file,I2C_SLAVE,addr) < 0)
    exit(2);

buf[0] = dataAddr >> 8;
buf[1] = dataAddr & 0xff;
buf[2] = val;

if (write(file, buf, 3) != 3)
    exit(3);

...

Allerdings, wenn ich 2 Byte schreiben, dann ein weiteres Byte schreiben, ich habe keine Kernel-Fehler, aber wenn sie aus dem FRAM zu lesen versucht, habe ich immer wieder 0. Hier ist der Code aus dem FRAM zu lesen:

uint8_t val;

if ((file = open(filename,O_RDWR)) < 0)
    exit(1);

if (ioctl(file,I2C_SLAVE,addr) < 0)
    exit(2);

if (write(file, &dataAddr, 2) != 2) {
    exit(3);

if (read(file, &val, 1) != 1) {
    exit(3);

Keine der Funktionen gibt einen Fehlerwert, und ich habe auch versucht, es mit:

#include <linux/i2c.h>

struct i2c_rdwr_ioctl_data work_queue;
struct i2c_msg msg[2];
uint8_t ret;

work_queue.nmsgs = 2;
work_queue.msgs = msg;

work_queue.msgs[0].addr = addr;
work_queue.msgs[0].len = 2;
work_queue.msgs[0].flags = 0;
work_queue.msgs[0].buf = &dataAddr;

work_queue.msgs[1].addr = addr;
work_queue.msgs[1].len = 1;
work_queue.msgs[1].flags = I2C_M_RD;
work_queue.msgs[1].buf = &ret;

if (ioctl(file,I2C_RDWR,&work_queue) < 0)
    exit(3);

Welche gelingt es auch, aber immer 0 zurück Enthält diese ein Hardwareproblem angeben, oder mache ich etwas falsch?

Gibt es FRAM Treiber für FM24CL64-GTR über I2C auf Linux, und was wäre der API sein? Jeder Link wäre hilfreich.

War es hilfreich?

Lösung

Die NAK war ein großer Hinweis: Der Writeprotect Stift extern wurde nach oben gezogen, und mußte Boden getrieben werden, danach, dass eine einzelne Schreib der Adresse gefolgt von Daten-Bytes erfolgreich ist (erstes Codesegment)

Für die Adresse liest, kann zuerst geschrieben werden (unter Verwendung von write ()), und dann können sequentielle Daten ausgehend von dieser Adresse gelesen werden.

Andere Tipps

Ich habe keine Erfahrung mit diesem speziellen Gerät, aber in unserer Erfahrung vieler I2C-Geräte haben „Macken“, die eine Behelfslösung erfordern, in der Regel über dem Treiberebene.

Wir verwenden Linux (CELinux) und ein I2C-Gerätetreiber unter Linux als auch. Aber unser Anwendungscode hat auch ein nicht-triviale I2C-Modul, das die ganze Arbeit-um Intelligenz enthält, um mit all den verschiedenen Geräten zu tun haben wir Erfahrung mit.

Auch wenn mit I2C Fragen beschäftigen, habe ich oft feststellen, dass ich mich mit der Source-spec wieder bekannt machen muß:

http://www.nxp.com/acrobat_download/literature/9398 /39340011.pdf

sowie die Verwendung eines anständigen Oszilloskop.

Viel Glück,

Über Link tot ist, sind hier einige andere Links:

http://www.nxp.com/documents/user_manual/UM10204.pdf und natürlich wikipedia: http://en.wikipedia.org/wiki/I%C2%B2C

Beachten Sie, dass das Verfahren den struct i2c_rdwr_ioctl_data und die struct i2c_msg mit (das heißt, der letzte Code Teil, den Sie gegeben haben) effizienter als die anderen ist, da mit dieser Methode Sie den wiederholten Start-Funktion von I2c auszuführen.

Dies bedeutet, dass Sie einen STA-WRITE-STO -> STA-READ-<data>...-STO Übergang zu vermeiden, weil Sie Ihre Kommunikation STA-WRITE-RS-READ-<data>...STO (RS = wiederholter Start) werden wird. So sparen Sie eine redundante STO-STA vorübergehend.

Nicht, dass es eine Menge in der Zeit unterscheidet, aber wenn es nicht gebraucht wird, warum auf, es zu verlieren ...

Just my 2 ct.

Best rgds,

Sie haben einige Fehler!

Die Adresse ic ist Ax in hex, x alles sein kann, aber die 4 oberen Bits A=1010 werden sollte !!!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top