본문 바로가기
아날로그회로(Analog Circuit)/ADC관련

[ZSSC3230] 원시 센서(Raw Sensor) 측정 설정 절차

by linuxgo 2025. 8. 15.
반응형

 

이 글은 ZSSC3230 센서 신호 컨디셔너 IC의 그리고 원시 센서 측정 전 NVM 설정 절차를 데이터시트를 기반으로 정리한 내용입니다.

명령어 목록

ZSSC3230은 동작 제어, 메모리 읽기/쓰기, 측정을 위한 다양한 명령어를 지원합니다. 명령어의 사용 가능 여부는 동작 모드(슬립 모드, 커맨드 모드, 주기적 측정 모드)에 따라 다릅니다. 아래는 데이터시트의 표 15(26페이지)에 명시된 명령어 목록입니다.

명령어 코드 (바이트) 반환값 설명 슬립 모드 커맨드 모드 주기적 측정 모드
00HEX ~ 1FHEX 16비트 데이터 메모리 읽기: NVM 주소 00HEX에서 1FHEX까지 데이터를 읽음 아니오
20HEX ~ 3CHEX 뒤에 데이터 (0000HEX ~ FFFFHEX) 메모리 쓰기: NVM 주소 00HEX에서 1CHEX까지 데이터 쓰기. NVM 레지스터 주소는 명령어 코드에서 20HEX를 뺀 값 아니오
90HEX NVM 체크섬 계산: NVM의 체크섬을 계산하여 메모리에 저장 아니오
A2HEX 뒤에 데이터 0000HEX 24비트 원시 데이터 원시 센서 측정: SSC 보정 없이 센서 측정 수행. Sensor_config 레지스터에서 설정 로드. 오토-제로 센서 측정 포함 아니오
A3HEX 뒤에 데이터 ssssHEX 24비트 원시 데이터 사용자 설정으로 원시 센서 측정: SSC 보정 없이 센서 측정 수행. ssss는 사용자가 제공한 설정값. 오토-제로 센서 측정 포함 아니오
A6HEX 뒤에 데이터 0000HEX 24비트 원시 데이터 원시 온도 측정: SSC 보정 없이 온도 측정 수행. extTemp_Config1/2, T_config1/2, SSF1/2 레지스터에서 설정 로드. 오토-제로 온도 측정 포함 아니오
A8HEX START_SLEEP: 커맨드 모드 또는 주기적 측정 모드를 종료하고 슬립 모드로 전환. 상태 바이트만 반환 아니오
A9HEX START_CM: 커맨드 모드 진입, 관련 명령어 활성화. 전원 리셋(POR) 후 첫 번째 명령어로 보내야 함 아니오 아니오
AAHEX 24비트 SSC 보정 센서 데이터 및 온도 데이터 측정: 전체 측정 시퀀스(오토-제로 센서, 센서, 오토-제로 온도, 온도)를 트리거하고 SSC 보정 수행 아니오
ABHEX 24비트 SSC 보정 센서 데이터 및 온도 데이터 START_CYC: 연속 측정 주기, SSC 보정, 자동 디지털 출력 업데이트를 위한 주기적 측정 모드 진입 아니오
ACHEX 24비트 SSC 보정 센서 데이터 및 온도 데이터 오버샘플-2 측정: 2번의 전체 측정(AAHEX와 동일)을 수행하고 평균값 출력 아니오
ADHEX 24비트 SSC 보정 센서 데이터 및 온도 데이터 오버샘플-4 측정: 4번의 전체 측정(AAHEX와 동일)을 수행하고 평균값 출력 아니오
AEHEX 24비트 SSC 보정 센서 데이터 및 온도 데이터 오버샘플-8 측정: 8번의 전체 측정(AAHEX와 동일)을 수행하고 평균값 출력 아니오
AFHEX 24비트 SSC 보정 센서 데이터 및 온도 데이터 오버샘플-16 측정: 16번의 전체 측정(AAHEX와 동일)을 수행하고 평균값 출력 아니오
B0HEX 16비트 데이터 출력 (0: 성공 / 1: 실패) 브로큰 칩: 코너 와이어의 저항 테스트 아니오
B4HEX PDM 정지: PDM 출력 정지, NVM에서 PDM_enable 비트 변경 허용. 응답 없음 아니오 아니오
FXHEX 뒤에 데이터 XXHEX 소프트 리셋: 디지털 부분 전체 리셋. 임의의 데이터 바이트가 붙은 FXHEX 명령어로 실행. 응답 없음

참고:

  • 별표(*)가 붙은 명령어(A2HEX, A3HEX, A6HEX, ACHEX, ADHEX, AEHEX, AFHEX)는 SSC 보정이 없는 원시 또는 오버샘플 데이터를 제공하므로 캘리브레이션이나 평가에 유용합니다.
  • 오버샘플 명령어(ACHEX, ADHEX, AEHEX, AFHEX)는 오버샘플링 비율에 비례하여 실행 시간이 증가하지만 노이즈를 최소화한 결과를 제공합니다.
  • I2C 인터페이스를 통해 명령어를 전송하며, 응답은 상태 바이트와 데이터(해당되는 경우)로 구성됩니다.

