좋아! 나는 내 자신의 질문을 알아 냈다.
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, ®ister_address, sizeof(register_address)) !=1)
{
printf("%d\n",write(file, ®ister_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을 반환합니다. 레지스터. 자력계는 이제 다른 레지스터와 마찬가지로 읽을 수 있습니다. 희망이 도움이 !!
음, 장치를 모르지만 등록 세트를 읽는 것이 '아무 것도 얻을 수 없음'을 이해하지 못합니까? – ThingyWotsit