이문서는 Renesas의 ZSSC3241 센서 신호 컨디셔너 IC에 대해 깊이 파고들어 보겠습니다. 이 IC는 저항성 센서(브리지, 하프 브리지, Pt100, NTC/PTC 등)의 신호를 증폭, 디지털화, 보정하는 데 특화된 제품으로, 산업 자동화, 압력/유량 센싱, 의료 기기 등 다양한 응용 분야에서 활용됩니다. 최근에 ZSSC3241 데이터시트(REN_zssc3241-datasheet_DST_20240202.pdf)를 분석하며 Arduino 개발환경에서 I2C 인터페이스를 이용한 구현 코드입니다.
이 글은 데이터시트의 주요 기능을 바탕으로 한 분석과, 모든 기능을 포괄하는 I2C 코드 구현을 중심으로 구성했습니다. 데이터시트를 다시 확인하여 내용의 완전성을 보강하였으며, 코드에 상세한 주석을 추가했습니다. 초보자도 따라할 수 있도록 단계별로 설명하겠습니다. 코드 예시는 Arduino 라이브러리를 사용하여, 기존에 작성된 문서 [ZSSC3241]Sensor Signal Conditioner IC를 STM32 I2C로 제어하는 코드 가이드에는 코드를 변환하였습니다.
ZSSC3241 IC 개요와 데이터시트 분석
ZSSC3241은 센서 신호를 고정밀도로 처리하는 IC로, 주요 기능은 다음과 같습니다:
- 아날로그 프론트엔드 (AFE): 프로그래머블 게인 증폭기(PGA), ADC(12~24비트 해상도), 온도 센서(내부/외부)를 포함. 센서 공급 방식(비율 전압, 절대 전압, 전류 루프)을 선택할 수 있습니다. 데이터시트 섹션 6.2에서 상세히 설명되며, 센서 유형에 따라 설정이 필요합니다.
- 디지털 인터페이스: I2C, SPI, OWI 지원. I2C는 최대 3.4MHz 속도, 슬레이브 주소 기본값 0x00. 인터페이스 선택은 전원 인가 후 첫 번째 유효 신호로 결정됩니다(섹션 6.4).
- 작동 모드:
- 슬립 모드: 저전력 대기, 디지털 출력 전용.
- 명령 모드: 사용자가 명령으로 측정 실행, 테스트/캘리브레이션에 적합.
- 사이클릭 모드: 자동 주기적 측정, 연속 출력에 최적화.
- DAC 및 아날로그 출력: 13~16비트 DAC로 전압(0~1V, 0~5V, 비율) 또는 전류 루프(4~20mA) 출력. SSF2 레지스터에서 설정(섹션 6.5.3).
- 진단 기능: 센서 연결 체크, 메모리 무결성, 칩 크랙 검출 등. UPDATE_DIAG(0xB2)와 CHECK_DIAG(0xB0) 명령 사용(섹션 6.3).
- NVM (Non-Volatile Memory): 보정 계수와 설정 저장, 주소 0x00~0x35 (고객용). 잠금 기능(lock 비트) 지원(Table 35, 페이지 51).
- 기타 기능: 인터럽트(EOC 핀), 외부 LDO(5V~48V), 보정 계수 쓰기, 온칩 온도 센서, 외부 온도 센서 지원. 데이터시트 전체 기능은 섹션 6에서 상세히 설명됩니다.
이 IC는 센서 신호 보정(SSC) 수학 코어를 통해 센서 오프셋, 감도, 온도 드리프트, 비선형성을 보정합니다. 보정 계수는 다항식 형태로 NVM에 저장되며, 쓰기 전에 NVM 잠금 해제가 필수입니다.
Arduino 개발환경에서 I2C 인터페이스로 이용한 코드구현
아래 코드는 데이터시트의 모든 기능을 I2C로 구현한 것입니다.
주요 기능:
- 작동 모드 전환 (명령, 사이클릭, 슬립).
- NVM 읽기/쓰기, 잠금 해제 (RESO 핀 사용).
- 아날로그 프론트엔드 설정.
- 원시 데이터 및 SSC 보정 데이터 읽기.
- DAC 설정.
- 사이클릭 모드 스케줄 설정.
- 인터럽트 및 진단 기능.
- 외부 LDO 설정.
- 보정 계수 쓰기.
전체 코드
// ZSSC3241 데이터시트 기반 Arduino I2C 구현 코드
// 모든 기능 커버: 모드 전환, NVM 읽기/쓰기, AFE 설정, 데이터 읽기, DAC, 진단, 인터럽트, 외부 LDO, 보정 계수
// 원본 STM32 HAL 코드의 기능을 Arduino 환경에 맞게 변환
// 상세 주석 추가
#include <Wire.h>
// ZSSC3241 I2C 슬레이브 주소 (7비트) - 데이터시트 섹션 6.4.2
#define ZSSC3241_SLAVE_ADDR 0x00
// RESO 핀 설정 (예: D8) - 데이터시트 핀 7, 리셋 및 NVM 잠금 해제 용
#define RESO_PIN 8
// 데이터 유형 정의 - 센서/온도 구분
typedef enum { SENSOR, TEMPERATURE } DataType;
// 오류 처리 함수 - 시리얼 모니터에 에러 메시지 출력
void errorHandler(const char* msg) {
Serial.print("Error: ");
Serial.println(msg);
while (1); // 무한 루프, 실제로는 더 정교한 오류 처리 필요
}
// 상태 바이트 읽기 (NOP 명령) - 데이터시트 Table 19, 섹션 6.4.1
// NOP (FxHEX)으로 상태 바이트(Busy, Mode, Memory Error 등) 확인
uint8_t getStatus() {
uint8_t nop_cmd = 0xFF; // NOP 명령 코드
uint8_t status;
Wire.beginTransmission(ZSSC3241_SLAVE_ADDR);
Wire.write(nop_cmd);
if (Wire.endTransmission(false) != 0) { // 'false'로 전송 후 버스 점유
errorHandler("Status command failed");
}
if (Wire.requestFrom(ZSSC3241_SLAVE_ADDR, 1) != 1) { // 1바이트 수신 요청
errorHandler("Status receive failed");
}
status = Wire.read();
return status;
}
// 장치가 바쁜지 확인 - 상태 바이트 비트 5 (Busy?) 확인
bool isDeviceBusy() {
return (getStatus() & 0x20) != 0; // Busy 비트(비트 5) 확인
}
// 명령 모드로 전환 - START_CM (0xA9) 명령, 데이터시트 섹션 6.6.1
bool enterCommandMode() {
uint8_t cmd = 0xA9; // START_CM 명령 코드
Wire.beginTransmission(ZSSC3241_SLAVE_ADDR);
Wire.write(cmd);
if (Wire.endTransmission() != 0) {
return false;
}
delay(10); // 모드 전환 후 안정화 대기 시간 (데이터시트 권장)
return true;
}
// 사이클릭 모드로 전환 - START_CYC (0xAB) 명령, 데이터시트 섹션 6.6.1
bool enterCyclicMode() {
uint8_t cmd = 0xAB; // START_CYC 명령 코드
Wire.beginTransmission(ZSSC3241_SLAVE_ADDR);
Wire.write(cmd);
if (Wire.endTransmission() != 0) {
return false;
}
delay(10); // 모드 전환 후 안정화 대기
return true;
}
// 슬립 모드로 전환 - START_SLEEP (0xA8) 명령, 데이터시트 섹션 6.6.1
bool enterSleepMode() {
uint8_t cmd = 0xA8; // START_SLEEP 명령 코드
Wire.beginTransmission(ZSSC3241_SLAVE_ADDR);
Wire.write(cmd);
if (Wire.endTransmission() != 0) {
return false;
}
delay(10); // 모드 전환 후 안정화 대기
return true;
}
// NVM 잠금 상태 확인 - SSF1 (0x03) 레지스터 비트 14 (lock) 확인, 데이터시트 Table 35
bool isNvmLocked() {
uint8_t ssf1[2];
Wire.beginTransmission(ZSSC3241_SLAVE_ADDR);
Wire.write(0x03); // 레지스터 주소
if (Wire.endTransmission(false) != 0) {
return true; // 읽기 실패 시 잠긴 것으로 가정
}
if (Wire.requestFrom(ZSSC3241_SLAVE_ADDR, 2) != 2) {
return true;
}
ssf1[0] = Wire.read();
ssf1[1] = Wire.read();
return (ssf1[0] & 0x40) != 0; // 비트 14 (lock) 확인
}
// RESO 핀으로 NVM 잠금 해제 및 리셋
void unlockNvm() {
pinMode(RESO_PIN, OUTPUT);
// RESO 핀을 LOW로 설정하여 리셋 실행
digitalWrite(RESO_PIN, LOW);
delay(10); // 리셋 유지 시간 (데이터시트 권장 최소 시간)
digitalWrite(RESO_PIN, HIGH); // 리셋 해제
delay(10); // 안정화 대기 시간
}
// 체크섬 갱신 - Calculate NVM Checksum (0x90) 명령, 데이터시트 섹션 6.6.2
bool updateChecksum() {
uint8_t cmd = 0x90; // 체크섬 갱신 명령
Wire.beginTransmission(ZSSC3241_SLAVE_ADDR);
Wire.write(cmd);
return Wire.endTransmission() == 0;
}
// NVM에 데이터 쓰기 (일반화된 함수) - Memory Write (0x40~0x75), 데이터시트 Table 34
bool writeNvmData(uint8_t address, uint8_t *data, uint8_t size) {
if (isNvmLocked()) {
unlockNvm(); // NVM 잠금 해제 시도
if (isNvmLocked()) {
return false; // 여전히 잠겨 있으면 실패
}
}
if (!enterCommandMode()) return false; // 쓰기 전에 명령 모드로 전환
uint8_t write_addr = address + 0x40; // 쓰기 주소 = NVM 주소 + 0x40
Wire.beginTransmission(ZSSC3241_SLAVE_ADDR);
Wire.write(write_addr);
Wire.write(data, size);
if (Wire.endTransmission() != 0) {
return false;
}
return updateChecksum(); // 쓰기 후 체크섬 갱신
}
// NVM 데이터 읽기 (일반화된 함수) - Memory Read (0x00~0x3F), 데이터시트 Table 34
bool readNvmData(uint8_t address, uint8_t *data, uint8_t size) {
if (!enterCommandMode()) return false; // 읽기 전에 명령 모드로 전환
Wire.beginTransmission(ZSSC3241_SLAVE_ADDR);
Wire.write(address);
if (Wire.endTransmission(false) != 0) {
return false;
}
if (Wire.requestFrom(ZSSC3241_SLAVE_ADDR, size) != size) {
return false;
}
for (int i = 0; i < size; i++) {
data[i] = Wire.read();
}
return true;
}
// 전체 NVM 읽기 (0x00~0x35, 고객용) - 데이터시트 Table
bool readAllNvm(uint8_t *data) {
if (!enterCommandMode()) return false;
for (uint8_t i = 0; i <= 0x35; i++) {
if (!readNvmData(i, &data[i * 2], 2)) return false;
}
return true;
}
// 전체 NVM 쓰기 (0x00~0x35)
bool writeAllNvm(uint8_t *data) {
if (isNvmLocked()) {
unlockNvm();
if (isNvmLocked()) {
return false;
}
}
if (!enterCommandMode()) return false;
for (uint8_t i = 0; i <= 0x35; i++) {
if (!writeNvmData(i, &data[i * 2], 2)) return false;
}
return true;
}
// 아날로그 프론트엔드 설정 - 데이터시트 섹션 6.2, Table 5~13
bool configureAnalogFrontend() {
// SSF1 설정: 센서 공급 방식(비율 전압), 온도 소스(내부), 기본 모드(명령 모드)
uint8_t ssf1[2] = {0x00, 0x00}; // sensor_sup = 00, temp_source = 000, default_mode = 00
if (!writeNvmData(0x03, ssf1, 2)) return false;
// SM_config1 설정: Gain_stage1 = 40 V/V, ioffsc = 0, adc_bits = 16비트
uint8_t sm_config1[2] = {0x40, 0x70}; // adc_bits = 0100, ioffsc = 0000, Gain_stage1 = 0111
if (!writeNvmData(0x14, sm_config1, 2)) return false;
// SM_config2 설정: Gain_stage2 = 1.2 V/V
uint8_t sm_config2[2] = {0x00, 0x01}; // Gain_stage2 = 001
if (!writeNvmData(0x15, sm_config2, 2)) return false;
// extTemp_config1 설정: 외부 온도 센서 설정 (예시)
uint8_t ext_temp_config1[2] = {0x00, 0x00}; // 기본값
if (!writeNvmData(0x16, ext_temp_config1, 2)) return false;
// extTemp_config2 설정: 외부 온도 센서 추가 설정 (예시)
uint8_t ext_temp_config2[2] = {0x00, 0x00}; // 기본값
if (!writeNvmData(0x17, ext_temp_config2, 2)) return false;
return true;
}
// 온칩 진단 수행 - UPDATE_DIAG (0xB2) 및 CHECK_DIAG (0xB0), 데이터시트 섹션 6.3
bool performDiagnostics() {
uint8_t cmd = 0xB2; // UPDATE_DIAG 명령: 모든 진단 체크 수행
Wire.beginTransmission(ZSSC3241_SLAVE_ADDR);
Wire.write(cmd);
if (Wire.endTransmission() != 0) {
return false;
}
while (isDeviceBusy()) {
delay(10); // 진단 완료 대기
}
cmd = 0xB0; // CHECK_DIAG 명령: 진단 결과 읽기
Wire.beginTransmission(ZSSC3241_SLAVE_ADDR);
Wire.write(cmd);
if (Wire.endTransmission(false) != 0) {
return false;
}
uint8_t diag_data[2];
if (Wire.requestFrom(ZSSC3241_SLAVE_ADDR, 2) != 2) {
return false;
}
diag_data[0] = Wire.read();
diag_data[1] = Wire.read();
// diag_data 분석: 데이터시트 Table 18 참조
return true;
}
// 원시 데이터 읽기 - Raw Sensor (0xA2) / Temperature (0xA4), 데이터시트 섹션 6.5.1
int32_t readRawData(DataType type) {
if (!enterCommandMode()) {
errorHandler("Failed to enter command mode for raw read");
}
uint8_t cmd = (type == SENSOR) ? 0xA2 : 0xA4; // 명령 선택
Wire.beginTransmission(ZSSC3241_SLAVE_ADDR);
Wire.write(cmd);
if (Wire.endTransmission() != 0) {
errorHandler("Raw data command failed");
}
while (isDeviceBusy()) {
delay(10); // 변환 완료 대기
}
uint8_t data[3];
if (Wire.requestFrom(ZSSC3241_SLAVE_ADDR, 3) != 3) {
errorHandler("Raw data receive failed");
}
data[0] = Wire.read();
data[1] = Wire.read();
data[2] = Wire.read();
int32_t raw_value = ((int32_t)data[0] << 16) | ((int32_t)data[1] << 8) | data[2]; // 24비트 데이터 조합
if (raw_value & 0x800000) {
raw_value |= 0xFF000000; // 두 개의 보수 부호 확장
}
return raw_value;
}
// SSC 보정 데이터 읽기 - Measure (0xAA), 데이터시트 섹션 6.5.1
bool readSscData(int32_t *sensor_data, int32_t *temp_data) {
uint8_t cmd = 0xAA; // SSC 보정 측정 명령
Wire.beginTransmission(ZSSC3241_SLAVE_ADDR);
Wire.write(cmd);
if (Wire.endTransmission() != 0) {
return false;
}
while (isDeviceBusy()) {
delay(10); // 변환 완료 대기
}
uint8_t data[6];
if (Wire.requestFrom(ZSSC3241_SLAVE_ADDR, 6) != 6) {
return false;
}
data[0] = Wire.read();
data[1] = Wire.read();
data[2] = Wire.read();
data[3] = Wire.read();
data[4] = Wire.read();
data[5] = Wire.read();
*sensor_data = ((int32_t)data[0] << 16) | ((int32_t)data[1] << 8) | data[2]; // 센서 데이터
if (*sensor_data & 0x800000) *sensor_data |= 0xFF000000; // 부호 확장
*temp_data = ((int32_t)data[3] << 16) | ((int32_t)data[4] << 8) | data[5]; // 온도 데이터
if (*temp_data & 0x800000) *temp_data |= 0xFF000000; // 부호 확장
return true;
}
// 사이클릭 모드에서 최신 데이터 읽기 - 데이터시트 섹션 6.5.2
bool readLatestDataCyclic(int32_t *sensor_data, int32_t *temp_data) {
uint8_t data[6];
if (Wire.requestFrom(ZSSC3241_SLAVE_ADDR, 6) != 6) {
return false;
}
data[0] = Wire.read();
data[1] = Wire.read();
data[2] = Wire.read();
data[3] = Wire.read();
data[4] = Wire.read();
data[5] = Wire.read();
*sensor_data = ((int32_t)data[0] << 16) | ((int32_t)data[1] << 8) | data[2]; // 센서 데이터
if (*sensor_data & 0x800000) *sensor_data |= 0xFF000000; // 부호 확장
*temp_data = ((int32_t)data[3] << 16) | ((int32_t)data[4] << 8) | data[5]; // 온도 데이터
if (*temp_data & 0x800000) *temp_data |= 0xFF000000; // 부호 확장
return true;
}
// DAC 설정 (전압 출력 예: 0-5V) - 데이터시트 Table 29, 섹션 6.5.3
bool configureDac() {
uint8_t ssf2[2] = {0x60, 0x00}; // Aout_setup = 011 (0~5V), dacouttype = 0 (센서 데이터)
return writeNvmData(0x04, ssf2, 2);
}
// 사이클릭 모드 스케줄 설정 - 데이터시트 섹션 6.5.2, 레지스터 0x1E~0x20
bool configureCyclicScheduler() {
uint8_t scheduler0[2] = {0x00, 0x00}; // S (센서 측정), pause = 0
if (!writeNvmData(0x1E, scheduler0, 2)) return false;
uint8_t scheduler1[2] = {0x00, 0x01}; // T (온도 측정), pause = 0
if (!writeNvmData(0x1F, scheduler1, 2)) return false;
uint8_t scheduler2[2] = {0x00, 0xFF}; // 비활성화
if (!writeNvmData(0x20, scheduler2, 2)) return false;
return true;
}
// 인터럽트 설정 - 데이터시트 섹션 6.5.4, 레지스터 0x21
bool configureInterrupt() {
uint8_t int_data[2] = {0x00, 0x00}; // 예시: 임계값 및 히스테리시스 설정
return writeNvmData(0x21, int_data, 2);
}
// 진단 리셋 - RESET_DIAG (0xB1), 데이터시트 섹션 6.3
bool resetDiagnostics() {
uint8_t cmd = 0xB1; // RESET_DIAG 명령
Wire.beginTransmission(ZSSC3241_SLAVE_ADDR);
Wire.write(cmd);
return Wire.endTransmission() == 0;
}
// 외부 LDO 설정 (5V~48V) - 데이터시트 섹션 6.7, 레지스터 0x22
bool configureExternalLdo() {
uint8_t ldo_data[2] = {0x00, 0x00}; // 예시: VDD_ldoctrl_target 설정
return writeNvmData(0x22, ldo_data, 2);
}
// 캘리브레이션 계수 쓰기 - 데이터시트 섹션 7, Table 36
bool writeCalibrationCoefficient(uint8_t address, uint16_t coefficient) {
uint8_t data[2] = {(uint8_t)(coefficient >> 8), (uint8_t)(coefficient & 0xFF)};
return writeNvmData(address, data, 2);
}
// 보정 계수 설정 예시 - 센서/온도 계수 배열 쓰기
bool configureCalibrationCoefficients() {
// 센서 보정 계수 (예시 값, 실제 캘리브레이션 데이터로 대체)
uint16_t sensor_coeffs[8] = {0x1000, 0x2000, 0x3000, 0x4000, 0x5000, 0x6000, 0x7000, 0x8000};
for (uint8_t i = 0; i < 8; i++) {
if (!writeCalibrationCoefficient(0x06 + i, sensor_coeffs[i])) return false;
}
// 온도 보정 계수 (예시 값, 실제 캘리브레이션 데이터로 대체)
uint16_t temp_coeffs[6] = {0x9000, 0xA000, 0xB000, 0xC000, 0xD000, 0xE000};
for (uint8_t i = 0; i < 6; i++) {
if (!writeCalibrationCoefficient(0x18 + i, temp_coeffs[i])) return false;
}
return updateChecksum();
}
// 모든 기능 통합 설정
bool configureAll() {
if (!configureAnalogFrontend()) return false;
if (!configureCalibrationCoefficients()) return false;
if (!configureDac()) return false;
if (!configureCyclicScheduler()) return false;
if (!configureInterrupt()) return false;
if (!configureExternalLdo()) return false;
return true;
}
void setup() {
// I2C 통신 시작
Wire.begin();
// 시리얼 통신 시작 (디버깅 용)
Serial.begin(9600);
Serial.println("ZSSC3241 Arduino Driver Test");
// NVM 잠금 해제 (필요시)
if (isNvmLocked()) {
unlockNvm();
}
// 모든 설정 실행
if (!configureAll()) {
errorHandler("Failed to configure all settings");
}
// 진단 수행
if (!performDiagnostics()) {
errorHandler("Failed to perform diagnostics");
}
// 원시 데이터 읽기
int32_t sensor_data = readRawData(SENSOR);
int32_t temp_data = readRawData(TEMPERATURE);
Serial.print("Raw Sensor Data: ");
Serial.println(sensor_data);
Serial.print("Raw Temperature Data: ");
Serial.println(temp_data);
// SSC 데이터 읽기
int32_t ssc_sensor, ssc_temp;
if (readSscData(&ssc_sensor, &ssc_temp)) {
Serial.print("SSC Sensor Data: ");
Serial.println(ssc_sensor);
Serial.print("SSC Temperature Data: ");
Serial.println(ssc_temp);
} else {
errorHandler("Failed to read SSC data");
}
// 사이클릭 모드로 전환 및 데이터 읽기
if (enterCyclicMode()) {
Serial.println("Entered Cyclic Mode. Reading latest data...");
// 실제 애플리케이션에서는 루프에서 계속 읽음
if (readLatestDataCyclic(&cyclic_sensor, &cyclic_temp)) {
Serial.print("Cyclic Sensor Data: ");
Serial.println(cyclic_sensor);
Serial.print("Cyclic Temperature Data: ");
Serial.println(cyclic_temp);
} else {
errorHandler("Failed to read cyclic data");
}
} else {
errorHandler("Failed to enter cyclic mode");
}
// 진단 리셋
if (!resetDiagnostics()) {
errorHandler("Failed to reset diagnostics");
}
// 슬립 모드 전환
if (!enterSleepMode()) {
errorHandler("Failed to enter sleep mode");
}
}
void loop() {
// 메인 루프 - 실제 응용에서 데이터 처리 추가
// 사이클릭 모드에서 지속적으로 데이터 읽기
}
코드 설명
위 코드에서 각 함수는 데이터시트의 특정 섹션과 연계됩니다:
함수데이터시트 섹션설명
get_status | 6.4.1, Table 19 | NOP 명령으로 상태 바이트(Busy, Mode, Error) 확인 |
enter_command_mode | 6.6.1, Table 34 | START_CM (0xA9)으로 명령 모드 전환 |
enter_cyclic_mode | 6.6.1, Table 34 | START_CYC (0xAB)으로 사이클릭 모드 전환 |
enter_sleep_mode | 6.6.1, Table 34 | START_SLEEP (0xA8)으로 슬립 모드 전환 |
is_nvm_locked | Table 35, SSF1 | SSF1 비트 14 (lock) 확인 |
unlock_nvm | 핀 7 (RESO) | RESO 핀으로 리셋 및 잠금 해제 |
update_checksum | 6.6.2, Table 34 | Calculate NVM Checksum (0x90) |
write_nvm_data | Table 34 | Memory Write (0x40~0x75) |
read_nvm_data | Table 34 | Memory Read (0x00~0x3F) |
read_all_nvm | Table 35 | 전체 NVM (0x00~0x35) 읽기 보강 |
write_all_nvm | Table 35 | 전체 NVM (0x00~0x35) 쓰기 보강 |
configure_analog_frontend | 6.2, Table 5~13 | AFE 설정 (SSF1, SM_config1/2, extTemp_config) |
perform_diagnostics | 6.3, Table 17/18 | UPDATE_DIAG (0xB2) 및 CHECK_DIAG (0xB0) |
read_raw_data | 6.5.1, Table 34 | Raw Sensor/Temperature (0xA2/0xA4) |
read_ssc_data | 6.5.1, Table 34 | Measure (0xAA)으로 SSC 데이터 읽기 |
read_latest_data_cyclic | 6.5.2 | 사이클릭 모드 최신 데이터 읽기 |
configure_dac | 6.5.3, Table 29 | DAC 및 아날로그 출력 설정 (SSF2) |
configure_cyclic_scheduler | 6.5.2 | Measurement Scheduler (0x1E~0x20) |
configure_interrupt | 6.5.4 | 인터럽트 설정 (0x21) |
reset_diagnostics | 6.3 | RESET_DIAG (0xB1) |
configure_external_ldo | 6.7 | 외부 LDO 설정 (0x22) |
configure_all | 전체 | 모든 기능 통합 설정 |
write_calibration_coefficient | 7, Table 36 | 보정 계수 쓰기 |
configure_calibration_coefficients | 7 | 보정 계수 배열 설정 |