메모리(NVM) 콘텐츠 할당

ZSSC3230의 비휘발성 메모리(NVM)는 16비트 폭의 28개 레지스터로 구성되며, 약 10,000회 재프로그래밍이 가능합니다. 메모리는 고객 사용 섹터(주소 00HEX ~ 1CHEX)와 르네사스 사용 섹터로 나뉩니다. 아래는 데이터시트의 표 16(28~32페이지)에 명시된 NVM 콘텐츠 할당입니다.

NVM 주소 워드/비트 범위 기본 설정 워드/비트 필드 이름 설명
00HEX 15:0 0000HEX Cust_ID0 고객 ID 바이트 0 (01HEX의 Cust_ID1과 결합하여 고객 ID 구성). I3C 동작 시, 레거시 가상 레지스터(LVR) 정보 포함: 0x1X, 인덱스 0, Fast Mode 지원.
01HEX 15:0 0000HEX Cust_ID1 고객 ID 바이트 1 (00HEX의 Cust_ID0와 결합하여 고객 ID 구성).
02HEX 6:0 000 0000BIN Slave_Addr I2C 및 OWI 슬레이브 주소 (유효 범위: 00HEX ~ 7FHEX, 기본값: 48HEX). 참고: 04HEX ~ 07HEX는 I2C 고속 모드용으로 예약됨.
8:7 00BIN INT_setup 인터럽트 설정, EOC 핀 기능:
00: 변환 종료 신호
01: TRSH1 초과 시 0-1 전환, 하회 시 1-0 전환
10: TRSH1 하회 시 0-1 전환, 초과 시 1-0 전환
11: TRSH1과 TRSH2에 따라 EOC 결정 (6.6.3절 참조).
9 0BIN PDM_enable PDM 출력 활성화:
0: 비활성화
1: 활성화 (리셋 후 주기적 측정 모드 시작).
11 0BIN siginv 신호 반전(“1-1/C”) 활성화:
0: 비활성화
1: 활성화.
14:12 000BIN CYC_period 주기적 측정 모드의 업데이트 주기:
000: 0.0ms (PDM 기본값)
001: 167ms
010: 333ms
011: 666ms
100: 1333ms
101: 2667ms
110: 5333ms
111: 할당되지 않음.
03HEX 15:0 0000HEX Offset_S[15:0] 24비트 센서 오프셋 보정 계수 Offset_S의 [15:0] 비트. MSB(부호 포함)는 0DHEX[15:8].
04HEX 15:0 0000HEX Gain_S[15:0] 24비트 센서 게인 계수 Gain_S의 [15:0] 비트. MSB(부호 포함)는 0DHEX[7:0].
05HEX 15:0 0000HEX Tcg[15:0] 24비트 센서 게인 온도 보정 계수 Tcg의 [15:0] 비트. MSB(부호 포함)는 0EHEX[15:8].
06HEX 15:0 0000HEX Tco[15:0] 24비트 센서 오프셋 온도 보정 계수 Tco의 [15:0] 비트. MSB(부호 포함)는 0EHEX[7:0].
07HEX 15:0 0000HEX SOT_tco[15:0] Tco에 적용되는 24비트 2차 보정 항 SOT_tco의 [15:0] 비트. MSB(부호 포함)는 0FHEX[15:8].
08HEX 15:0 0000HEX SOT_tcg[15:0] Tcg에 적용되는 24비트 2차 보정 항 SOT_tcg의 [15:0] 비트. MSB(부호 포함)는 0FHEX[7:0].
09HEX 15:0 0000HEX SOT_sens[15:0] 센서 판독에 적용되는 24비트 2차 보정 항 SOT_sens의 [15:0] 비트. MSB(부호 포함)는 10HEX[15:8].
0AHEX 15:0 0000HEX Offset_T[15:0] 24비트 온도 오프셋 보정 계수 Offset_T의 [15:0] 비트. MSB(부호 포함)는 10HEX[7:0].
0BHEX 15:0 0000HEX Gain_T[15:0] 24비트 온도 게인 계수 Gain_T의 [15:0] 비트. MSB(부호 포함)는 11HEX[15:8].
0CHEX 15:0 0000HEX SOT_T[15:0] 온도 판독에 적용되는 24비트 2차 보정 항 SOT_T의 [15:0] 비트. MSB(부호 포함)는 11HEX[7:0].
0DHEX 7:0 00HEX Gain_S[23:16] 24비트 센서 게인 보정 계수 Gain_S의 [23:16] 비트(부호 포함). LSB는 03HEX.
15:8 00HEX Offset_S[23:16] 24비트 센서 오프셋 보정 계수 Offset_S의 [23:16] 비트(부호 포함). LSB는 04HEX.
0EHEX 7:0 00HEX Tco[23:16] 24비트 센서 오프셋 온도 보정 계수 Tco의 [23:16] 비트(부호 포함). LSB는 05HEX.
15:8 00HEX Tcg[23:16] 24비트 센서 게인 온도 보정 계수 Tcg의 [23:16] 비트(부호 포함). LSB는 06HEX.
0FHEX 7:0 00HEX SOT_tcg[23:16] 24비트 2차 보정 항 SOT_tcg의 [23:16] 비트(부호 포함). LSB는 07HEX.
15:8 00HEX SOT_tco[23:16] 24비트 2차 보정 항 SOT_tco의 [23:16] 비트(부호 포함). LSB는 08HEX.
10HEX 7:0 00HEX Offset_T[23:16] 24비트 온도 오프셋 보정 계수 Offset_T의 [23:16] 비트(부호 포함). LSB는 09HEX.
15:8 00HEX SOT_sens[23:16] 24비트 2차 보정 항 SOT_sens의 [23:16] 비트(부호 포함). LSB는 0AHEX.
11HEX 7:0 00HEX SOT_T[23:16] 24비트 2차 보정 항 SOT_T의 [23:16] 비트(부호 포함). LSB는 0BHEX.
15:8 00HEX Gain_T[23:16] 24비트 온도 게인 계수 Gain_T의 [23:16] 비트(부호 포함). LSB는 0CHEX.
12HEX 5:0 00 0000BIN shift_cap 제로-시프트 커패시턴스(입력 오프셋 시프트) 정의:
00 0000: 오프셋 없음
00 0001: 0.25pF
...
11 1101: 15.00pF
11 1110: 15.50pF
11 1111: 15.75pF. cap_range를 초과하지 않아야 함.
7:6 00BIN adc_bits A2D 변환의 절대 비트 수 정의:
00: 12비트
01: 14비트 (기본값)
10: 16비트
11: 18비트.
8 0BIN noise_mode 노이즈 품질 vs. 에너지 소비 최적화 선택:
0: 저전류 모드
1: 저노이즈 모드.
13:9 0 0000BIN cap_range 최대 외부 신호 커패시턴스 선택:
00000: 0.5pF
00001: 1.0pF
...
11110: 15.5pF
11111: 16.0pF.
14 0BIN sensor_leakage 센서 누설 전류 보상 활성화:
0: 비활성화, 전체 다이내믹 레인지
1: 활성화, 0.5 × Vref (1비트 해상도 손실).
13HEX 15:0 0000HEX TRSH1[15:0] 24비트 인터럽트 임계값1 TRSH1의 [15:0] 비트. MSB는 15HEX[7:0].
14HEX 15:0 0000HEX TRSH2[15:0] 24비트 인터럽트 임계값2 TRSH2의 [15:0] 비트. MSB는 15HEX[15:8].
15HEX 7:0 00HEX TRSH1[23:16] 24비트 인터럽트 임계값1 TRSH1의 [23:16] 비트. LSB는 13HEX.
15:8 00HEX TRSH2[23:16] 24비트 인터럽트 임계값2 TRSH2의 [23:16] 비트. LSB는 14HEX.
16HEX 15:0 0000HEX SENS_Shift[15:0] 캘리브레이션 후 센서 오프셋 시프트 계수 SENS_Shift의 [15:0] 비트. MSB는 18HEX[7:0].
17HEX 15:0 0000HEX T_Shift[15:0] 캘리브레이션 후 온도 오프셋 시프트 계수 T_Shift의 [15:0] 비트. MSB는 18HEX[15:8].
18HEX 7:0 00HEX SENS_Shift[23:16] 캘리브레이션 후 센서 오프셋 시프트 계수 SENS_Shift의 [23:16] 비트. LSB는 16HEX.
15:8 00HEX T_Shift[23:16] 캘리브레이션 후 온도 오프셋 시프트 계수 T_Shift의 [23:16] 비트. LSB는 17HEX.
19HEX 1:0 00BIN CC_pin_selection 측정에 사용할 핀 정의:
00: 입력 없음
01: CC
10: CC’
11: CC와 CC’.
2 0BIN Dither EMI 성능 향상을 위한 디지털 디더링 활성화:
0: 비활성화
1: 활성화.
3 0BIN En_sh2 접지 모드에서 감산 모드 활성화:
0: 비활성화
1: 활성화.
4 0BIN En_shlddrv C0 핀에서 액티브 쉴드 드라이브 활성화:
0: 비활성화
1: 활성화.
5 0BIN Dyn_imp 아날로그 프론트엔드에서 높은 구동 전류 활성화:
0: 비활성화
1: 활성화 (센서 범위가 시프트 커패시터보다 작은 경우 필요).
6 0BIN Test_cap 약 2pF의 내부 참조 센서 커패시터 활성화:
0: 비활성화
1: 활성화.
1AHEX 15:0 0000HEX Reserved 르네사스 로트 추적 정보; 고객 사용을 위해 덮어쓸 수 있음.
1BHEX 15:0 0000HEX Reserved 르네사스 로트 추적 정보; 고객 사용을 위해 덮어쓸 수 있음.
1CHEX 15:0 0000HEX CRC NVM 무결성을 위한 체크섬(CRC). x16 + x15 + x2 + 1 다항식 사용. 전원 켜짐 시 확인, 성공 시 Memory Error 상태 비트를 0으로 설정.

