9축센서를 다루다 보니
3개의 센서로 나눠져 있어서 하나씩 하려고한다.
그 중 자이로스코프 ITG3205 에 대해 알아보자.
참고) HW-579 이외에 GY-85 나 Gyroscope 6축 센서 등에 들어있다.
AD0 는 같은 장치가 있을 때 구분하는 값이다.
일반적으로 0으로 잡고 하면된다.
I2C Device Address = 110 1000
0110 1000 => 0x68
7bits 주소이다.
Device Address + write bit(0)
1101 0000 = 0xD0
Device Address + Read bit(1)
1101 0001 = 0xD1
Single-Byte Read Sequence : 1 바이트 데이터 읽어오기
Burst Read Sequence : 여러바이트 읽어오기
Single-Byte Write Sequence : 1 바이트 데이터 쓰기
Burst Write Sequence : 여러바이트 쓰기
레지스터 맵을 보면
0x1D ~ 0x22 에서 필요한 자이로 X, Y, Z 데이터가 있음을 알 수 있다
내용을 종합해보면
로 볼 수 있다.
물론 Burst 로 한번에 쓰거나 읽을 수도 있지만
X, Y, Z에 따라 분할하는게 오류가 적을 것 같다.
Device 주소 읽기
Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0 |
---|---|---|---|---|---|---|---|
0 | 1 | 1 | 0 | 1 | 0 | 0 | - |
Bit0 은 같은 부품구분용 AD0 -> 0
0110 1000 => 0x68 추출
얻어온 Device 주소를 이용할 때
주소 7 bits + R/_W
AD + W = 110 1000 + Write Bit(0) = 1101 0000 = 0xD0
AD + R = 110 1000 + Write Bit(1) = 1101 0001 = 0xD1
Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0 |
---|---|---|---|---|---|---|---|
1 | 1 | 0 | 1 | 0 | 0 | 0 | 0/1 |
사용 함수
HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
uint8_t buffer[8];
HAL_I2C_Mem_Read(&hi2c1, 0xD0, 0x1D, 1, buffer, 1, 10) // AD + W
HAL_I2C_Mem_Read(&hi2c1, 0xD0, 0x1D, 1, buffer, 1, 10) // AD + W
HAL_I2C_Mem_Read(&hi2c1, 0xD0, 0x1D, 1, buffer, 1, 10) // AD + W
<작성 중>