Привет, я пытаюсь читать и записывать данные с шины i2c на черную кость бигля. Но я продолжаю читать 0x00 всякий раз, когда пытаюсь получить доступ к регистру Who Am I на MMA84152 (или любом другом регистре, если на то пошло), который является постоянным регистром, что означает, что его значение не изменяется. Я пытаюсь прочитать символьный драйвер i2c-1, расположенный в / dev, и подключаю sda и scl строк MMA852 к контактам 19 и 20 в заголовке p9. Линии sda и scl подтянуты резисторами 10 кОм. Оба контакта 19 и 20 показывают 00000073 для их мультиплексора контактов, что означает, что он настроен на функциональность i2c, и управление нарастанием медленное, приемник активен, на контакте используется подтягивающий резистор, и подтягивание включено. Я запустил i2cdetect -r 1, и мое устройство отображается как 0x1d, что является его правильным адресом. Я также запустил i2cdump 1 0x1d, и 0x2a отображается под 0x0d, который является регистром, который я пытаюсь прочитать с моего устройства, и содержит правильное значение в соответствии с таблицей данных. Но когда я его читаю, он возвращает мне 0x00. Я также использую последний дистрибутив Angstrom, и я вошел в систему под root, поэтому мне не нужно использовать sudo. Я потерялся. Вот код:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <linux/i2c-dev.h>
#include <linux/i2c.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string>
using namespace std;
int main(int argc, char **argv){
int X_orientation=0;
char buffer1[256];
string i2cDeviceDriver="/dev/i2c-1";
int fileHandler;
if((fileHandler=open(i2cDeviceDriver.c_str(),O_RDWR))<0){
perror("Failed To Open i2c-1 Bus");
exit(1);
}
if(ioctl(fileHandler,I2C_SLAVE,0x1d)<0){
perror("Failed to acquire i2c bus access and talk to slave");
exit(1);
}
char buffer[1]={0x0D};
if(write(fileHandler,buffer,1)!=1){
perror("Failed to write byte to accelerometer");
exit(1);
}
if(read(fileHandler,buffer1,1)!=1){
perror("Failed to read byte from accelerometer");
exit(1);
}
printf("Contents of WHO AM I is 0x%02X\n",buffer1[0]);
}