참고:

  • NVM은 약 10,000회 재프로그래밍 가능하며, 최소 10년의 데이터 보존 기간을 보장합니다.
  • 캘리브레이션 계수(예: Offset_S, Gain_S, Tcg, Tco 등)는 24비트 값으로, 두 개의 16비트 레지스터(LSB와 부호를 포함한 MSB)로 나뉩니다.
  • 주소 1CHEX의 체크섬(CRC)은 전원 켜짐 시 메모리 무결성을 확인합니다.
  • 예약된 레지스터(19HEX[15:7], 1AHEX, 1BHEX)는 고객 데이터를 위해 사용 가능합니다.
  • 12HEX의 shift_cap과 cap_range 설정은 오프셋 시프트가 선택된 커패시턴스 범위를 초과하지 않도록 조정해야 합니다.

NVM 데이터 읽기/쓰기 절차

ZSSC3230의 비휘발성 메모리(NVM)에 접근하려면 I2C 인터페이스를 통해 특정 명령어를 전송해야 합니다. NVM은 00HEX부터 1CHEX까지의 28개 16비트 레지스터로 구성되며, 약 10,000회 재프로그래밍이 가능합니다. 아래는 전체 읽기, 전체 쓰기, 특정 주소 읽기, 특정 주소 쓰기를 수행하는 절차입니다.

