Categories

VMAC PiHat v2 Matrix AV

WIKI:

The HAMKit VMAC PiHat audio and video matrix is totally controlled by a FMS6501A.  This device is a 12 inputs and 9 outputs Video Switch Matrix IC, controlled by I2C.  The matrix I/O offers 1 to 1, or 1 to many, input/outputs.

All of our sample and test code is developed in Python.

The datasheet link is provided below.

Although the FMS6501A is primarily designed for video switching, the wide dynamic range, voltage levels at 1Vpp and minimal cross talk and distortion, also makes it ideal for switching audio too.

Extending the preliminary matrix test code, we explore some of the other Output Control Registers.

Matrix Configuration

The matrix configuration is fairly straight forward under software control.

In essence, we setup I2C to talk to the FMS6501A and then send commands to it.  A typical command is structured like:

i2cbus.write_byte_data([Device Address], [Output Channel], [Command])

The below Python code will select the FMS6501A  IC on the I2C and then set the matrix input 1 to output 1.

import smbus

DEVICE_ADDR = 0x43 #0x43 or 0x03
i2cbus = smbus.SMBus(1)

#Send Command to I2C - Input 1 to Output 1
i2cbus.write_byte_data(DEVICE_ADDR, 0x01, 0x81)

 

However, we are also able to set some additional Output Control Registers to adjust the Gain and Video Clamp.

The first register is shown in Table 1, which allows us to enable/disable an output and adjust the gain (6dB to 9dB)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

The below  test code will disable Output 1 and Power this Down.  This places the output into a high impedance state and deselects any assigned input.

TIP: It is recommended to Disable unused outputs, as this reduces current drain and power dissipation.

import smbus

DEVICE_ADDR = 0x43 #0x43 or 0x03
i2cbus = smbus.SMBus(1)

#Send Command to I2C - Disable Output 1 and Power Down
i2cbus.write_byte_data(DEVICE_ADDR, 0x01, 0x00)

 

The next register is the Channel Gain which can be used to set four different pre-selected gains.

Binary Examples for Input Channel 1:

0x81 = Binary ‭10000001‬ = 6dB
0xA1 = Binary ‭10100001‬ = 7dB
0xC1 = Binary ‭11000001‬ = 8dB
0xE1 = Binary ‭11100001‬ = 9dB
import smbus

DEVICE_ADDR = 0x43 #0x43 or 0x03
i2cbus = smbus.SMBus(1)

#Send Command to I2C - Input 1 to Output 1 - Gain Default of 6dB
i2cbus.write_byte_data(DEVICE_ADDR, 0x01, 0x81)

#Send Command to I2C - Input 1 to Output 1 - Gain Set to 7dB
i2cbus.write_byte_data(DEVICE_ADDR, 0x01, 0xA1)

#Send Command to I2C - Input 1 to Output 1 - Gain Set to 8dB 
i2cbus.write_byte_data(DEVICE_ADDR, 0x01, 0xC1)

#Send Command to I2C - Input 1 to Output 1 - Gain Set to 9dB 
i2cbus.write_byte_data(DEVICE_ADDR, 0x01, 0xE1)

 

Each input supports an integrated video clamp which sets the output sync-tip level of the video to approximately 300 mV.

Alternatively, the input maybe internally biased to center signals without sync to approximately 1.25V.  As we are dealing with mostly full composite video, this option is not explored here.

NB: Video Clamp Control Registers sample code to be explorer in a following update to this Wiki.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Further details on the configuration and test code can be found in other Wiki pages.  Also see programming and developing in Python.

Leave a Reply

This site uses User Verification plugin to reduce spam. See how your comment data is processed.