Driver for a CD22M3494 cross point switcher
Library description
The CD22M3494 is a 16x8 crosspoint switch matrix, it can be used in any configuration i.e. 16 ins' 8 outs' or 16 outs' and 8 ins'. Control of the chip is pretty simple there are two parallel address buses a 4 byte address controls the X axis (16 IO pins) and a 3 byte address controls the Y axis (8 IO pins). A data bus says whether to open or close the switch and a 'strobe' bus actually performs the switch. This library provides a simple interface to control the CD22M3494 and provides a mechanism to associate source and destinations in pairs and switch the pairs via their names.
Diff: CD22M3494.h
- Revision:
- 0:5ef90cd25c10
- Child:
- 1:bc9ca1d1d7a6
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CD22M3494.h Tue Sep 03 12:49:43 2013 +0000 @@ -0,0 +1,132 @@ +#ifndef CD22M3494_H +#define CD22M3494_H + +#include <mbed.h> +/* +X ADDRESS +AX3 AX2 AX1 AX0 X SWITCH + 0 0 0 0 X0 + 0 0 0 1 X1 + 0 0 1 0 X2 + 0 0 1 1 X3 + 0 1 0 0 X4 + 0 1 0 1 X5 + 0 1 1 0 X12 + 0 1 1 1 X13 + 1 0 0 0 X6 + 1 0 0 1 X7 + 1 0 1 0 X8 + 1 0 1 1 X9 + 1 1 0 0 X10 + 1 1 0 1 X11 + 1 1 1 0 X14 + 1 1 1 1 X15 +*/ + +#define X0 0x00 +#define X1 0x01 +#define X2 0x02 +#define X3 0x03 +#define X4 0x04 +#define X5 0x05 +#define X12 0x06 +#define X13 0x07 +#define X6 0x08 +#define X7 0x09 +#define X8 0x0A +#define X9 0x0B +#define X10 0x0C +#define X11 0x0D +#define X14 0x0E +#define X15 0x0F + +/* +Y ADDRESS +AY2 AY1 AY0 Y SWITCH + 0 0 0 Y0 + 0 0 1 Y1 + 0 1 0 Y2 + 0 1 1 Y3 + 1 0 0 Y4 + 1 0 1 Y5 + 1 1 0 Y6 + 1 1 1 Y7 +*/ + +#define Y0 0x0 +#define Y1 0x1 +#define Y2 0x2 +#define Y3 0x3 +#define Y4 0x4 +#define Y5 0x5 +#define Y6 0x6 +#define Y7 0x7 + +#define MAX_X 0x0F +#define MAX_Y 0x7 + +class CD22M3494 { + +public: + + CD22M3494(PinName x0, PinName x1, PinName x2, PinName x3, PinName y0, PinName y1, PinName y2, PinName d, PinName str, PinName rs) { + xbus = new BusOut(x0, x1, x2, x3); + ybus = new BusOut(y0, y1, y2); + data = new DigitalOut(d); + strobe = new DigitalOut(str); + reset = new DigitalOut(rs); + data->write(0); + strobe->write(0); + reset->write(0); + } + + ~CD22M3494() { + delete xbus; + delete ybus; + delete data; + delete strobe; + delete reset; + } + + bool crossPointConnect(unsigned short x, unsigned short y) { + if (x <= MAX_X && y <= MAX_Y) { + data->write(1); + xbus->write(x); + ybus->write(y); + // let the data busses settle before setting strobe high + wait_us(2); + strobe->write(1); + // strobe must be high for at least 20 ns + wait_us(1); + strobe->write(0); + return true; + } + return false; + } + + bool crossPointDisconnect(unsigned short x, unsigned short y) { + if (x <= MAX_X && y <= MAX_Y) { + data->write(0); + xbus->write(x); + ybus->write(y); + // let the data busses settle before setting strobe high + wait_us(2); + strobe->write(1); + // strobe must be high for at least 20 ns + wait_us(1); + strobe->write(0); + return true; + } + return false; + } + +private: + BusOut* xbus; + BusOut* ybus; + DigitalOut* data; + DigitalOut* strobe; + DigitalOut* reset; +}; + + +#endif \ No newline at end of file