ISA-to-I2C Interface

The ISA-to-I2C Interface Card allows systems to access peripherals on an I2C bus. The card is based around the PCF8584 IC, and can operate at a frequency of up to 90 kHz when operating as the I2C bus controller. While the PCF8584 is an older part, it integrates better with the 5V-centric ISA bus. To support complete hand-soldering, the card is designed for a DIP-20 variant of the PCF8584 which is no longer manufactured (but readily available from eBay and other sources). A custom adapter will be made available that converts a modern surface-mount PCF8584 to the DIP-20 footprint.
The card can be used to add additional functionality to a system without consuming ISA card slots. For example, you could add a real-time clock, temperature sensor, and EEPROM, all for the cost of a single ISA card slot.
To simplify connectivity to external I2C devices, STEMMA connectors are used.
These provide +5V and GND, in addition to the I2C SDA
and SCL
signals. A great deal of external modules
are available that can be connected through these connectors.
Purchase
These cards are going through final testing and will be available for purchase soon at the M88 Tindie store.
Programming Examples
The I/O port address for programming is configured with a DIP-Switch on the card. This allows you to set the base address of the card to avoid conflicts with other peripherals that you may have installed in your system.
Initialization
- Write
80h
toPORT+1
. This disables the I2C bus, and selects register S1 for writing. - Write
55h
toPORT
. This writes the controller's own address (AAh
) to the S1 register. You can choose the I2C address by modifying this value; it is the address shifted right one bit. - Write
A0h
toPORT+1
. This selects register S2 for writing. - Write
10h
toPORT
. This configures the S2 clock register for 90 kHz operation with a system clock of 4.43 MHz. Refer to the PCF8584 datasheet for other values to use for faster system clocks. - Write
C1h
toPORT+1
. This enables the I2C bus and shifts it into an idle state.
Sending Data
- Wait for the bus to become idle by polling
PORT+1
until bit 1 (bus busy, active low) is set. - Write the target address to
PORT
, shifted right by one bit. Set bit 8 to 0 ("write"). - Write
C5h
toPORT+1
, which generates the I2CSTART
and emits the target address. - Poll the S1 register by reading
PORT+1
until bit 8 (status) is clear. - Check that bit 4 (LRB) is clear - if it is not, the target did not acknowledge, and further transmission should be skipped, so jump to 8.
- If all data bytes have been sent, jump to 8.
- Write a data byte to
PORT
. Loop back to 4. - Write
C3h
toPORT+1
. This transmits the I2CSTOP
and ends the transaction.