ISA-to-I2C Interface

A 3D model of the ISA-to-I2C Interface Card

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

  1. Write 80h to PORT+1. This disables the I2C bus, and selects register S1 for writing.
  2. Write 55h to PORT. 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.
  3. Write A0h to PORT+1. This selects register S2 for writing.
  4. Write 10h to PORT. 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.
  5. Write C1h to PORT+1. This enables the I2C bus and shifts it into an idle state.

Sending Data

  1. Wait for the bus to become idle by polling PORT+1 until bit 1 (bus busy, active low) is set.
  2. Write the target address to PORT, shifted right by one bit. Set bit 8 to 0 ("write").
  3. Write C5h to PORT+1, which generates the I2C START and emits the target address.
  4. Poll the S1 register by reading PORT+1 until bit 8 (status) is clear.
  5. 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.
  6. If all data bytes have been sent, jump to 8.
  7. Write a data byte to PORT. Loop back to 4.
  8. Write C3h to PORT+1. This transmits the I2C STOP and ends the transaction.