2012-10-29 2 views
-1

http://www.hitechnic.com/cgi-bin/commerce.cgi?preadd=action&key=NSK1042이 웹 사이트를 살펴보면 내가 말하는 것에 대해 더 잘 이해할 수 있습니다. 예를 들어, 웹 사이트를 읽 센서의 I2C 주소는 0x10으로하고 값의 테이블이 읽i2c 주소에서 값에 액세스

Address  Type   Contents 

00 – 07H  chars   Serial Version Number 

43H   byte   Sensor 1 DC Signal Strength 

가 어떻게 C에서이 값을 액세스 할 수 있습니까? 감사.

+1

i2c는 외부 하드웨어와 통신하기위한 프로토콜입니다. i2c의 C에는 기본 지원이 없습니다. 라이브러리를 사용하거나 자신의 라이브러리를 사용해야합니다. 당신은 Google 이었습니까? 어떤 프로세서를 사용하고 있습니까? 어떤 C 컴파일러인가? 세부 사항이 없으면 질문이 닫힐 수 있습니다. 사람들을 링크로 안내하지 마십시오. 질문에 관련 정보를 포함 시키십시오. 이들은 당신을 도울 자신의 시간을 자원하여 돕는 사람들입니다. 그렇게하기가 쉽습니다. –

답변

3

이 레지스터는 메모리 매핑 할 수 있습니다. 몇 가지 당신이 수행해야합니다 :

는 휘발성 키워드는 컴파일러를 중지 같은 휘발성이 지역에있는 포인터를 프로그램 공간을

  • 를 해결하기 위해 장치의 물리적 메모리를 매핑 선언 프로그램을 "최적화"하지 못하게합니다. 예 : 동일한 메모리 위치에 대한 읽기가 프로그램에 기록되지 않았으므로 동일한 결과를 산출한다고 가정함으로써.

    쉬운 부분은 모든 오프셋이 장치와 같고 각 파트의 크기가 적절하도록 구조체를 선언하는 것입니다. 장치가 매핑된다

    struct hitech { 
        char serial_version[8]; 
        char manufacturer[8]; 
        /* etc */ 
    }; 
    
    volatile struct hitech *my_device; 
    

    즉, 두 번째 부분은 일하고있다. 컴퓨터에 연결되어 있다면 이걸 볼 수 있어야합니다. 다음 중 하나를 수행해야 할 수 있습니다. 기기의 실제 주소를 mmap합니다. 또는 my_device = 0x < address>를 작성하십시오. 또는이 둘의 조합. 웹 사이트에서

    :

    그래서 당신이 my_device 위을 0x10을 쓰고 싶어 "를 IRSeeker V2 센서의 I2C 주소는 0x10을입니다".

    그러면 올바른 마이크로 컨트롤러를 컴파일하고 프로그램을 올바른 위치에 펌웨어로로드해야합니다.

    프로그래밍 언어를 사용하는 것이 좋습니다.

  • +0

    dave : 이들이 OP 기기에서 매핑 된 메모리가 될 수 있다는 것을 어떻게 아십니까? –

    +0

    @Guy Sirton 웹 사이트에서 강력하게 제안했기 때문에. 그것은 비록 잘못 될 수 있습니다. 그것이 매핑되면 그는 이것을 볼 수 있어야합니다. – dave

    0

    이 값에 접근 할 수 그들이 SDK를 제공하지 않는 가정 :

    // I'm assuming these are read-only, hence the "const" 
    const char *g_serialVersionNumber = (const char *)0x00; // be careful not to access more than 8 bytes 
    const unsigned char *g_sensor1DCSignalStrength = (const unsigned char *)0x43; 
    
    void main() 
    { 
        printf("Serial version number: %s\n", g_serialVersionNumber); 
        printf("Sensor 1 DC Signal Strength: %d\n", *g_sensor1DCSignalStrength); 
    } 
    
    +0

    i2c 주소가 메모리가 프로세스 주소 공간에 매핑되었다고 가정하는 이유는 무엇입니까? 이것은 거의 틀림없이 잘못된 것입니다. –

    +0

    이것은 분명히 분할 오류입니다. 주소 0x0은 커널 메모리이므로 액세스 할 수 없습니다. – dave

    +0

    내가 장치에 익숙하지 않다는 것을 감안할 때 SDK를 제공하지 않으면 실제로 다른 결론을 내릴 수 없습니다. 그러나, 나는 SDK가 제공된다고 생각할 것이다. (따라서 "그들이 그렇지 않다고 가정한다."). –