• 카테고리

    질문 & 답변
  • 세부 분야

    임베디드 · IoT

  • 해결 여부

    미해결

안녕하세요 질문 있습니다.

22.06.15 02:06 작성 조회수 142

0

안녕하세요 기압센서 부분 관련 질문 드립니다.

 

질문 1)

강의를 보면 10분 50초 부분에 3 bytes를 받아서

상위 두 bytes를 shift하고 bitwise OR연산을 한다고 하는데 강의 뒷 부분의 실제 코드에는 그러한 연산을 하는 부분이 없는거 같은데 어느 함수 부분에서 그러한 연산을 하나요??

질문 2)

10분 23초 부분에 EN_LPFP와 LPFP_CFG 를 각가 1로 설정해야 된다고 되어 있는데 코드 어느 부분에서 그러한 설정을 하나요??

답변 2

·

답변을 작성해보세요.

1

김동현님의 프로필

김동현

질문자

2022.06.15

명쾌한 답변 감사 드립니다.

0

안녕하세요!

A1)

강의 10:50의 설명에서는 bitwise shift를 통해 1바이트 3개를 3바이트 하나의 데이터로 합치지만, LPS22HH.c 라이브러리 에서는

LPS22HH_Readbytes(PRESSURE_OUT_XL, 3, (unsigned char*)pressure);

함수를 호출하고, 그 안에서는 아래같은 코드가 수행됩니다.

void LPS22HH_Readbytes(unsigned char reg_addr, unsigned char len, unsigned char* data)

{

...

SPI3_SendByte(reg_addr | 0x80); //Register. MSB 1 is read instruction.

while(i < len)

{

data[i++] = SPI3_SendByte(0x00); //Send DUMMY

}

...

}

이 코드의 내용은 (unsigned char*)pressure 포인터의 시작 주소부터 1번지씩 3 번 증가시키면서 읽은 값을 저장하는 코드입니다.

이 내용은 C언어의 포인터에 대한 내용이고, 코드가 강의 내용과는 살짝 달라 보이지만 연산의 결과는 동일합니다.

이 코드를 강의의 내용처럼 바꾼다면 아래처럼 할 수 있겠죠.

unsigned char tmp1 = SPI3_SendByte(0x00); //Send DUMMY

unsigned char tmp2 = SPI3_SendByte(0x00); //Send DUMMY

unsigned char tmp3 = SPI3_SendByte(0x00); //Send DUMMY

unsigned int total = (tmp3 << 16) | (tmp2 << 8) | tmp1;

 

A2)

해당 내용은 LPS22HH의 데이터시트를 보면서 라이브러리 코드와 비교하셔야 합니다.

데이터시트의 레지스터 맵 부분을 보시면 

이런 표를 보실 수 있습니다. 이것은 CTRL_REG1의 각각의 비트가 의미하는게 뭔지를 나타냅니다.

여기서 빨간색 네모 친 bit2와 bit3이 각각 LPFP_CFG와 EN_LPFP를 나타내죠. 이걸 기억해두시고,

이번에는 LPS22HH.c 의 int LPS22HH_Initialization(void) 함수를 보시면  196번째 줄 부터

// Enable LPF, Cut-off frequency

//0x08: ODR/9 0x0c: ODR/20

temp_reg = LPS22HH_Readbyte(CTRL_REG1);

temp_reg = temp_reg | 0x0c; //0000 1100

LPS22HH_Writebyte(CTRL_REG1, temp_reg);

이런 코드를 보실 수 있습니다.

이 코드는 CTRL_REG1 의 bit2와 bit3에 1을 넣는 코드입니다. (나머지는 그대로 둠)

따라서 LPFP_CFG와 EN_LPFP에 둘 다 1을 넣게 되는 것이죠.