Switching LEDs on the high-side

I'm looking for a way to switch the LEDs in a 8x8 LED matrix on the high side, so that the LEDs are between the IC and the ground connection. Almost all LED drivers that I found are intended to be used on the low-side with the IC between the LED and ground.

What I'm looking for: Vcc - switch - LED - ground
What's quite common: Vcc - LED - switch - ground

My requirements are:

  • each pin should be able to source 20mA
  • operating voltage is 3.3V
  • LOW on output should bring the pin in high-impedance (not just short to ground)
  • constant current circuitry onboard would be a plus, as I could save the resistors
  • price is not a major issue

Ideally I'd like to use an 8 or 16 bit shift register with constant current delivery, but much to my surprise those are not very common.

As an alternative I could build a discrete solution with MOSFET arrays, but if there's a more specialized IC for that available I'd prefer a single device over many discrete components.

Any help is highly appreciated.

but if there's a more specialized IC for that available I'd prefer a single device over many discrete components.

For 8x8 matrix why not use max7219 or ht16k33? Those contain high and low side drivers and constant current circuits.

EDIT: ah, is it that 3.3V operating voltage? Max7219 needs at least 4V and ht16k33 at least 4.5V.

Driving a matrix with only 3.3V is going to be a challenge. High and low side drivers are each going to drop some voltage, leaving little for current limiting circuits or resistors even with low forward-voltage leds.

PaulRB:
For 8x8 matrix why not use max7219 or ht16k33? Those contain high and low side drivers and constant current circuits.

A dedicated LED driver like MAX7219 (or any of its variants) is not applicable for me, as I need full control over the timing of each LED in my application. I have to switch both the high side and the low side manually, as there's some measurements taking place in between.

Driving a matrix with only 3.3V is going to be a challenge. High and low side drivers are each going to drop some voltage, leaving little for current limiting circuits or resistors even with low forward-voltage leds.

I'm aware of that. My first experiments included Darlington switches, which dropped quite some voltage from the circuit and were unable to do the job. On the low-side I currently use a TLC6C598 with far lower rDS of about 10 Ohms.

I have to switch both the high side and the low side manually, as there's some measurements taking place in between.

If anyone on the forum knows of components that suit your needs, they will need to know more about your project, especially these inbetween measurements.

I use the LED matrix to measure light in the red part of the spectrum. An ADC is reading the free floating value at the anodes (8 channels, one for each column) row by row, while a LED driver/shift register at the low-side is switching the rows. So upon every cycle the ESP32 scans each row and takes the anode voltages using the ADC.

As I use the LED matrix both as a display and as a sensor, I need full control over the voltages at the anode and cathode of each LED. It works quite well in my experimental setup using the controller's GPIOs with analogRead and digitalWrite, but of course that doesn't scale well given the number of GPIOs I'd need (and the current limitations of ESP32's GPIOs), so in order to expand the number of ports I have to use shift registers which are powerful enough to source and sink the 8x20mA current for the LEDs.

The low-side is solved, but I can't find a suitable shift register for the high side.

Mic2981 is a high side 8 channel driver which is still obtainable. You could control that with a normal 595 type shift register if that helps.

You are using the photo voltaic effect of a normal led to measure light intensity? Have I got that right? Why a 8x8 matrix?

Edit
A port expander say mcp23017 can source 20mA per pin and can work at 3.3 volts.

MIC5891, high side drive + shift register.
https://www.digikey.com/en/products/filter/pmic-power-distribution-switches-load-drivers/726?s=N4IgjCBcpgnAHLKoDGUBmBDANgZwKYA0IA9lANogAMIAusQA4AuUIAykwE4CWAdgOYgAvkOIAmCiAC23FAFZEEWkKA

@crossroads, mic5891 has 4.5V minimum supply voltage.

CrossRoads:
MIC5891, high side drive + shift register.
. . .

I had never heard of this one. It looks like a generally useful chip and a near complement of the TPIC6B595.

Thank you for your answers - the MIC5891 is close to what I need, but unfortunately my board will only be able to operate at 3.3V.

6v6gt:
a near complement of the TPIC6B595.

Also needs 4.5V min supply voltage (@6v6gt I know you were not actually suggesting it in this case).

I think I'll try to use a simple shift register and eight NTDJ1155LT1G MOSFET arrays. It's not a constant current source, but at least a capable switch which can be controlled with low voltage. So more or less a compromise between a discrete circuit and a specialized IC. Those 8 pieces won't consume too much area on the PCB.

Thank you for all your inputs - you pushed me on the right track.