Moinsen,
Zur Nachfrage:
Ja, jeder OUTPUT Chanel eines Portexpanders kann als eigenständig wirkender CS Chanel für einen weiteren SPI-Slave dienen.
Und der ganze Rest:
Ich weiss zwar immer noch nicht was dir so vorschwebt, aber :
Ein MOSFET ist kein Schalter im Sinne eines Relais, außer du meinst einen Optokoppler mit MOSFET Ausgang, alternativ einer Levelshifterschaltung aber auch hier kann ich dir gleich den Wind aus den Segeln nehmen.
LevelShifter als N-Kanal-MOSFET Schaltungen funktionieren, wenn die LOW-Side bei 3,3 Volt liegt nur bis max. 18 Volt auf der High Side. Mit alle den Vorwiderständen und Einkoppelwiderständen um einen Optokoppler zu betreiben, bzw einen solchen OPTO -MOSFET kommst du nicht nur auf einen höheren Bauteileaufwand, sondern auch auf einen höheren Platz- und Investitionskostenbedarf.
Grundsätzlich ist die Frage zu stellen, sind diese "Spannungserkennungssysteme" eine Event-Funktion, also der RasPI muss umgehend auf eine Spannungsänderung reagieren, oder reicht es wenn diese innerhalb einer Programmroutine ( Statemachine ) nur regelmäßig oder bei Bedarf abgefragt werden.
Wenn es sich um ein Eventsystem handelt, wird es ohnehin um einiges Aufwendiger. Wenn es ausreicht nur zyklisch die Spannung zu prüfen, ist die reine ADC Messung, dann auch ohne besondere Referenzspannungsquelle vom Materialeinsatz her günstiger, und platzsparender.
Bei einem Eventsystem müsstest du zudem die INT_A und INT_B Ausgänge jedes MCP23x17 ( 16 Input Chanels ) noch mit dem RasPI verbinden, damit dieser Chip den RasPI anstoßen kann "Hallo, hier ist gerade etwas an einem GPIO passiert". Anschließend musst du dieses Portregister des betreffenden Portexpanders innerhalb von 20 mSek auslesen um zu erfahren, welcher GPIO eine Veränderung des Pegels festgestellt hat. Zudem kannst du auch hier keine 24 Volt auf den INPUT GPIO des Portexpanders prallen lassen, so das in diesem Fall sogar wieder sehr materialaufwendig Optokoppler notwendig werden.
Da alle MCP23x17 über 2 getrennte Port-Register verfügt, bedeutet jeder weitere MCP23x17 als Input am RasPI ( egal wie abgefragt ) nochmals 2 zusätzliche GPIOs !
-> Fall "Statemachine mit ADC"
Widerstände für den ADC sind Cent-Ware ( 0,7 Euro-Cent SMD ) und mit ca. 3 Euro Materialeinsatz für einen ADC hast du 8 Eingangskanäle abgefrühstückt. Und du kannst sogar eine Aussage treffen ob die Spannung bei ungefähr 24 Volt liegt, oder ob durch eine anderen / äußeren Einfluß ( Leitungsbeschädigung / Korrosion / eingedrungene Feuchtigkeit ) sich ein potentieller Ausfall anbahnt.
-> Fall "Portexpander als Inputconector":
Im Vergleich mit einem Optokoppler brauchst du noch eine Hilfsspannung, 3 Widerstände und diesen Optokoppler pro Kanal -> mehr als die doppelten Kosten für 8 Kanäle plus zusätzlichen Aufwand für eine Event Programmierung und entsprechend viele freie GPIOs am RasPi .
Wie gesagt, machbar ist vieles oder einiges, aber ohne das Ziel klar zu wissen, kann ich hier auch nur mehr oder minder im Nebel herumstochern.
Grundsätzlich, wenn es eine Überwachungsfunktion ist, sollte man sich nicht auf einen digitalen boolschen Werte ( ja oder nein ) verlassen, dann sollte die vorausschauende Selbstdiagnose einen höheren Stellenwert einnehmen. Dazu kannst du auch um das Ganze zu parallelisieren den I²C und einem MCP23017 verwenden, um in einem eigenen Thread / Programm die ADCs mittels des sekundären SPI Busses abzufragen, um einfach schneller Zugriff auf die Werte zu erhalten, und natürlich eine schnellere Verarbeitung unabhängig des primären SPI Bus OUTPUT Controllings zu haben. Damit könnt eine SW Routine sich mit dem primären SPI Bus um die ganzen DigiPOTs kümmern, und eine eigenständige Programmroutine mittels MCP23017 ( 16 Ports mal 8 ADC Chanels ) oder MCP23008 ( 8 Ports a 8 ADC Chanels ) in dem I²C zuzüglich des sekundären SPI Bus um die Spannungsüberwachung.