ADPD188BI는 Analog Devices에서 제공하는 통합 광학 센서 모듈로, 이를 SPI를 통해 제어할 때 필요한 초기 설정 절차는 다음과 같습니다.
1. SPI 초기 설정
먼저, SPI 통신을 시작하기 위해 마스터 장치에서 SPI 설정을 맞추어야 합니다.
SPI 모드: ADPD188BI는 SPI 모드 0 (CPOL=0, CPHA=0)을 사용합니다.
클럭 속도: SPI 클럭 속도는 최대 1 MHz를 권장합니다.
데이터 전송 비트: 8비트 기준으로 전송되며, MSB(최상위 비트)가 먼저 전송됩니다.
2. ADPD188BI 초기 설정 절차
다음은 ADPD188BI 센서를 SPI로 초기화할 때 사용되는 주요 레지스터와 시퀀스입니다.
2.1 소프트 리셋 (Software Reset)
초기화를 위해 먼저 소프트웨어 리셋을 수행해야 합니다.
레지스터: 0x10
설정 값: 0x0001 (리셋 명령)
리셋 후 약간의 대기 시간을 두어야 합니다. (최소 10ms 정도)
2.2 클럭 설정 (Clock Configuration)
리셋 이후, 센서의 클럭 설정을 구성합니다.
레지스터: 0x04
설정 값: 0x0030 (기본 설정 값)
이 설정을 통해 센서의 클럭 동작을 안정화시킵니다.
2.3 모드 설정 (Mode Configuration)
ADPD188BI의 동작 모드를 설정합니다. 이 과정에서 활성화될 채널을 지정할 수 있습니다.
레지스터: 0x10
설정 값: 0x0002 (측정 모드 설정)
이후 센서가 원하는 동작 모드에 따라 추가 설정이 필요할 수 있습니다.
2.4 FIFO 설정 (FIFO Configuration)
데이터 버퍼(FIFO)의 설정도 초기화 과정에 포함됩니다.
레지스터: 0x14
설정 값: 0x0100 (FIFO 워터마크 설정)
FIFO는 센서 데이터가 SPI 인터페이스를 통해 효과적으로 전송되도록 관리하는 역할을 합니다.
2.5 LED 및 포토다이오드 설정 (LED & Photodiode Configuration)
센서의 LED 및 포토다이오드 설정을 구성하여, 원하는 광학 측정을 설정합니다.
레지스터: 0x22
설정 값: 0x0040 (기본 LED 설정)
레지스터: 0x30
설정 값: 0x0020 (기본 포토다이오드 설정)
2.6 인터럽트 설정 (Interrupt Configuration)
필요에 따라 인터럽트를 설정하여, 특정 이벤트 발생 시 SPI 인터페이스를 통해 알림을 받을 수 있습니다.
레지스터: 0x16
설정 값: 0x0001 (FIFO 워터마크 인터럽트 활성화)
3. 데이터 수집
이제 ADPD188BI가 초기화되었으므로, 센서 데이터를 수집할 준비가 되었습니다.
데이터 레지스터: 0x64부터 시작하여, 센서 데이터가 FIFO에 쌓인 데이터를 읽을 수 있습니다.
이러한 초기 설정 후에는 주기적으로 센서 데이터를 읽거나, 원하는 시간 간격에 따라 측정을 수행할 수 있습니다.
예제코드는 아래에
===================================================================================================
include “stm32f4xx_hal.h”
include “spi.h”
define ADPD188BI_CS_LOW() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET)
define ADPD188BI_CS_HIGH() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET)
// ADPD188BI 레지스터 주소
define ADPD188BI_REG_SOFT_RESET 0x10
define ADPD188BI_REG_CLK_CFG 0x04
define ADPD188BI_REG_MODE 0x10
define ADPD188BI_REG_FIFO_CFG 0x14
define ADPD188BI_REG_LED_CFG 0x22
define ADPD188BI_REG_PD_CFG 0x30
define ADPD188BI_REG_DATA_FIFO 0x64
// 함수 선언
void ADPD188BI_WriteRegister(uint8_t reg, uint16_t value);
uint16_t ADPD188BI_ReadRegister(uint8_t reg);
void ADPD188BI_Init(void);
void ADPD188BI_ReadData(uint16_t *dataBuffer, uint16_t length);
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_SPI1_Init();
// ADPD188BI 초기화
ADPD188BI_Init();
}
void ADPD188BI_Init(void) {
// ADPD188BI 소프트 리셋
ADPD188BI_WriteRegister(ADPD188BI_REG_SOFT_RESET, 0x0001);
HAL_Delay(10);
// 클럭 설정
ADPD188BI_WriteRegister(ADPD188BI_REG_CLK_CFG, 0x0030);
// 모드 설정 (측정 모드)
ADPD188BI_WriteRegister(ADPD188BI_REG_MODE, 0x0002);
// FIFO 설정
ADPD188BI_WriteRegister(ADPD188BI_REG_FIFO_CFG, 0x0100);
// LED 설정
ADPD188BI_WriteRegister(ADPD188BI_REG_LED_CFG, 0x0040);
// 포토다이오드 설정
ADPD188BI_WriteRegister(ADPD188BI_REG_PD_CFG, 0x0020);
}
void ADPD188BI_WriteRegister(uint8_t reg, uint16_t value) {
uint8_t txData[3];
txData[0] = (reg & 0x7F); // 쓰기 명령 (MSB가 0이어야 함)
txData[1] = (value >> 8) & 0xFF; // 상위 바이트
txData[2] = value & 0xFF; // 하위 바이트
ADPD188BI_CS_LOW();
HAL_SPI_Transmit(&hspi1, txData, 3, HAL_MAX_DELAY);
ADPD188BI_CS_HIGH();
}
uint16_t ADPD188BI_ReadRegister(uint8_t reg) {
uint8_t txData[1];
uint8_t rxData[2];
txData[0] = (reg | 0x80); // 읽기 명령 (MSB가 1이어야 함)
ADPD188BI_CS_LOW();
HAL_SPI_Transmit(&hspi1, txData, 1, HAL_MAX_DELAY);
HAL_SPI_Receive(&hspi1, rxData, 2, HAL_MAX_DELAY);
ADPD188BI_CS_HIGH();
return (rxData[0] << 8) | rxData[1];
}
void ADPD188BI_ReadData(uint16_t *dataBuffer, uint16_t length) {
for (int i = 0; i < length; i++) {
dataBuffer[i] = ADPD188BI_ReadRegister(ADPD188BI_REG_DATA_FIFO);
}
}