Arducam Mini 2MP Plus Rev.D hangs when starting camera on Raspberry Pi Pico

Hi everyone, I’m trying to get an Arducam Mini 2MP Plus working with a Raspberry Pi Pico. I pulled down the RPI-Pico-Cam demo from the official repo (GitHub - ArduCAM/RPI-Pico-Cam · GitHub) and compiled the arducam_demo without any errors. Everything seems to initialize fine, but the program just hangs. I traced it down to this line in arducam.c:

It looks like it’s stuck waiting for the camera to report that recording has started — the while loop there never exits. The Pico is wired up according to the SPI pinout in the docs. Has anyone run into this before?

Thanks for the detailed report and the direct link to the line — that helps narrow things down. That specific hang point in arducam.c suggests the camera isn’t responding as expected over SPI after the init sequence.

Could you check which hardware revision of the Mini 2MP Plus you have? It should be printed on the board silkscreen — look for something like “Rev.C” or “Rev.D” on the camera module itself. We’ve seen some differences in behaviour between revisions.

Just checked — it says Rev.D on the board. I also came across this forum thread while searching around:

Seems like others have noticed Rev.D cameras acting differently too. Is the RPI-Pico-Cam repo just not compatible with this revision?

That’s exactly the issue. The RPI-Pico-Cam demo code was written for earlier revisions of the Mini 2MP Plus, and the Rev.D hardware revision introduced changes that broke compatibility with that older codebase. So you’re not doing anything wrong — the repo simply doesn’t support Rev.D.

The Arducam Mini 2MP Plus Rev.D requires the newer PICO_SPI_CAM driver instead. You’ll want to switch over to this repository:

Specifically, follow the C language approach described in the readme to drive the SPI camera with your Pico. The relevant section is here:

Grab that repo and try building the C examples — the Arducam_MINI_2MP_Plus_Videostreaming example would be the one to start with. Let me know how it goes.

Alright, I switched over to the PICO_SPI_CAM repo and compiled the Arducam_MINI_2MP_Plus_Videostreaming example. Getting further this time, but still not fully working.

The SPI connection check passes at two points in the code — line 55 and line 67 here:

So the Pico can definitely talk to the camera over SPI now — that’s an improvement over the old demo. But the program still hangs when it tries to actually capture an image. It gets stuck here:

I’m starting to think the Rev.D hardware is still the root cause here, even with the newer driver. Maybe the PICO_SPI_CAM library needs an update for this revision too?

Good progress — the fact that both SPI verification checks pass (lines 55 and 67) confirms the wiring, power, and basic communication are all solid. The camera is responding to register reads, which rules out a lot of the common low-level issues.

The hang at line 272 is inside the image capture routine — the code is waiting for the capture to complete but the camera never signals it’s done. This is a different failure mode than what you saw with the old RPI-Pico-Cam library, but you may be right that the Rev.D changes are still a factor here.

A few things to try while we dig deeper:

  • Make sure you’re using the latest commit from the PICO_SPI_CAM repo (do a git pull and clean rebuild if you haven’t already). There have been ongoing updates for Rev.D support.
  • Check what the I2C register state looks like right before that capture call — specifically the capture control and status registers — to see if the camera is actually receiving the capture command.
  • If you have access to a logic analyzer or even just a second Pico, capturing the SPI traffic around the point of the hang would be really useful to see what the last command sent was and whether the camera is ACKing it.

I’ll also check internally whether there’s a known capture timeout issue with the Mini 2MP Plus Rev.D on this example. In the meantime, does the serial output show anything useful just before the hang? The example usually prints some status lines during init and capture setup.