web-dev-qa-db-ja.com

LinuxでのI2Cの使用による読み取り/書き込み

アドレスFM24CL64-GTR FRAMのI2Cバスを介して接続されている0b 1010 011チップに対して読み取り/書き込みを行おうとしています。

3バイト(データアドレス2バイト、+データ1バイト)を書き込もうとすると、カーネルメッセージ([12406.360000] i2c-adapter i2c-0: sendbytes: NAK bailout.)が返され、書き込みは!= 3を返します。以下のコードを参照してください。

#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);

...

ただし、2バイトを書き込んでから別のバイトを書き込むと、カーネルエラーは発生しませんが、FRAMから読み取ろうとすると、常に0が返されます。FRAMから読み取るコードは次のとおりです。

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);

どの関数もエラー値を返しません、そして私もそれを試しました:

#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);

これも成功しますが、常に0を返します。これはハードウェアの問題を示していますか、それとも何か問題がありますか?

Linux上のI2Cを介したFM24CL64-GTR用のFRAMドライバーはありますか?APIは何ですか?どんなリンクも役に立ちます。

13
TheSeeker

NAKは大きなヒントでした。WriteProtectピンは外部からプルアップされ、グランドに駆動する必要がありました。その後、アドレスとそれに続くデータバイトの1回の書き込みが成功しました(最初のコードセグメント)。

読み取りの場合、最初にアドレスを書き出すことができ(write()を使用)、次にそのアドレスから順次データを読み取ることができます。

6
TheSeeker

私はその特定のデバイスの経験はありませんが、私たちの経験では、多くのI2Cデバイスには、通常はドライバーレベルを超える回避策を必要とする「癖」があります。

Linux(CELinux)とLinuxでのI2Cデバイスドライバーも使用しています。しかし、私たちのアプリケーションコードには、私たちが経験したさまざまなデバイスすべてを処理するためのすべての回避策インテリジェンスを含む、重要なI2Cモジュールも含まれています。

また、I2Cの問題に対処するとき、ソースの仕様を再確認する必要があることがよくあります。

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

まともなオシロスコープの使用法と同様に。

幸運を、

上記のリンクは無効です。他のリンクは次のとおりです。

http://www.nxp.com/documents/user_manual/UM10204.pdf そしてもちろんウィキペディア: http://en.wikipedia.org/wiki/I%C2%B2C

6

struct i2c_rdwr_ioctl_datastruct i2c_msg(つまり、最後に指定したコード部分)を使用するメソッドは、他のメソッドよりも効率的であることに注意してください。このメソッドでは、の繰り返し開始機能を実行するためです。 I2c。

これは、通信がSTA-WRITE-STO -> STA-READ-<data>...-STORS =繰り返し開始)になるため、STA-WRITE-RS-READ-<data>...STO遷移を回避することを意味します。したがって、冗長なSTO-STAトランジェントを節約できます。

時間的に大きく異なるわけではありませんが、必要ないのなら、なぜそれを失うのですか...

ちょうど私の2カラット。

最高のrgds、

2
GeertVc

あなたはいくつかの間違いをしました!

icのアドレスは16進数でAxであり、xは何でもかまいませんが、上位4ビットはA=1010である必要があります!!!

0
ebi