센서를 하나 제어하려고 하는데요.
센서 값의 출력(low, high byte)이 나오질 않네요. ack 신호는 나오는데..ㅡ,.ㅡ
요센서는 다음과 같은 프로토콜로 동작합니다.
start(1 bit) + slave address(0x39 - 7bit) + wr(1 bit) + ack(1 bit) + command(0xD6) + ack(1 bit) + repeat start(1 bit) + slave address(0x39 - 7bit) + rd(1 bit) + ack(1 bit) + data byte1(low byte) + ack(1 bit) + data byte2(high byte) + ack(1 bit) + stop(1 bit)
오실로스코프로 출력파형을 측정해봐도 이상하게도 다른 신호들은 다 나오는데 data byte1과 data byte2만 출력이 안나오네요.
혹시 제 코드가 잘못 된건 아닌지요..ㅠㅠ
오실로 스코프 파형도 첨부합니다.
int main(int argc, char **argv)
{
char filename[20];
int file, i;
unsigned char slave_addr = 0x72>>1; //setting slave address
unsigned char command[1];
unsigned char receive[2];
struct i2c_rdwr_ioctl_data i2c_rwctl;
struct i2c_msg i2c_msgs[2];
__s32 res;
sprintf(filename, "/dev/i2c-0");
//port open
if( (file = open(filename, O_RDWR) ) < 0 )
{
printf("File Open Errorn");
exit(1);
}
else
printf("File Open Successn");
//setting i2c device driver address
if( ioctl(file, I2C_SLAVE, slave_addr) < 0 )
{
printf("Error : Slave Address...n");
exit(1);
}
else
printf("Success : Slave Address...n");
printf("nSlave address : %xn", slave_addr);
i = 0;
while(1)
{
command[0] = 0xD6;
//make read 1st packet
i2c_msgs[0].flags = 0;
i2c_msgs[0].addr = slave_addr;
i2c_msgs[0].len = 1;
i2c_msgs[0].buf = &command[0];
//make read 2nd packet
i2c_msgs[1].flags = I2C_M_RD;
i2c_msgs[1].addr = slave_addr;
i2c_msgs[1].len = 2;
i2c_msgs[1].buf = &receive[0];
i2c_rwctl.msgs = &i2c_msgs[0];
i2c_rwctl.nmsgs = 2;
res = ioctl(file, I2C_RDWR, &i2c_rwctl);
printf("this is no start versionn");
printf("%d is complete. res : %dn", i, res);
printf("---------------------------n");
printf("%dth read low byte : %Xn", i, receive[0]);
printf("%dth read high byte : %Xn", i, receive[1]);
printf("---------------------------n");
sleep(1);
i++;
}
}