2017-05-11 6 views
2

나는 이것에 관해 몇 가지 다른 사람들에게 물어 보았다.하지만이 모든 것은 Arduino에서 코딩하고 있으며, 나는 그것을 프로젝트로 번역하려고 애 쓰고있다.MPU-9250 (uClinux)의 자력계 데이터

저는 입문용 큐브 새틀 라이트를 개발중인 연구팀에서 IMU (MPU-9250)를 포함한 주변 장치와 통신하는 역할을하고 있습니다. 나는 C로 코딩 한 uClinux로 크로스 컴파일을하고있다.

지금까지 나는 가속도계, 자이로 스코프 및 온도를 성공적으로 읽을 수 있었지만 자력계에서 판독 값을 얻을 수 없었다. 자력 (AK8963)는 자신의 주소 (0x0C)를 가지고, 나는 I2C_SLV0_ADDR (0x25로), I2C_SLV0_REG (0x26) 및 I2C_SLV0_CTRL (0x27에)에 기록하여 통신을 시도했습니다. 내가 어떤 결과를 얻을하지 않은 것으로 보입니다되면, 나는 FIFO 사용 에 작성하여이를 해결하려고 (인 0x23) 및 I2C 마스터 컨트롤은 (0x24, 페이)

데이터 시트 및 등록지도는 값에서 가져온 의미하는 것이 자력계는 레지스터에 저장됩니다 외부 센서 데이터 (0x49-0x60),하지만 이것을 시도 할 때 그 레지스터에 아무것도 표시되지 않습니다. 나는이 과정에 대해 진행 1. 암 올바른 방법, 또는 내가 완전히 꺼입니다 :

write_register(0x23, 0x04); 
write_register(0x24, 0b11110000); 
write_register(0x25,0x8c); 
write_register(0x26,0x00); 
write_register(0x27,0b11110001); 

그래서 제 질문은 다음과 같습니다

여기가 레지스터에 쓰고 데이터를 보여줍니다 일부 코드는?

  1. 올바른 길을 가고 있다면 정확한 레지스터를 읽어야합니까?

여러분 모두를 도와 주셔서 감사합니다! 내가 분명히해야 할 것이 있으면 알려줘!

+0

음, 장치를 모르지만 등록 세트를 읽는 것이 '아무 것도 얻을 수 없음'을 이해하지 못합니까? – ThingyWotsit

답변

2

좋아! 나는 내 자신의 질문을 알아 냈다.

1) 나는 정말로 잘못된 방향으로 나아 갔다. 이를 수행하는 훨씬 더 쉬운 방법이 있으며, 어떻게 자세하게 보여줄 것인가.

2) 올바른 레지스터에서 읽지 않았습니다. 나는 아래에서해야할 것을 보여줄 것이다.

그래서 자력계에 연결하는 것은 쉽지만 직관적이지는 않습니다. 자체 슬레이브 주소로 자신의 슬레이브처럼 작동하지만 초기에는 해당 주소에 액세스 할 수 없습니다.

uClinux로 크로스 컴파일 중이므로(내 SmartFusion2로 스크리닝 할 때) 내 i2C 0 버스의 모든 슬레이브를 검사 할 수 있습니다. 내 보드를 재설정 한 후이 명령을 실행하면, 나는 다음 주소지도가 출력 얻을 :

 0 1 2 3 4 5 6 7 8 9 a b c d e f 
00:   -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- -- 

그래서 당신은 IMU (0x68) 만 주소가 표시되고있는 것을 볼 수 있습니다. 자력계가 제대로 나타나게하려면 INT_PIN_CFG (0x37)에서 바이 패스 비트를 활성화해야합니다. 누구든지이 코드를 복제해야 할 경우에 대비하여 아래 코드를 첨부했습니다.

#include <stdio.h> 
//#include <linux/i2c-dev.h> 

#include <stdint.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <sys/ioctl.h> 
#include <fcntl.h> 

#define ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0])) 
#define IMU_ADDR 0x68 
#define IMU_WHO_AM_I 0x75 


int file; 

void i2c_init(); 
void write_register(uint8_t register_address, uint8_t value); 
uint8_t read_register(uint8_t register_address); 

void i2c_init(address){ 
    int adapter_nr = 0; 
    char filename[20]; 

    snprintf(filename, 19, "/dev/i2c-%d", adapter_nr); 
    file = open(filename, O_RDWR); 
    if(file < 0) 
     printf("Error: Failed to open file %s\n", filename); 
    int success= (ioctl(file, I2C_SLAVE, address)); 
    if(file < 0) { 
     printf("Error: IMU I2C Failed to Open\n"); 
     //return -1; 
    } 
} 
void write_register(uint8_t register_address, uint8_t value){ 
    uint8_t data[]={register_address,value}; 
    write(file, data,ARRAY_SIZE(data)); 
} 
uint8_t read_register(uint8_t register_address){ 
    uint8_t value; 
    if(write(file, &register_address, sizeof(register_address)) !=1) 
    { 
     printf("%d\n",write(file, &register_address, sizeof(register_address))); 
     printf("Failed to send data\n"); 
    } 
    read(file, &value, sizeof(value)); 
    return value; 
} 

int main(){ 
    i2c_init(IMU_ADDR); 

    printf("\nNow testing the 'Who am I?' IMU register. Output should be 0x71\n"); 
    printf("Register 0x75: 0x%02X \n", read_register(IMU_WHO_AM_I)); 

    write_register(0x37, 0x22); 
    i2c_init(0x0C); 
     printf("\nNow testing the 'Who am I?' Magnetometer register. Output should be 0x48\n"); 

    printf("Register 0x00: 0x%02x\n", read_register(0x00)); 

    return 0; 
} 

코드를 컴파일하고 실행하면, 다음과 같은 데이터 맵을 반환 i2cdetect 0 명령.

 0 1 2 3 4 5 6 7 8 9 a b c d e f 
00:   -- -- -- -- -- -- -- -- -- 0c -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- -- 

이 프로그램은 자력계의 'who am I?'에서 읽을 때 올바른 값인 0x48을 반환합니다. 레지스터. 자력계는 이제 다른 레지스터와 마찬가지로 읽을 수 있습니다. 희망이 도움이 !!