Circuit review & bench-test guide
AXS-035 — MAX31855K thermocouple front end PMOD module
Document purpose#
This document explains the axs-035-max31855 prototype at component level and turns the design evidence into a practical manual-review and bench-test plan. It is based on the generated schematic (generate_design.py, rev 0.1-schematic), the project README, and the MAX31855 datasheet.
The board is a design-stage prototype: the schematic is generated and ERC is clean (0/0), but no PCB layout exists and no first article has been fabricated or assembled. Every value below is a design target to verify on real hardware, not proof that an assembled board works or meets the datasheet accuracy numbers.
1. What the board does#
A 12-pin PMOD module that reads a type-K thermocouple through the Analog Devices (Maxim) MAX31855KASA+ cold-junction-compensated thermocouple-to-digital converter. The host sees the simplest possible SPI device: read-only, no MOSI. Dropping ~CS and clocking 32 bits returns a fixed frame containing the 14-bit compensated thermocouple temperature, a 12-bit cold-junction (die) temperature, and three fault bits (short-to-VCC, short-to-GND, open circuit).
It does not provide isolation, input over-voltage protection beyond the IC's own ratings, or any linearization beyond the MAX31855's straight-line approximation of the K-type curve.
Functional block diagram#
Type-K thermocouple ──> J2 screw terminal
│ TC_P / TC_M
├── C2 10 nF differential filter
v
U1 MAX31855KASA+ C1 100 nF on 3V3
cold-junction comp,
14-bit ADC, faults
│ SO ── R1 100 Ω ──> PMOD 3 (MISO)
│ SCK <───────────── PMOD 4
│ ~CS <── R2 10 kΩ pull-up ── PMOD 1
v
J1 PMOD plug (3V3 / GND from host)
2. Safety and scope boundaries#
- The board is not isolated. The thermocouple tip is conductively connected to the measurement circuit; never attach the thermocouple to anything electrically live (mains heaters, powered busbars). Use an ungrounded (insulated-junction) probe when measuring metal that could carry potential.
- Heat sources used in testing (soldering iron, heat gun, boiling water) are burn hazards; the thermocouple wire itself conducts heat back to the terminal. Let probes cool before handling.
- MAX31855 absolute maximum on all pins is -0.3 V to VCC + 0.3 V and VCC absolute maximum is 4.0 V. Drive the module only from a 3.3 V rail (recommended range 3.0-3.6 V). It is not 5 V tolerant.
- ESD rating is +/-2 kV HBM only. Handle with normal ESD precautions; the T+/T- terminal is a user-facing input with no additional clamping on this board.
- A working bench reading is not a calibration. Nothing in this plan substitutes for a traceable temperature calibration if the module is used for anything beyond learning.
3. Power and signal sequence#
- The host PMOD connector supplies 3V3 and GND (pins 6/12 and 5/11). C1 provides local decoupling at U1 VCC.
- At power-on, U1's internal power-on reset runs (V_POR 2.0 V typ, 2.5 V max). Conversions begin automatically; no configuration exists or is needed. The datasheet requires waiting t_CONV_PU >= 200 ms after VCC is valid before trusting the first conversion.
- Conversions run continuously in the background every t_CONV (70 ms typ, 100 ms max), converting the cold junction, the thermocouple, and running fault detection.
- R2 pulls ~CS to 3V3 so SO stays released (high impedance) until the host drives ~CS low. While ~CS is low the output data is frozen; results update only while ~CS is high.
- The host drops ~CS and issues 32 SCK cycles; U1 shifts the frame out on SO through R1 into PMOD pin 3 (MISO). D31 appears within t_DV (100 ns max) of the ~CS falling edge; each later bit is valid within t_DO (40 ns max) of the SCK falling edge, so the host samples on the SCK rising edge (SPI mode 0, CPOL=0/CPHA=0-compatible).
4. Interfaces and pin maps#
J1 PMOD plug (Type 2 SPI footprint, MOSI unused)#
| PMOD pin | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Net | CS_N | NC (no MOSI) | MISO | SCK | GND | 3V3 | NC | NC | NC | NC | GND | 3V3 |
J2 thermocouple terminal (Phoenix MKDS 1,5/2-5,08 footprint)#
| J2 pin | Net | Thermocouple wire (type K) |
|---|---|---|
| 1 | TC_P | T+ = Chromel; yellow in the US ANSI color code |
| 2 | TC_M | T- = Alumel; red in the US ANSI color code |
Caution: ANSI type-K color coding uses red for the negative lead, which is the opposite of most electrical intuition, and IEC-color thermocouples use green/white instead. Do not trust color alone; the polarity test in section 9.C is the authoritative check.
Usage contexts covered by this plan#
| Context | Power | SPI master |
|---|---|---|
| (a) PMOD host | ULX3S-class ECP5 FPGA board, 3.3 V PMOD | FPGA SPI/bit-bang HDL |
| (b) Standalone | Bench supply set to 3.30 V, current limit 20 mA | Lab MCU (e.g. RP2040/STM32 at 3.3 V) or USB SPI adapter |
Both contexts are electrically identical to the module; the difference is who provides 3V3 and who drives SCK/~CS. In context (b), common the bench supply GND with the MCU/adapter GND at the module.
5. Component-by-component review#
This is the complete reference-designator list from generate_design.py: U1, J1, J2, C1, C2, R1, R2 (plus ERC-only power flags #FLG01/#FLG02, which are schematic artifacts, not physical parts).
| Ref. | Part / value | What it is and its role | Why it is needed | If absent, open, or wrong |
|---|---|---|---|---|
| U1 | MAX31855KASA+, SOIC-8 | Cold-junction-compensated K-type thermocouple-to-digital converter; 14-bit, 0.25 C/LSB, read-only SPI | The entire measurement function: amplification of the ~41 uV/C signal, cold-junction correction, ADC, fault detection | No function. A J/N/T/S/R/E-suffix variant would apply the wrong sensitivity (e.g. J = 57.953 uV/C vs K = 41.276 uV/C) and read plausibly but wrongly; reversed placement destroys the part |
| J1 | 12-pin PMOD plug | Host interface: power, GND, ~CS, SCK, MISO | Mechanical/electrical standard connection to the FPGA host | No power/communication; a rotated or offset plug can put 3V3 on signal pins |
| J2 | Phoenix MKDS 1,5/2 screw terminal, 5.08 mm | Field connection for the thermocouple pair | Screw clamping accepts bare thermocouple wire without soldering (solder would add junctions and flux) | No sensor input; loose clamping gives intermittent open faults; swapped wires give inverted readings (section 9.C) |
| C1 | 100 nF 16 V X7R (Murata GRM188R71C104KA01D) | U1 supply decoupling on 3V3 | Datasheet noise guidance: 0.1 uF ceramic close to VCC and GND to suppress power-supply-coupled noise on a uV-level measurement | Noisier readings, susceptibility to host supply hash; the part still functions, which makes the omission easy to miss |
| C2 | 10 nF 50 V C0G (Murata GRM1885C1H103JA01D) | Differential filter directly across TC_P/TC_M | Datasheet rev 2 explicitly added this recommendation: a 10 nF SMT ceramic across T+/T- to filter noise picked up by the thermocouple leads | Readings become sensitive to EMI on the (antenna-like) thermocouple wires; jumpy LSBs. A leaky/wrong dielectric could add bias-current error paths |
| R1 | 100 R 0603 (Yageo RC0603FR-07100RL) | Series resistor between U1 SO and PMOD MISO | Protects the sensor-driven line: limits current on host/module contention or hot-plug, damps reflections | Direct pin-to-pin contention current if host misconfigures MISO as output; a grossly larger value plus bus capacitance would slow edges at high SCK |
| R2 | 10 k 0603 (Yageo RC0603FR-0710KL) | Pull-up from CS_N to 3V3 | Keeps ~CS deasserted (SO released, conversions updating) while the host is unconfigured, in reset, or absent | ~CS can float: SO may drive the bus unexpectedly, conversion results freeze (they only update while ~CS is high), and shared-bus setups break |
| #FLG01, #FLG02 | Power flags (3V3, GND) | ERC bookkeeping symbols only | Satisfy KiCad ERC power-driven checks | Not physical; must never appear in a BOM or placement file |
Cold-junction placement and thermal gradient review (layout-stage, open)#
The MAX31855 measures its own die temperature as the cold junction, so the accuracy budget assumes J2's screw contacts and U1's die are at the same temperature. The schematic already carries the layout note; since layout has not started, these are open review items:
- Keep J2 within a few mm of U1 with a continuous copper pour under both (datasheet: large ground plane improves accuracy; thermal island suggested in the README).
- No heat-generating parts near U1 (nothing on this board dissipates meaningfully — U1 itself is <= 1.5 mA x 3.6 V — but the host board and hot thermocouple wire conducting heat into J2 are real gradient sources).
- SOIC-8 theta_JA is 170 C/W on a JESD51-7 board; self-heating is ~0.5 mC at 3 mW and is negligible, so gradients, not self-heating, dominate the error.
- Route TC_P/TC_M as a short differential pair away from SCK.
6. Datasheet summary and design interpretation#
Source consulted: MAX31855 datasheet, Maxim Integrated document 19-5793 Rev 2, 2/12 — canonical copy at analog.com (product page: MAX31855 | Analog Devices); the identical Rev 2 PDF actually fetched and read for this review is the Adafruit-hosted mirror. Check for a newer revision before release.
| Datasheet fact (Rev 2) | Value | Board interpretation |
|---|---|---|
| Supply, recommended / abs max | 3.0-3.6 V / 4.0 V | 3.3 V PMOD rail fits; not 5 V tolerant |
| Supply current I_CC | 900 uA typ, 1500 uA max | Negligible PMOD load; bench current sanity check value |
| K-type accuracy (TC -200..+700 C, T_A -20..+85 C) | +/-2 C | Governs the ice/boiling checks in section 9.D |
| K-type accuracy (TC +700..+1350 C) | +/-4 C | For flame/oven experiments |
| Thermocouple resolution | 14-bit, 0.25 C/LSB, sign + 13 bits | Bits D[31:18] |
| Internal (cold-junction) sensor | 12-bit, 0.0625 C/LSB; +/-2 C error (T_A -20..+85 C) | Bits D[15:4]; sanity reference at room temperature |
| Conversion time t_CONV | 70 ms typ, 100 ms max | Poll no faster than ~10 Hz for fresh data |
| Power-up first-valid t_CONV_PU | >= 200 ms | Firmware must wait after power-on |
| Max SCK frequency f_SCL | 5 MHz | Hard host-side clock limit; verified against Rev 2 timing table |
| SCK high/low width | >= 100 ns each | Consistent with 5 MHz at 50% duty |
| ~CS fall to SO enable t_DV | <= 100 ns | First bit D31 valid shortly after ~CS drops |
| SCK fall to data valid t_DO | <= 40 ns | Data changes on SCK falling edge; sample on rising = mode 0 |
| ~CS inactive time | >= 200 ns | Minimum gap between reads |
| Fault bits | D16 summary; D2 SCV, D1 SCG, D0 OC | Section 9.E open-circuit test |
| Thermocouple input bias | +/-100 nA | Why a low-leakage C0G filter cap (C2) is appropriate |
| Noise guidance | 0.1 uF at VCC; 10 nF differential across T+/T- | Matches C1 and C2 exactly |
| K sensitivity | 41.276 uV/C (0-1000 C); linear model only | Expect residual K-curve nonlinearity error; MAX31855 does not linearize |
| ESD | +/-2 kV HBM, all pins | Handling and field-wiring caution |
7. SPI details and first-transaction bring-up#
Configuration: read-only, SPI mode 0 compatible (CPOL=0, CPHA=0), MSB first, SCK <= 5 MHz. Start bring-up at 500 kHz-1 MHz. There is no MOSI and no command byte; the transaction is:
- ~CS high, SCK idle low, wait >= 200 ms after power-on.
- Drive ~CS low. D31 appears on SO within 100 ns.
- Issue exactly 32 SCK cycles, sampling SO on each rising edge (a 14-cycle read returns only the thermocouple field; do 32 to get faults + cold junction).
- Raise ~CS. Keep it high >= 200 ns (in practice, milliseconds, so the next conversion can update the register).
32-bit frame layout (datasheet Tables 2/3)#
| Bits | Field | Coding |
|---|---|---|
| D[31:18] | 14-bit thermocouple temperature | Two's complement, 0.25 C/LSB (D31 sign, MSB weight 1024 C) |
| D17 | Reserved | Always 0 |
| D16 | Fault summary | 1 if any of SCV/SCG/OC active |
| D[15:4] | 12-bit internal (cold-junction) temperature | Two's complement, 0.0625 C/LSB (D15 sign, MSB weight 64 C) |
| D3 | Reserved | Always 0 |
| D2 | SCV fault | 1 = thermocouple shorted to VCC |
| D1 | SCG fault | 1 = thermocouple shorted to GND |
| D0 | OC fault | 1 = thermocouple open (no connection) |
Expected first response at room temperature#
With the thermocouple tip and the board both at ~25.0 C: thermocouple field = 25.00/0.25 = 100 = 0b00000001100100; internal field = 25.0000/0.0625 = 400 = 0x190. Ideal frame: 0x01901900 (fault bits all 0). Realistically both fields read "roughly room temperature, within a couple of C, all fault bits 0, D17 = D3 = 0" — e.g. anything decoding to 20-28 C on both fields on a normal bench. Immediate red flags: 0xFFFFFFFF or 0x00000000 (wiring/MISO problem, not a plausible reading), D17/D3 set (bit-alignment error in the host), or the two temperature fields wildly disagreeing at ambient.
8. Manual schematic and assembly review checklist#
- Confirm U1 is exactly MAX31855KASA+ (K suffix): another letter is a different thermocouple type with different gain.
- Confirm U1 pin-1 orientation; verify pin 8 (DNC) is left unconnected.
- Verify J2 pin 1 = TC_P = T+ and the silkscreen marks polarity.
- Verify C2 sits directly across TC_P/TC_M near U1 pins 2/3, and is C0G.
- Verify C1 lands close to U1 pin 4 (VCC) with a short GND return.
- Verify R1 is in series between U1 SO (pin 7) and PMOD pin 3, and R2 pulls CS_N to 3V3 (not GND).
- Check PMOD pin 1 = ~CS, 3 = MISO, 4 = SCK against the host's PMOD pinout (Type 2 SPI); pin 2 must be unconnected on the module.
- Layout stage: J2/U1 isothermal placement, ground pour, differential TC routing, SCK kept away from TC inputs (section 5 notes).
- Confirm #FLG01/#FLG02 are excluded from BOM and placement outputs.
9. Ordered bench-test procedure#
Stop at the first abnormal result. Record board serial, host/adapter identity, ambient temperature, and raw 32-bit frames (hex) for every step.
A. Unpowered inspection and resistance tests#
- Visual inspection under magnification: U1 orientation, solder bridges on the SOIC-8, C2 across the TC nets.
- Measure 3V3-to-GND resistance (expect high, no hard short in either meter polarity).
- With no thermocouple fitted, J2-1 to J2-2 should read as C2 charging (high/open at DC). J2-1 or J2-2 to GND must not be a short.
- Verify ~10 kΩ from CS_N (PMOD pin 1) to 3V3 and ~100 Ω from U1 pin 7 pad to PMOD pin 3.
B. First power and first transaction#
Context (b) standalone first: bench supply 3.30 V, current limit 20 mA, into PMOD 3V3/GND; lab MCU or SPI adapter on ~CS/SCK/MISO, common ground.
- Power on with no thermocouple fitted. Supply current should be roughly 0.9-1.5 mA (I_CC) — tens of mA indicates a fault; stop.
- Wait >= 200 ms. Run the section 7 transaction at <= 1 MHz.
- Expect D16 = 1 and D0 (OC) = 1 because no thermocouple is fitted, with a sane internal temperature in D[15:4]. Datasheet: with T+/T- unconnected the thermocouple sign bit D31 reads 0 and D[30:18] read all 1s.
- Fit the thermocouple in J2 (T+ to pin 1). Re-read: fault bits clear, both temperature fields near ambient (section 7 expected response).
- Scope check: confirm SO transitions follow SCK falling edges and the sampled mode is 0; try 5 MHz only after 1 MHz is solid.
Context (a) PMOD host: repeat steps 2-4 with the module plugged into the ECP5 host PMOD (3.3 V bank), using the HDL SPI master. Verify the host PMOD really supplies 3.3 V before insertion.
C. Thermocouple polarity test#
- With the reading stable at ambient, pinch the thermocouple tip between two fingers (or briefly bring a heat gun near it). The reading must move up by several degrees within a couple of conversions.
- If the reading moves down when the junction warms, the leads are swapped at J2: the thermoelectric voltage is inverted. Swap them and repeat. Do not rely on wire colors (ANSI type K: red is negative).
- Let the tip cool; the reading must return to ambient.
D. Ice-point and boiling-point sanity checks#
- 0 C: stirred ice-water slush (crushed ice, just enough water), tip in the slush not touching the container. Expect 0.0 C +/- 2 C per the datasheet K-type accuracy, plus the probe's own tolerance (a class 2 K probe adds up to +/-2.5 C — record the probe class).
- ~100 C: freshly boiling water, tip submerged, not touching the pot. Expect ~100 C +/- 2 C at sea level; the boiling point drops roughly 1 C per 285 m of altitude (e.g. ~96.7 C at 1000 m), so correct for local altitude/pressure before judging.
- Record the internal (cold-junction) field during both tests; it should stay near room temperature. If it tracks the bath, heat is conducting up the wires into J2/U1 — a cold-junction gradient problem.
E. Open-circuit and fault-bit tests#
- While polling, unscrew one thermocouple lead from J2. Within one or two conversions (t_CONV <= 100 ms each) D0 (OC) must go to 1 and D16 (fault) must go to 1. Reconnect; both must clear.
- Optional, current-limited and deliberate: short T+ to GND at J2 (expect D1 SCG + D16), then T+ to 3V3 through the probe (expect D2 SCV + D16). Restore wiring and confirm all faults clear and readings return.
- Confirm the host software surfaces D16 and refuses to report the temperature fields as valid while any fault bit is set.
F. Noise, gradient, and rate characterization (pre-release)#
- Log 10 minutes of readings at ambient; expect the thermocouple field to sit within 1-2 LSB (0.25-0.5 C) peak-to-peak on a quiet bench.
- Repeat with the host FPGA busy (context (a)) to check SCK/host-noise coupling; a visible worsening points at layout/filtering, C1/C2.
- Blow warm air across the board (not the tip) and watch for reading shifts with a constant-temperature tip: quantifies the cold-junction gradient error for the eventual layout.
10. Troubleshooting map#
| Symptom | First measurements | Likely areas |
|---|---|---|
| Frame reads all 1s | MISO idle level, ~CS actually reaching U1 | MISO open/R1, ~CS stuck high, no power at U1 |
| Frame reads all 0s | SO activity on scope during read | SO short to GND, SCK not reaching U1, U1 dead/reversed |
| D17 or D3 nonzero | Bit alignment vs SCK count on scope | Host shifting by one bit, wrong SPI mode/phase |
| OC fault with TC fitted | J2 clamp tightness, lead continuity | Loose screw contact, broken thermocouple wire |
| Reading falls when tip heated | Section 9.C polarity test | T+/T- swapped at J2 |
| Reading offset by several C at ambient | Internal vs thermocouple field comparison | Cold-junction gradient, heat source near U1, probe class |
| Jumpy readings (many LSB) | Log with host idle vs busy; check C2 presence | Missing/wrong C2, EMI on TC leads, supply noise/C1 |
| Wrong but plausible temperatures | U1 marking (suffix letter), decode math | Non-K variant fitted, or firmware scaling error (0.25 C/LSB) |
| Works at 1 MHz, fails at 5 MHz | SO edges vs SCK on scope | Bus capacitance with R1, marginal wiring in context (b) |
11. Bench record template#
| Field | Record |
|---|---|
| Board revision / serial | |
| Context (a) host or (b) supply+adapter IDs | |
| Thermocouple probe type/class/serial | |
| DMM/scope equipment and calibration date | |
| Ambient temperature | |
| First 32-bit frame (hex) and decode | |
| No-TC OC fault frame (hex) | |
| Polarity test result | |
| Ice-point reading / error | |
| Boiling-point reading / altitude correction / error | |
| Fault-bit test results (OC/SCG/SCV) | |
| Max verified SCK rate | |
| Noise log summary (LSB p-p) | |
| Deviations, raw-file paths | |
| Reviewer / date / disposition |
12. Review conclusion#
The schematic follows the MAX31855 datasheet's application guidance closely: 0.1 uF supply bypass (C1), the rev-2-recommended 10 nF differential input filter (C2), a released bus by default (R2), and a protected sensor-driven data line (R1). The design's honest weak points are all layout-stage and verification-stage: the cold-junction isothermal placement of J2 and U1 is a note, not yet copper; no first article exists, so the +/-2 C accuracy class, 5 MHz operation through R1, fault-bit timing, and gradient behavior are all unverified targets. The polarity, ice/boiling, and open-circuit tests in section 9 are the minimum evidence needed before trusting this module to teach correct numbers.