RV‑3028 Timer Registers 0x18–0x1A Do Not Retain Writes (PiicoDev RV‑3028)
Hi all,
I’m working with the PiicoDev RV‑3028 module and doing some register‑level testing to enable the countdown timer and INT functionality. I’ve run into behaviour that doesn’t match the RV‑3028‑C7 datasheet, and I’d like an engineer familiar with the PiicoDev implementation to review it.
Summary of the issue
-
Normal control registers (e.g.
0x00,0x0F) accept writes and read back correctly. -
Timer registers (
0x18,0x19,0x1A) never retain writes, always reading back0x00. -
This behaviour is consistent across multiple tests and power cycles.
-
I²C communication is otherwise working normally (timekeeping, alarms, etc.).
This suggests the issue is specific to the timer block, not the bus or the register map.
Test 1 — Control register vs timer registers
Code used
python
from machine import Pin, I2C
import time
i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=100000)
addr = 0x52
def w(reg, val):
i2c.writeto(addr, bytes([reg, val]))
time.sleep_us(200)
def r(reg):
i2c.writeto(addr, bytes([reg]))
time.sleep_us(200)
return i2c.readfrom(addr, 1)[0]
print("=== BEFORE ===")
for reg in (0x00, 0x01, 0x0E, 0x0F, 0x18, 0x19, 0x1A):
print(f"0x{reg:02X} =", hex(r(reg)))
print("\nModifying some control bits...")
# Toggle bit 2 of CTRL1 (0x00)
orig_00 = r(0x00)
w(0x00, orig_00 ^ 0b00000100)
# Attempt to start timer
w(0x18, 0x00)
w(0x19, 0x05)
w(0x1A, 0x04)
print("\n=== AFTER ===")
for reg in (0x00, 0x01, 0x0E, 0x0F, 0x18, 0x19, 0x1A):
print(f"0x{reg:02X} =", hex(r(reg)))
Output
Code
=== BEFORE ===
0x00 = 0x5
0x01 = 0x4
0x0E = 0x11
0x0F = 0x1
0x18 = 0x0
0x19 = 0x0
0x1A = 0x0
=== AFTER ===
0x00 = 0x1
0x01 = 0x4
0x0E = 0x11
0x0F = 0x1
0x18 = 0x0
0x19 = 0x0
0x1A = 0x0
Interpretation:
-
0x00changed exactly as expected → control register writes work. -
0x18–0x1Aremained0x00→ timer registers did not retain writes.
Test 2 — CE‑recommended “0x55 write” test
Code
python
print("=== TIMER WRITE TEST (0x55) ===")
for reg in (0x18, 0x19, 0x1A):
w(reg, 0x55)
print(f"Reg 0x{reg:02X} =", hex(r(reg)))
print("\n=== CONTROL REGISTER TEST (toggle bit 1 of 0x0F) ===")
orig = r(0x0F)
w(0x0F, orig ^ 0x02)
print("0x0F =", hex(r(0x0F)))
Output
Code
=== TIMER WRITE TEST (0x55) ===
Reg 0x18 = 0x0
Reg 0x19 = 0x0
Reg 0x1A = 0x0
=== CONTROL REGISTER TEST (toggle bit 1 of 0x0F) ===
0x0F = 0x3
Interpretation:
-
0x0Ftoggled correctly → normal register writes work. -
Timer registers still read back
0x00→ behaviour isolated to timer block.
What I’m asking
Given the above:
-
Are registers
0x18–0x1Aexpected to be writable on the PiicoDev RV‑3028 module? -
Is there any PiicoDev‑specific configuration required before the timer block becomes active?
-
Is the PiicoDev RV‑3028 known to support (or not support) the countdown timer and INT functionality described in the RV‑3028‑C7 datasheet?
Any guidance from someone familiar with the PiicoDev implementation would be appreciated.
Thanks!
Further to the above Additional Technical Findings (New Information)
After further register‑level diagnostics, I’ve gathered more evidence that the timer subsystem on my PiicoDev RV‑3028 module is not behaving like a genuine MicroCrystal RV‑3028‑C7.
1. Extension Register (0x0D) is not writable
This register is documented as R/W in the RV‑3028‑C7 Application Manual.
It contains timer clock frequency bits (TD), CLKOUT control, and other extension features.
Test:
python
Before write: 0x0D = 0x00
After write: 0x0D = 0x00
Even forcing 0xFF into 0x0D:
python
0x0D = 0x00
A genuine RV‑3028‑C7 must reflect the written value.
This strongly suggests the extension register block is disabled or not implemented.
2. Timer Registers (0x18–0x1A) remain unwritable
As previously shown:
Code
0x18 = 0x00
0x19 = 0x00
0x1A = 0x00
Even after writing patterns like 0x55, 0xAA, 0xFF, the values always read back as 0x00.
These registers are also documented as R/W in the official datasheet.
3. Chip ID Register (0x3F) returns 0x00
According to MicroCrystal documentation, 0x3F is a Feature/ID Register and should return a non‑zero value on all genuine RV‑3028‑C7 silicon.
My module returns:
Code
0x3F = 0x00
This is not a valid ID for any RV‑3028‑C7 revision.
4. Summary of observed behaviour
| Register | Expected (RV‑3028‑C7) | Actual (PiicoDev module) | Notes |
|---|---|---|---|
| 0x00, 0x0F | Writable | Writable | Normal behaviour |
| 0x0D | Writable | Always 0x00 | Extension block disabled |
| 0x18–0x1A | Writable | Always 0x00 | Timer block disabled |
| 0x3F | Non‑zero ID | 0x00 | Not matching genuine silicon |
5. Interpretation
Based on these results:
-
The timer subsystem (clock source, preload registers, control/status) appears absent or permanently disabled.
-
The extension register block is also disabled.
-
The ID register does not match any documented RV‑3028‑C7.
This behaviour is not possible on a full‑feature RV‑3028‑C7 as described in the MicroCrystal Application Manual.
6. Request for clarification
Can Core Electronics confirm whether the PiicoDev RV‑3028 module uses:
-
a full‑feature RV‑3028‑C7,
-
a reduced‑feature or custom variant,
-
or a factory‑configured version with the timer subsystem disabled?
The register‑level behaviour suggests the timer engine is not implemented on this module.