1. 사전 준비

  • 동작 모드 확인: NVM 읽기/쓰기 명령은 슬립 모드 또는 커맨드 모드에서만 사용 가능합니다. 주기적 측정 모드에서는 불가능하므로, 필요한 경우 A8HEX(START_SLEEP) 명령을 보내 슬립 모드로 전환하거나, A9HEX(START_CM)를 보내 커맨드 모드로 진입해야 합니다.
  • I2C 설정: ZSSC3230의 기본 I2C 슬레이브 주소는 48HEX입니다(NVM 주소 02HEXSlave_Addr 필드에서 설정, 기본값: 000 0000BIN). 사용하는 주소가 다를 경우, NVM 설정을 확인하세요. I2C 통신은 표준 모드(최대 400kHz) 또는 고속 모드(최대 3.4MHz)를 지원합니다.
  • 전원 상태: 전원 리셋(POR) 후 첫 명령으로 A9HEX(START_CM)를 보내 커맨드 모드로 진입해야 합니다.
  • 체크섬 관리: 쓰기 작업 후 NVM 무결성을 보장하려면 90HEX(Calculate NVM Checksum) 명령을 사용해 체크섬을 계산하고 저장해야 합니다. 전원 켜짐 시 자동으로 체크섬이 확인됩니다.

2. NVM 전체 읽기 절차

  1. 커맨드 모드 진입:
    •    전원 리셋(POR) 후, I2C를 통해 A9HEX 명령을 전송하여 커맨드 모드로 진입합니다.
    •    I2C 프레임: [START] [Slave_Addr + W] [A9HEX] [STOP]
    •    응답: 상태 바이트(1바이트, 예: 00HEX는 정상).
  2. 각 주소 읽기:
    •    주소 00HEX부터 1CHEX까지 순차적으로 읽기 명령(00HEX ~ 1CHEX)을 전송합니다.
    •    각 명령에 대해:
      •    I2C 프레임: [START] [Slave_Addr + W] [Cmd_Code] [STOP]
      •    Cmd_Code00HEX(주소 00HEX 읽기)부터 1CHEX(주소 1CHEX 읽기)까지.
      •    응답: 상태 바이트(1바이트) + 16비트 데이터(2바이트, 빅 엔디안).
    •    예: 주소 00HEX(Cust_ID0) 읽기
      •    전송: [START] [48HEX + W] [00HEX] [STOP]
      •    응답: [START] [48HEX + R] [Status] [Data_MSB] [Data_LSB] [STOP]
    •    28개 주소에 대해 이 과정을 반복합니다.
  3. 데이터 저장:
    •    수신한 16비트 데이터(주소당 2바이트)를 호스트 시스템에 저장합니다.
    •    데이터는 빅 엔디안 형식이며, 24비트 계수(예: Offset_S, Gain_S 등)는 두 레지스터에 걸쳐 저장되므로(예: 03HEX0DHEX[15:8]), 이를 조합해야 합니다.
  4. 체크섬 확인:
    •    필요 시, 주소 1CHEX(CRC)를 읽어 저장된 체크섬을 확인합니다.
    •    읽은 데이터의 무결성을 확인하려면, 호스트에서 x16 + x15 + x2 + 1 다항식을 사용해 CRC를 계산하고 1CHEX의 값과 비교합니다.

