1

i2cの Linux カーネル ドキュメントを読み、コマンドを複製するためのコードを作成しました。i2cset -y 0 0x60 0x05 0xff

私が書いたコードはここにあります:

#include <stdio.h>
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <stdint.h>
#include <string.h>

int main(){

 int file;    
 file = open("/dev/i2c-0", O_RDWR);
 if (file < 0) {
  exit(1);
 }

 int addr = 0x60;

 if(ioctl(file, I2C_SLAVE, addr) < 0){
 exit(1);
 }

__u8 reg = 0x05;
__u8 res;
__u8 data = 0xff;

int written = write(file, &reg, 1); 
printf("write returned %d\n", written);

written = write(file, &data, 1); 
printf("write returned %d\n", written);

}

このコードをコンパイルして実行すると、次のようになります

私はドキュメントが教えてくれることを正確に従おうとしました.私の理解では、アドレスは最初に への呼び出しで設定されioctl、次に登録する必要があり、次にwrite()登録に送信したいデータが必要です。

SMbus も使用しようとしましたが、これを使用してコードをコンパイルできません。リンク段階で関数が見つからないと文句を言います。

このコードで間違いを犯したことがありますか? 私は初心者で、どちらもi2cあまり経験がありませんc

編集: errno 次のメッセージを表示します: Operation not supported. 私はこのマシンにルートとしてログインしているので、間違っているかもしれませんが、パーミッションの問題ではないと思います。

4

2 に答える 2

1

この問題を回避する方法は、SMBus、特に関数i2c_smbus_write_byte_dataとを使用することでしたi2c_smbus_read_byte_data。これらの関数を使用して、デバイスの読み取りと書き込みを正常に行うことができました。

これらの関数を見つけるのに少し問題がありましたapt-get。適切なヘッダー ファイルをインストールするために使用するライブラリをダウンロードしようとし続けました。最後に、ファイルsmbus.csmbus.hをダウンロードしました。

次に、必要なコードは次のとおりです。

#include <stdio.h>
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
#include "smbus.h"
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <stdint.h>
#include <string.h>
#include <errno.h>


int main(){

int file;     
file = open("/dev/i2c-0", O_RDWR);
if (file < 0) {
    exit(1);
}

int addr = 0x60;

if(ioctl(file, I2C_SLAVE, addr) < 0){
    exit(1);
}

__u8 reg = 0x05; /* Device register to access */
__s32 res;

res = i2c_smbus_write_byte_data(file, reg, 0xff);
close(file);
}

次に、smbus.c file:gcc -c smbus.cと myfile:をコンパイルし、gcc -c myfile.cそれらをリンクするgcc smbus.o myfile.o -o myexeと、I2C コマンドを実行する実行可能ファイルが得られます。もちろん、私はsmbus.cと とsmbus.h同じディレクトリにありmyfile.cます。

于 2013-05-18T21:33:49.857 に答える
0

C では、errno変数の内容をチェックして、問題の詳細を確認できます。インクルード時に自動的に宣言され、 をerrno.h呼び出すことでより説明的なテキストを取得できますstrerror(errno)

への書き込みアクセス権があることを確認しました/dev/i2c-0か?

于 2013-05-18T14:33:49.613 に答える