Bit-bang mode¶
Bit-bang mode allows the programmer direct access (both read and write) to the state of the IO lines from a compatible FTDI device.
The interface provided by FTDI is intended to mirror the type of usage on a microcontroller, and is similar to the ‘user port’ on many old 8-bit computers such as the BBC Micro and Commodore 64.
The basic model is to have two 8 bit ports - one for data, and one for ‘direction’. The data port maps each of the 8 bits to 8 independent IO signals, each of which can be configured separately as an ‘input’ or an ‘output’.
In pylibftdi, the data port is given by the port
attribute of a BitBangDevice instance, and the direction control is provided by the direction
attribute. Both these attributes are implemented as Python properties, so no method calls are needed on them - simple read and write in Python-land converts to read and write in the physical world seen by the FTDI device.
The direction register maps to
where each bit maps to a separate digital signal,
Read-Modify-Write¶
Port vs Latch
Via the augmented assignment operations, pylibftdi BitBangDevice
instances support read-modify-write operations, such as arithmetic (+=
etc), bitwise (&=
), and other logical operations such as shift (<<=
)
Examples¶
>>> from pylibftdi import BitBangDevice
>>>
>>> with BitBangDevice('FTE00P4L') as bb:
... bb.direction = 0x0F # four LSB are output(1), four MSB are input(0)
... bb.port |= 2 # set bit 1
... bb.port &= 0xFE # clear bit 0
>>> with BitBangDevice() as bb:
... bb.port = 1
... while True:
... # Rotate the value in bb.port
... bb.port = ((bb.port << 1) | ((bb.port >> 8) & 1)) & 0xFF
... time.sleep(1)
The Bus class¶
Dealing with bit masks and shifts gets messy quickly. Some languages such as C and C++ provide direct support for accessing bits - or series of consecutive bits - with bitfields. The Bus
class provides the facility to provide a similar level of support to pylibftdi BitBangDevice
classes.
As an example, consider an HD44780 LCD display. These have a data channel of either 4 or 8 bits, and a number of additional status lines - rs
which acts as a register select pin - indicating whether a data byte is a command (0) or data (1), and e
- clock enable.:
class LCD(object):
"""
The UM232R/245R is wired to the LCD as follows:
DB0..3 to LCD D4..D7 (pin 11..pin 14)
DB6 to LCD 'RS' (pin 4)
DB7 to LCD 'E' (pin 6)
"""
data = Bus(0, 4)
rs = Bus(6)
e = Bus(7)