3. NVM 전체 쓰기 절차

  1. 커맨드 모드 진입:
    •    A9HEX 명령을 전송하여 커맨드 모드로 진입합니다(위와 동일).
  2. 각 주소 쓰기:
    •    주소 00HEX부터 1CHEX까지 순차적으로 쓰기 명령(20HEX ~ 3CHEX)을 전송합니다.
    •    각 명령에 대해:
      •    I2C 프레임: [START] [Slave_Addr + W] [Cmd_Code] [Data_MSB] [Data_LSB] [STOP]
      •    Cmd_Code는 쓰기 대상 주소에 따라 계산: Cmd_Code = 20HEX + 주소.
      •    예: 주소 00HEX에 쓰기 → Cmd_Code = 20HEX.
      •    데이터는 16비트(2바이트, 빅 엔디안).
    •    예: 주소 00HEX(Cust_ID0)에 1234HEX 쓰기
      •    전송: [START] [48HEX + W] [20HEX] [12HEX] [34HEX] [STOP]
      •    응답: 상태 바이트(1바이트, 예: 00HEX는 정상).
    •    28개 주소에 대해 이 과정을 반복합니다.
  3. 체크섬 계산 및 저장:
    •    모든 쓰기 완료 후, 90HEX 명령을 전송하여 NVM 체크섬을 계산하고 주소 1CHEX에 저장합니다.
    •    I2C 프레임: [START] [48HEX + W] [90HEX] [STOP]
    •    응답: 상태 바이트(1바이트).
    •    이 단계는 NVM 무결성을 보장하며, 전원 켜짐 시 체크섬 확인에 사용됩니다.
  4. 검증:
    •    전체 읽기 절차를 수행하여 작성된 데이터를 확인합니다.
    •    필요 시, 소프트 리셋(FXHEX 뒤에 임의 데이터 바이트)을 보내 새 설정을 적용합니다.

4. NVM 특정 주소 읽기 절차

  1. 커맨드 모드 진입:
    •   A9HEX 명령을 전송하여 커맨드 모드로 진입합니다(필요 시).
  2. 특정 주소 읽기:
    •    읽고자 하는 주소에 해당하는 명령 코드를 전송합니다.
    •   Cmd_Code = 주소(예: 05HEX).
    •    I2C 프레임: [START] [Slave_Addr + W] [05HEX] [STOP]
    •    응답: [START] [48HEX + R] [Status] [Data_MSB] [Data_LSB] [STOP]
    •    예: 주소 05HEX(Tcg[15:0]) 읽기
      •    전송: [START] [48HEX + W] [05HEX] [STOP]
      •    응답: [START] [48HEX + R] [00HEX] [Data_MSB] [Data_LSB] [STOP]
  3. 데이터 처리:
    •    수신한 16비트 데이터를 저장합니다.
    •    24비트 계수의 경우, 관련 MSB 레지스터(예: Tcg의 경우 0EHEX[15:8])도 읽어 조합합니다.

5. NVM 특정 주소 쓰기 절차

  1. 커맨드 모드 진입:
    •    A9HEX 명령을 전송하여 커맨드 모드로 진입합니다(필요 시).
  2. 특정 주소 쓰기:
    •    쓰고자 하는 주소에 해당하는 명령 코드를 계산: Cmd_Code = 20HEX + 주소.
    •    예: 주소 05HEX에 쓰기 → Cmd_Code = 20HEX + 05HEX = 25HEX.
    •    I2C 프레임: [START] [Slave_Addr + W] [25HEX] [Data_MSB] [Data_LSB] [STOP]
    •    예: 주소 05HEX5678HEX 쓰기
      •    전송: [START] [48HEX + W] [25HEX] [56HEX] [78HEX] [STOP]
      •    응답: 상태 바이트(1바이트).
  3. 체크섬 업데이트:
    •    쓰기 완료 후, 90HEX 명령을 보내 체크섬을 갱신합니다.
    •    I2C 프레임: [START] [48HEX + W] [90HEX] [STOP]
  4. 검증:
    •    해당 주소를 읽어 작성된 데이터를 확인합니다.
    •    필요 시, 소프트 리셋(FXHEX + 임의 바이트)을 보내 설정을 적용합니다.

6. 주의사항

  • 상태 바이트 확인: 모든 I2C 응답의 첫 바이트는 상태 바이트로, 에러 여부를 나타냅니다(예: 00HEX는 정상, 01HEX는 메모리 에러).
  • NVM 쓰기 제한: NVM은 약 10,000회 쓰기 가능. 불필요한 쓰기를 최소화하세요.
  • 24비트 계수: Offset_S, Gain_S, Tcg 등 24비트 계수는 두 레지스터에 걸쳐 저장되므로, 읽기/쓰기 시 관련 레지스터(예: 03HEX0DHEX)를 모두 처리해야 합니다.
  • 타이밍: I2C 명령 간 최소 대기 시간(데이터시트의 타이밍 사양 참조)을 준수하세요.
  • PDM 모드: PDM 출력이 활성화된 경우(B4HEX로 비활성화 가능), 주기적 측정 모드에서 쓰기 명령이 제한될 수 있습니다.

