Raspberry Pi上带有I2C的意外状态

时间:2016-09-01 02:22:48

标签: raspberry-pi i2c adafruit

我正在编写c ++代码(但我的例子是直接的c)与AdaFruit Servo Motor Pi Hat交谈,后者使用I2C总线与Pi通信。我在尝试使用ioctl I2C_RDWR机制时遇到问题。我收到了一个糟糕的地址'从通话中恢复状态。我给它的地址并不重要(帽子回答了0x40),它总是失败。我把代码煮成了一个自包含的短模块。这是我在这个网站上的第一篇文章,所以如果我做了任何失礼,请原谅我。

当我运行附加的代码时,我收到以下响应:

I2C_FUNC_I2C                            OK
I2C_FUNC_10BIT_ADDR 
I2C_FUNC_PROTOCOL_MANGLING 
I2C_FUNC_SMBUS_QUICK                    OK
I2C_FUNC_SMBUS_READ_BYTE                OK
I2C_FUNC_SMBUS_WRITE_BYTE               OK
I2C_FUNC_SMBUS_READ_BYTE_DATA           OK
I2C_FUNC_SMBUS_WRITE_BYTE_DATA          OK
I2C_FUNC_SMBUS_READ_WORD_DATA           OK
I2C_FUNC_SMBUS_WRITE_WORD_DATA          OK
I2C_FUNC_SMBUS_PROC_CALL                OK
I2C_FUNC_SMBUS_READ_BLOCK_DATA 
I2C_FUNC_SMBUS_WRITE_BLOCK_DATA         OK
I2C_FUNC_SMBUS_READ_I2C_BLOCK           OK
I2C_FUNC_SMBUS_WRITE_I2C_BLOCK          OK
Write failed: Bad address

我的Pi是型号B,版本2.我启用了i2c系统,可以看到i2c设备:

crw-rw-rw- 1 root i2c    89,   1 Aug 31 23:02 i2c-1

任何帮助都将不胜感激。

代码如下:

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


int main() {
    int file;
    int devAddr = 0x40;
    int status;
    uint32_t funcs;
    uint8_t data = 0xAA;
    struct i2c_rdwr_ioctl_data request;
    struct i2c_msg ioctlMsg[1];

    file = open("/dev/i2c-1", O_RDWR);
    if(file < 0) {
            perror("could not open device");
            return 1;
    }
    status = ioctl(file, I2C_FUNCS, &funcs);
    if(status < 0) {
            perror("could not get funcs");
            return 3;
    }
    fprintf(stderr, "\nI2C_FUNC_I2C ");
    if ( I2C_FUNC_I2C & funcs) fprintf(stderr, "\t\t\t\tOK");      
    fprintf(stderr, "\nI2C_FUNC_10BIT_ADDR ");
    if ( I2C_FUNC_10BIT_ADDR & funcs)  fprintf(stderr, "\t\t\tOK");
    fprintf(stderr, "\nI2C_FUNC_PROTOCOL_MANGLING ");                 
    if ( I2C_FUNC_PROTOCOL_MANGLING & funcs) fprintf(stderr, "\tOK");       
    fprintf(stderr, "\nI2C_FUNC_SMBUS_QUICK ");
    if ( I2C_FUNC_SMBUS_QUICK & funcs) fprintf(stderr, "\t\t\tOK");
    fprintf(stderr, "\nI2C_FUNC_SMBUS_READ_BYTE ");
    if ( I2C_FUNC_SMBUS_READ_BYTE & funcs) fprintf(stderr, "\t\tOK");
    fprintf(stderr, "\nI2C_FUNC_SMBUS_WRITE_BYTE ");
    if ( I2C_FUNC_SMBUS_WRITE_BYTE & funcs) fprintf(stderr, "\t\tOK");
    fprintf(stderr, "\nI2C_FUNC_SMBUS_READ_BYTE_DATA ");
    if ( I2C_FUNC_SMBUS_READ_BYTE_DATA & funcs) fprintf(stderr, "\t\tOK");
    fprintf(stderr, "\nI2C_FUNC_SMBUS_WRITE_BYTE_DATA ");
    if ( I2C_FUNC_SMBUS_WRITE_BYTE_DATA & funcs) fprintf(stderr, "\t\tOK");
    fprintf(stderr, "\nI2C_FUNC_SMBUS_READ_WORD_DATA ");
    if ( I2C_FUNC_SMBUS_READ_WORD_DATA & funcs) fprintf(stderr, "\t\tOK");
    fprintf(stderr, "\nI2C_FUNC_SMBUS_WRITE_WORD_DATA ");
    if ( I2C_FUNC_SMBUS_WRITE_WORD_DATA & funcs) fprintf(stderr, "\t\tOK");
    fprintf(stderr, "\nI2C_FUNC_SMBUS_PROC_CALL ");  
    if ( I2C_FUNC_SMBUS_PROC_CALL & funcs) fprintf(stderr, "\t\tOK"); 
    fprintf(stderr, "\nI2C_FUNC_SMBUS_READ_BLOCK_DATA ");  
    if ( I2C_FUNC_SMBUS_READ_BLOCK_DATA & funcs) fprintf(stderr, "\t\tOK"); 
    fprintf(stderr, "\nI2C_FUNC_SMBUS_WRITE_BLOCK_DATA ");  
    if ( I2C_FUNC_SMBUS_WRITE_BLOCK_DATA & funcs) fprintf(stderr, "\tOK"); 
    fprintf(stderr, "\nI2C_FUNC_SMBUS_READ_I2C_BLOCK ");  
    if ( I2C_FUNC_SMBUS_READ_I2C_BLOCK & funcs) fprintf(stderr, "\t\tOK"); 
    fprintf(stderr, "\nI2C_FUNC_SMBUS_WRITE_I2C_BLOCK ");  
    if ( I2C_FUNC_SMBUS_WRITE_I2C_BLOCK & funcs) fprintf(stderr, "\t\tOK"); 
    fprintf(stderr, "\n");


    memset(ioctlMsg, 0, sizeof(struct i2c_rdwr_ioctl_data) * 2);
    ioctlMsg[0].addr = 0x0;
    ioctlMsg[0].flags = 0;          /* write command */
    ioctlMsg[0].len = 1;
    ioctlMsg[0].buf = &data;
    request.msgs = ioctlMsg;
    request.nmsgs = 1;
    status = ioctl(file, I2C_RDWR, request);
    if(status < 0) {
            perror("Write failed");
            return 2;
    }
    close(file);
    return 0;
}

1 个答案:

答案 0 :(得分:0)

我发现了我的问题,结果发现了糟糕的地址&#39;没有引用I2C设备的地址,而是在ioctl命令中发送的块的地址。我忘记传递地址,而不是调用ioctl中参数的值。

相关问题