2016-09-01 3 views
0

Я пишу C++-код (но мой пример прямой), чтобы поговорить с сервоприводом AdaFruit Pi Hat, который использует шину I2C для связи с Pi. У меня возникла проблема при попытке использовать механизм ioctl I2C_RDWR. Я получаю статус «Плохой адрес» от вызова. Неважно, какой адрес я ему даю (шляпа отвечает на 0x40, хотя), она всегда терпит неудачу. Я превратил код в короткий модуль, который является самодостаточным. Это мой первый пост на этом сайте, поэтому, если бы я сделал какой-либо faux pas, пожалуйста, простите меня.Неожиданный staus с I2C на Raspberry Pi

Когда я запускаю прилагаемый код, я получаю следующий ответ:

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

ответ

0

я нашел мою проблему, оказывается, что «плохой адрес» не имел в виду адрес устройства I2C, но адрес блока направляется в команда ioctl. Я забыл передать адрес, в отличие от значения параметра в моем вызове ioctl.

Смежные вопросы