7. 예제 I2C 프레임

주소 00HEX 읽기:

Write: [START] [48HEX + W] [00HEX] [STOP]
Read:  [START] [48HEX + R] [00HEX] [12HEX] [34HEX] [STOP]
결과: Cust_ID0 = 1234HEX
    

주소 05HEX5678HEX 쓰기:

Write: [START] [48HEX + W] [25HEX] [56HEX] [78HEX] [STOP]
Read (검증): [START] [48HEX + W] [05HEX] [STOP]
             [START] [48HEX + R] [00HEX] [56HEX] [78HEX] [STOP]
    

체크섬 계산:

Write: [START] [48HEX + W] [90HEX] [STOP]
    

원시 센서 측정 전 NVM 설정

ZSSC3230의 원시 센서 측정(A2HEX 또는 A3HEX 명령)은 SSC(센서 신호 컨디셔닝) 보정 없이 센서 데이터를 반환하며, 측정 설정은 NVM의 특정 레지스터에서 가져옵니다. A2HEX는 NVM의 Sensor_config 레지스터를 사용하고, A3HEX는 사용자가 제공한 설정(ssssHEX)을 사용합니다. 아래는 원시 센서 측정 전에 설정해야 할 NVM 레지스터와 절차입니다.

1. 원시 센서 측정 개요

  •    A2HEX: NVM의 Sensor_config 레지스터(주로 12HEX19HEX)에서 설정을 로드하여 오토-제로 센서 측정을 수행합니다.
  •    A3HEX: 사용자가 전송한 16비트 설정값(ssssHEX)을 사용하여 측정을 수행하며, 이 설정은 Sensor_config의 형식을 따릅니다.
  •    원시 센서 측정은 센서 커패시턴스(차동 또는 단일 끝)와 관련된 아날로그 프론트엔드(AFE) 설정에 의존합니다.

2. 설정해야 할 NVM 레지스터

원시 센서 측정에 영향을 미치는 주요 NVM 레지스터는 다음과 같습니다(데이터시트 표 16, 28~32페이지):

NVM 주소 비트 필드 이름 설명 권장 설정
12HEX 5:0 shift_cap 제로-시프트 커패시턴스(입력 오프셋 시프트): 0.0pF(00 0000) ~ 15.75pF(11 1111). 센서 범위에 맞게 설정. cap_range를 초과하지 않도록 주의. 예: 0.25pF(00 0001).
7:6 adc_bits ADC 해상도: 00(12비트), 01(14비트, 기본값), 10(16비트), 11(18비트). 원하는 해상도 설정. 예: 14비트(01).
8 noise_mode 노이즈 품질 vs. 전력: 0(저전류), 1(저노이즈). 저노이즈(1) 권장.
13:9 cap_range 최대 외부 신호 커패시턴스: 0.5pF(00000) ~ 16.0pF(11111). 센서 커패시턴스에 맞게 설정. 예: 2.0pF(00010).
14 sensor_leakage 센서 누설 전류 보상: 0(비활성화, 전체 다이내믹 레인지), 1(활성화, 0.5×Vref, 1비트 손실). 누설 전류가 문제라면 1, 그렇지 않으면 0.
19HEX 1:0 CC_pin_selection 측정 핀 선택: 00(입력 없음), 01(CC), 10(CC’), 11(CC와 CC’). 사용할 핀 설정. 예: CC(01).
2 Dither 디지털 디더링(EMI 성능): 0(비활성화), 1(활성화). EMI 우려 시 1, 그렇지 않으면 0.
3 En_sh2 접지 모드에서 감산 모드: 0(비활성화), 1(활성화). 단일 끝 모드에서 필요 시 1.
4 En_shlddrv C0 핀 액티브 쉴드 드라이브: 0(비활성화), 1(활성화). 쉴드 필요 시 1.
5 Dyn_imp 아날로그 프론트엔드 고전류 구동: 0(비활성화), 1(활성화, 작은 센서 범위). 작은 센서 범위 시 1.
6 Test_cap 내부 참조 커패시터(~2pF): 0(비활성화), 1(활성화). 테스트용으로 1, 실제 센서 사용 시 0.

3. 설정 절차

