이 글은 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 주소02HEX
의Slave_Addr
필드에서 설정, 기본값:000 0000BIN
). 사용하는 주소가 다를 경우, NVM 설정을 확인하세요. I2C 통신은 표준 모드(최대 400kHz) 또는 고속 모드(최대 3.4MHz)를 지원합니다. - 전원 상태: 전원 리셋(POR) 후 첫 명령으로
A9HEX
(START_CM)를 보내 커맨드 모드로 진입해야 합니다. - 체크섬 관리: 쓰기 작업 후 NVM 무결성을 보장하려면
90HEX
(Calculate NVM Checksum) 명령을 사용해 체크섬을 계산하고 저장해야 합니다. 전원 켜짐 시 자동으로 체크섬이 확인됩니다.
2. NVM 전체 읽기 절차
- 커맨드 모드 진입:
- 전원 리셋(POR) 후, I2C를 통해
A9HEX
명령을 전송하여 커맨드 모드로 진입합니다. - I2C 프레임:
[START] [Slave_Addr + W] [A9HEX] [STOP]
- 응답: 상태 바이트(1바이트, 예:
00HEX
는 정상).
- 전원 리셋(POR) 후, I2C를 통해
- 각 주소 읽기:
- 주소
00HEX
부터1CHEX
까지 순차적으로 읽기 명령(00HEX
~1CHEX
)을 전송합니다. - 각 명령에 대해:
- I2C 프레임:
[START] [Slave_Addr + W] [Cmd_Code] [STOP]
Cmd_Code
는00HEX
(주소00HEX
읽기)부터1CHEX
(주소1CHEX
읽기)까지.- 응답: 상태 바이트(1바이트) + 16비트 데이터(2바이트, 빅 엔디안).
- I2C 프레임:
- 예: 주소
00HEX
(Cust_ID0
) 읽기- 전송:
[START] [48HEX + W] [00HEX] [STOP]
- 응답:
[START] [48HEX + R] [Status] [Data_MSB] [Data_LSB] [STOP]
- 전송:
- 28개 주소에 대해 이 과정을 반복합니다.
- 주소
- 데이터 저장:
- 수신한 16비트 데이터(주소당 2바이트)를 호스트 시스템에 저장합니다.
- 데이터는 빅 엔디안 형식이며, 24비트 계수(예:
Offset_S
,Gain_S
등)는 두 레지스터에 걸쳐 저장되므로(예:03HEX
와0DHEX[15:8]
), 이를 조합해야 합니다.
- 체크섬 확인:
- 필요 시, 주소
1CHEX
(CRC
)를 읽어 저장된 체크섬을 확인합니다. - 읽은 데이터의 무결성을 확인하려면, 호스트에서
x16 + x15 + x2 + 1
다항식을 사용해 CRC를 계산하고1CHEX
의 값과 비교합니다.
- 필요 시, 주소
3. NVM 전체 쓰기 절차
- 커맨드 모드 진입:
A9HEX
명령을 전송하여 커맨드 모드로 진입합니다(위와 동일).
- 각 주소 쓰기:
- 주소
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바이트, 빅 엔디안).
- I2C 프레임:
- 예: 주소
00HEX
(Cust_ID0
)에1234HEX
쓰기- 전송:
[START] [48HEX + W] [20HEX] [12HEX] [34HEX] [STOP]
- 응답: 상태 바이트(1바이트, 예:
00HEX
는 정상).
- 전송:
- 28개 주소에 대해 이 과정을 반복합니다.
- 주소
- 체크섬 계산 및 저장:
- 모든 쓰기 완료 후,
90HEX
명령을 전송하여 NVM 체크섬을 계산하고 주소1CHEX
에 저장합니다. - I2C 프레임:
[START] [48HEX + W] [90HEX] [STOP]
- 응답: 상태 바이트(1바이트).
- 이 단계는 NVM 무결성을 보장하며, 전원 켜짐 시 체크섬 확인에 사용됩니다.
- 모든 쓰기 완료 후,
- 검증:
- 전체 읽기 절차를 수행하여 작성된 데이터를 확인합니다.
- 필요 시, 소프트 리셋(
FXHEX
뒤에 임의 데이터 바이트)을 보내 새 설정을 적용합니다.
4. NVM 특정 주소 읽기 절차
- 커맨드 모드 진입:
A9HEX
명령을 전송하여 커맨드 모드로 진입합니다(필요 시).
- 특정 주소 읽기:
- 읽고자 하는 주소에 해당하는 명령 코드를 전송합니다.
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]
- 전송:
- 데이터 처리:
- 수신한 16비트 데이터를 저장합니다.
- 24비트 계수의 경우, 관련 MSB 레지스터(예:
Tcg
의 경우0EHEX[15:8]
)도 읽어 조합합니다.
5. NVM 특정 주소 쓰기 절차
- 커맨드 모드 진입:
A9HEX
명령을 전송하여 커맨드 모드로 진입합니다(필요 시).
- 특정 주소 쓰기:
- 쓰고자 하는 주소에 해당하는 명령 코드를 계산:
Cmd_Code = 20HEX + 주소
. - 예: 주소
05HEX
에 쓰기 →Cmd_Code = 20HEX + 05HEX = 25HEX
. - I2C 프레임:
[START] [Slave_Addr + W] [25HEX] [Data_MSB] [Data_LSB] [STOP]
- 예: 주소
05HEX
에5678HEX
쓰기- 전송:
[START] [48HEX + W] [25HEX] [56HEX] [78HEX] [STOP]
- 응답: 상태 바이트(1바이트).
- 전송:
- 쓰고자 하는 주소에 해당하는 명령 코드를 계산:
- 체크섬 업데이트:
- 쓰기 완료 후,
90HEX
명령을 보내 체크섬을 갱신합니다. - I2C 프레임:
[START] [48HEX + W] [90HEX] [STOP]
- 쓰기 완료 후,
- 검증:
- 해당 주소를 읽어 작성된 데이터를 확인합니다.
- 필요 시, 소프트 리셋(
FXHEX
+ 임의 바이트)을 보내 설정을 적용합니다.
6. 주의사항
- 상태 바이트 확인: 모든 I2C 응답의 첫 바이트는 상태 바이트로, 에러 여부를 나타냅니다(예:
00HEX
는 정상,01HEX
는 메모리 에러). - NVM 쓰기 제한: NVM은 약 10,000회 쓰기 가능. 불필요한 쓰기를 최소화하세요.
- 24비트 계수:
Offset_S
,Gain_S
,Tcg
등 24비트 계수는 두 레지스터에 걸쳐 저장되므로, 읽기/쓰기 시 관련 레지스터(예:03HEX
와0DHEX
)를 모두 처리해야 합니다. - 타이밍: I2C 명령 간 최소 대기 시간(데이터시트의 타이밍 사양 참조)을 준수하세요.
- PDM 모드: PDM 출력이 활성화된 경우(
B4HEX
로 비활성화 가능), 주기적 측정 모드에서 쓰기 명령이 제한될 수 있습니다.
7. 예제 I2C 프레임
주소 00HEX
읽기:
Write: [START] [48HEX + W] [00HEX] [STOP]
Read: [START] [48HEX + R] [00HEX] [12HEX] [34HEX] [STOP]
결과: Cust_ID0 = 1234HEX
주소 05HEX
에 5678HEX
쓰기:
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
레지스터(주로12HEX
와19HEX
)에서 설정을 로드하여 오토-제로 센서 측정을 수행합니다.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을 설정하는 절차는 다음과 같습니다:
- 센서 특성 확인:
- 사용할 센서의 커패시턴스 범위(예: 0.5pF ~ 16pF)와 유형(차동/단일 끝)을 확인합니다.
- 예: 차동 센서, 2pF 범위, CC 핀 사용.
- 커맨드 모드 진입:
- I2C를 통해
A9HEX
명령을 전송하여 커맨드 모드로 진입합니다. - I2C 프레임:
[START] [48HEX + W] [A9HEX] [STOP]
- 응답: 상태 바이트(예:
00HEX
).
- I2C를 통해
- 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
).
- 12HEX 설정:
- 체크섬 계산:
- NVM 쓰기 후
90HEX
명령으로 체크섬을 계산하여1CHEX
에 저장. - I2C 프레임:
[START] [48HEX + W] [90HEX] [STOP]
- 응답: 상태 바이트.
- NVM 쓰기 후
- 설정 검증:
12HEX
와19HEX
를 읽어 작성된 값을 확인.- 예:
[START] [48HEX + W] [12HEX] [STOP]
,[START] [48HEX + R] [Status] [MSB] [LSB] [STOP]
.
- 원시 센서 측정 수행:
A2HEX
: NVM 설정 사용.- I2C 프레임:
[START] [48HEX + W] [A2HEX] [00HEX] [00HEX] [STOP]
- 응답: 상태 바이트 + 24비트 원시 데이터.
A3HEX
: 사용자 설정(예:12HEX
와19HEX
의 비트를 조합한 값) 사용.- 예:
12HEX=0x4102
,19HEX=0x0001
→ssssHEX=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");
}
}
'아날로그회로(Analog Circuit) > ADC관련' 카테고리의 다른 글
[ZSC31050] I²C 인터페이스 설정 및 데이터 처리 코드 구현 (0) | 2025.08.16 |
---|---|
[ZSSC3230] 보정 절차 및 Calibration Math 분석 (1) | 2025.08.15 |
[ZSSC3230] 센서 신호 컨디셔너(SSC) STM32을 사용한 I2C 코드 구현 (0) | 2025.08.15 |
[ZSSC3230] 전체 측정 전 NVM 설정 절차 (0) | 2025.08.15 |
[ZSSC3230]정전용량 센서 신호 컨디셔너 요약 (1) | 2025.08.14 |
[AD2S1210] Resolver-to-Digital Converter with STM32G474 SPI Driver (0) | 2025.08.14 |
[AD7747]정전용량-디지털 변환기 디바이스 드라이버 코드를 STM32용으로 구현 (Guide to implementing AD7747 Capacitance-to-Digital Converter driver for STM32 microcontroller) (0) | 2025.08.14 |
[ZSSC3123]Command List and Encodings 상세 분석 (0) | 2025.08.13 |