작성
·
205
0
안녕하세요 기압센서 부분 관련 질문 드립니다.
질문 1)
강의를 보면 10분 50초 부분에 3 bytes를 받아서
상위 두 bytes를 shift하고 bitwise OR연산을 한다고 하는데 강의 뒷 부분의 실제 코드에는 그러한 연산을 하는 부분이 없는거 같은데 어느 함수 부분에서 그러한 연산을 하나요??
질문 2)
10분 23초 부분에 EN_LPFP와 LPFP_CFG 를 각가 1로 설정해야 된다고 되어 있는데 코드 어느 부분에서 그러한 설정을 하나요??
답변 2
1
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을 넣게 되는 것이죠.