원시 센서 측정을 위해 NVM을 설정하는 절차는 다음과 같습니다:

  1. 센서 특성 확인:
    •    사용할 센서의 커패시턴스 범위(예: 0.5pF ~ 16pF)와 유형(차동/단일 끝)을 확인합니다.
    •    예: 차동 센서, 2pF 범위, CC 핀 사용.
  2. 커맨드 모드 진입:
    •    I2C를 통해 A9HEX 명령을 전송하여 커맨드 모드로 진입합니다.
    •    I2C 프레임: [START] [48HEX + W] [A9HEX] [STOP]
    •    응답: 상태 바이트(예: 00HEX).
  3. NVM 설정 쓰기:
    •    12HEX 설정:
      •    shift_cap: 센서 오프셋에 따라 설정(예: 0.25pF → 00 0001).
      •    adc_bits: 측정 해상도 선택(예: 14비트 → 01).
      •    noise_mode: 저노이즈(1) 권장.
      •    cap_range: 센서 커패시턴스에 맞게 설정(예: 2.0pF → 00010).
      •    sensor_leakage: 누설 전류 보상 필요 시 1.
      •    sensecap_type: 차동(0) 또는 단일 끝(1).
      •    예: 차동 센서, 2pF, 14비트, 저노이즈 → 12HEX = 0x4102 (sensecap_type=0, sensor_leakage=0, cap_range=00010, noise_mode=1, adc_bits=01, shift_cap=000010).
      •    I2C 프레임: [START] [48HEX + W] [32HEX] [41HEX] [02HEX] [STOP] (32HEX = 20HEX + 12HEX).
    •    19HEX 설정:
      •    CC_pin_selection: 사용할 핀 선택(예: CC → 01).
      •    Dither, En_sh2, En_shlddrv, Dyn_imp, Test_cap: 애플리케이션에 따라 설정.
      •    예: CC 핀, 디더링 비활성화, 나머지 비활성화 → 19HEX = 0x0001.
      •    I2C 프레임: [START] [48HEX + W] [39HEX] [00HEX] [01HEX] [STOP] (39HEX = 20HEX + 19HEX).
  4. 체크섬 계산:
    •    NVM 쓰기 후 90HEX 명령으로 체크섬을 계산하여 1CHEX에 저장.
    •    I2C 프레임: [START] [48HEX + W] [90HEX] [STOP]
    •    응답: 상태 바이트.
  5. 설정 검증:
    •    12HEX19HEX를 읽어 작성된 값을 확인.
    •    예: [START] [48HEX + W] [12HEX] [STOP], [START] [48HEX + R] [Status] [MSB] [LSB] [STOP].
  6. 원시 센서 측정 수행:
    •    A2HEX: NVM 설정 사용.
    •    I2C 프레임: [START] [48HEX + W] [A2HEX] [00HEX] [00HEX] [STOP]
    •    응답: 상태 바이트 + 24비트 원시 데이터.
    •    A3HEX: 사용자 설정(예: 12HEX19HEX의 비트를 조합한 값) 사용.
    •    예: 12HEX=0x4102, 19HEX=0x0001ssssHEX=0x4102 (상위 바이트는 12HEX, 하위 바이트는 19HEX의 하위 8비트).
    •    I2C 프레임: [START] [48HEX + W] [A3HEX] [41HEX] [02HEX] [STOP].

4. STM32L432KC 예제 코드

아래는 STM32L432KC에서 원시 센서 측정 전 NVM 설정을 수행하는 예제 코드입니다(STMCube HAL 사용, 차동 센서, 2pF, 14비트, CC 핀, 저노이즈 설정).

/* STM32L432KC에서 ZSSC3230 원시 센서 측정 전 NVM 설정
 * - STM32Cube HAL 라이브러리 사용
 * - ZSSC3230 I2C 주소: 0x48 (7비트)
 * - 설정: 차동 센서, 2pF, 14비트, CC 핀, 저노이즈
 */

#include "stm32l4xx_hal.h"
#include <stdio.h>

extern I2C_HandleTypeDef hi2c1;
#define ZSSC3230_I2C_ADDR    (0x48 << 1)
#define DEFAULT_TIMEOUT_MS   100

/* 상태 바이트 확인 */
HAL_StatusTypeDef check_status_byte(uint8_t status) {
    if (status == 0x00) return HAL_OK;
    printf("Error: Status byte 0x%02X\n", status);
    return HAL_ERROR;
}

/* 커맨드 모드 진입 (A9HEX) */
HAL_StatusTypeDef zssc3230_start_command_mode(uint32_t timeout_ms) {
    uint8_t cmd = 0xA9;
    HAL_StatusTypeDef ret = HAL_I2C_Master_Transmit(&hi2c1, ZSSC3230_I2C_ADDR, &cmd, 1, timeout_ms);
    if (ret != HAL_OK) {
        printf("Failed to enter command mode: HAL error %d\n", ret);
        return ret;
    }
    uint8_t status;
    ret = HAL_I2C_Master_Receive(&hi2c1, ZSSC3230_I2C_ADDR, &status, 1, timeout_ms);
    return (ret == HAL_OK) ? check_status_byte(status) : ret;
}

