2015-01-22 1 views
0

현재 저는 아치 리눅스 암에서 I2C로 작업하고 있으며, 쓰기와 읽기 사이에 절대 최소 지연을 계산하는 방법을 잘 모르겠습니다. 이 지연이 없다면 자연스럽게 읽히지 않습니다. 방금 적용한 두 명령 사이에 usleep(1000)을 적용했지만 경험적으로 완료되었으며 실제 값 (어떻게 든)에 최적화되어야합니다. 하지만 어떻게?리눅스에서 I2C의 쓰기와 읽기 사이의 지연 계산하기

int write_and_read(int handler, char *buffer, const int bytesToWrite, const int bytesToRead) { 
    write(handler, buffer, bytesToWrite); 
    usleep(1000); 
    int r = read(handler, buffer, bytesToRead); 
    if(r != bytesToRead) { 
     return -1; 
    } 
    return 0; 
} 

답변

1

일반적으로 기다릴 필요가 없습니다 :

여기 내가 사용하고있는 write_and_read 기능에 대한 내 코드 샘플입니다. 쓰기 및 읽기 기능이 백그라운드에서 어떻게 든 스레드되는 경우 (왜 그렇게 할 것입니까?) 다음 동기화는 필수입니다.

I2C는 매우 단순한 선형 통신이며 모든 장치는 마이크로 초 이내에 출력 데이터를 생성 할 수있었습니다.

100kHz, 400kHz 또는 1MHz I2C를 사용하고 있습니까? 편집

: 일부 후 난 당신이 시도하는 것이 좋습니다 토론

x는 헤더에 정의 된 전역 변수는 다음 설정에서 0을 할당입니다
void dataRequest() { 
    Wire.write(0x76); 
    x = 0; 
} 

void dataReceive(int numBytes) 
{ 
    x = numBytes; 
    for (int i = 0; i < numBytes; i++) { 
     Wire.read(); 
    } 
} 

(). 기본 루프에 간단한 if 조건을 추가하려고 할 수 있습니다 (예 : x> 0 인 경우 serial.print()에 디버그 메시지로 무언가를 보낸 다음 x를 0으로 재설정하십시오.

이렇게하면 직렬 트래픽으로 I2C 작업이 차단되지 않습니다.

+0

내가 처음에는 생각했지만 쓰기와 읽기 사이에 지연 없이는 작동하지 않습니다. – JavaCake

+0

쓰기 기능이란 무엇입니까? 어떤 장치와 통신하고 있습니까? – KZD76

+0

'linux/i2c-dev.h '를 사용하고 있습니다. 장치는 간단한 Atmel/Arduino 컨트롤러입니다. – JavaCake