/* NVM 쓰기 */
HAL_StatusTypeDef zssc3230_nvm_write(uint8_t addr, uint16_t data, uint32_t timeout_ms) {
    uint8_t tx_buffer[3] = {0x20 + addr, (data >> 8) & 0xFF, data & 0xFF};
    HAL_StatusTypeDef ret = HAL_I2C_Master_Transmit(&hi2c1, ZSSC3230_I2C_ADDR, tx_buffer, 3, timeout_ms);
    if (ret != HAL_OK) {
        printf("Failed to write NVM 0x%02X: HAL error %d\n", addr, ret);
        return ret;
    }
    uint8_t status;
    ret = HAL_I2C_Master_Receive(&hi2c1, ZSSC3230_I2C_ADDR, &status, 1, timeout_ms);
    return (ret == HAL_OK) ? check_status_byte(status) : ret;
}

/* NVM 체크섬 계산 (90HEX) */
HAL_StatusTypeDef zssc3230_calculate_nvm_checksum(uint32_t timeout_ms) {
    uint8_t cmd = 0x90;
    HAL_StatusTypeDef ret = HAL_I2C_Master_Transmit(&hi2c1, ZSSC3230_I2C_ADDR, &cmd, 1, timeout_ms);
    if (ret != HAL_OK) {
        printf("Failed to calculate checksum: HAL error %d\n", ret);
        return ret;
    }
    uint8_t status;
    ret = HAL_I2C_Master_Receive(&hi2c1, ZSSC3230_I2C_ADDR, &status, 1, timeout_ms);
    return (ret == HAL_OK) ? check_status_byte(status) : ret;
}

/* 원시 센서 측정 (A2HEX) */
HAL_StatusTypeDef zssc3230_raw_sensor_measure(uint32_t *data, uint32_t timeout_ms) {
    uint8_t tx_buffer[3] = {0xA2, 0x00, 0x00};
    uint8_t rx_buffer[4];
    HAL_StatusTypeDef ret = HAL_I2C_Master_Transmit(&hi2c1, ZSSC3230_I2C_ADDR, tx_buffer, 3, timeout_ms);
    if (ret != HAL_OK) {
        printf("Failed to send A2HEX: HAL error %d\n", ret);
        return ret;
    }
    ret = HAL_I2C_Master_Receive(&hi2c1, ZSSC3230_I2C_ADDR, rx_buffer, 4, timeout_ms);
    if (ret != HAL_OK) {
        printf("Failed to receive A2HEX data: HAL error %d\n", ret);
        return ret;
    }
    ret = check_status_byte(rx_buffer[0]);
    if (ret != HAL_OK) return ret;
    *data = (rx_buffer[1] << 16) | (rx_buffer[2] << 8) | rx_buffer[3];
    return HAL_OK;
}

/* 원시 센서 측정 전 NVM 설정 */
HAL_StatusTypeDef zssc3230_setup_raw_sensor(void) {
    HAL_StatusTypeDef ret;
    uint32_t timeout_ms = DEFAULT_TIMEOUT_MS;

    // 1. 커맨드 모드 진입
    ret = zssc3230_start_command_mode(timeout_ms);
    if (ret != HAL_OK) return ret;
    printf("Command mode entered\n");

    // 2. 12HEX 설정 (차동, 2pF, 14비트, 저노이즈, shift_cap=0.25pF)
    uint16_t reg_12 = (0 << 15) | // sensecap_type: 차동
                      (0 << 14) | // sensor_leakage: 비활성화
                      (2 << 9)  | // cap_range: 2.0pF (00010)
                      (1 << 8)  | // noise_mode: 저노이즈
                      (1 << 6)  | // adc_bits: 14비트 (01)
                      (1);        // shift_cap: 0.25pF (000001)
    ret = zssc3230_nvm_write(0x12, reg_12, timeout_ms);
    if (ret != HAL_OK) return ret;
    printf("NVM[0x12] set to 0x%04X\n", reg_12);

    // 3. 19HEX 설정 (CC 핀, 나머지 비활성화)
    uint16_t reg_19 = (1 << 0); // CC_pin_selection: CC (01)
    ret = zssc3230_nvm_write(0x19, reg_19, timeout_ms);
    if (ret != HAL_OK) return ret;
    printf("NVM[0x19] set to 0x%04X\n", reg_19);

    // 4. 체크섬 계산
    ret = zssc3230_calculate_nvm_checksum(timeout_ms);
    if (ret != HAL_OK) return ret;
    printf("Checksum calculated\n");

    return HAL_OK;
}

/* 메인 함수 예제 */
void zssc3230_raw_sensor_example(void) {
    HAL_StatusTypeDef ret;
    uint32_t sensor_data;

    // 1. NVM 설정
    ret = zssc3230_setup_raw_sensor();
    if (ret != HAL_OK) {
        printf("NVM setup failed\n");
        return;
    }

    // 2. 원시 센서 측정 (A2HEX)
    ret = zssc3230_raw_sensor_measure(&sensor_data, DEFAULT_TIMEOUT_MS);
    if (ret == HAL_OK) {
        printf("Raw sensor data: 0x%06X\n", sensor_data);
    } else {
        printf("Raw sensor measurement failed\n");
    }
}
    
반응형