I2CMessenger()

Description

Translates the Bpod serial interface (UART / RS-485) to the 2-wire I2C interface, using a Bpod I2C Messenger Module.

  • Enables message transmission to external instruments (e.g. scanimage - open source software for functional imaging).

  • Acts as an I2C master. By default, transmits all incoming messages from Bpod to slave#1.

  • Output logic levels (3.3V or 5V) are configurable with a jumper on the device.

  • Powered by the open source SAMD21 breakout board, an Arduino-compatible ARM Cortex M0 microcontroller.

  • By default, Messenger passes bytes in both directions.

  • The USB connection can be used to load messages (up to 16 bytes) to transmit instead of each byte that arrives.

  • Compatible with Bpod 0.7+

Syntax

To initialize:

I2C = I2CMessenger(portString);

    • portString = the I2C messenger's serial port (e.g. COM3)

  • Returns an I2C Messenger object

To set the current slave:

I2C.SlaveAddress = address;

  • address = 1-255

  • Default = 1

To load a 0-16 byte serial message:

I2C.loadMessage(messageIndex, message, [messageSlaveAddress]);

    • messageIndex = 1-256

    • message = a 1-16 byte array of bytes

    • optional: messageSlaveAddress = a fixed I2C slave address for the recipient (default = current slave)

To set the messaging mode:

I2C.Mode = mode;

  • mode = 'Relay', 'Message', 'USBRelay' or 'USBMessage

    • 'Relay' - Sends incoming bytes to current I2C slave

    • 'Message' - Sends incoming 1-16 byte messages to their I2C slave(s)

      • 'USBRelay' - Sends incoming bytes to the USB serial port (for diagnostics)

      • 'USBMessage' - Sends incoming 1-16 byte messages to the USB serial port (for diagnostics)

To set the transfer speed:

I2C.TransferSpeed = speed;

To reset all parameters to defaults:

I2C.reset;

To disconnect the serial port and clear the object:

clear I2C

Syntax (diagnostics)

To force-send a byte from the I2C module to the Bpod state machine serial port:

I2C.bpodWrite(byte);

To force-send a byte from the I2C module to the current I2C slave:

I2C.I2Cwrite(byte);

To force-send a 1-16 byte message from the I2C module to its I2C slave:

I2C.triggerMessage(messageIndex);

Example

% 1. This code connects to the I2C module

% A byte is sent to I2C slave#3, triggered by USB. Then, message#34 is set to a 13-byte message, to slave#5. The latter message is triggered from the state machine.

I2C = I2CMessenger('COM6'); % Initialize I2C messenger on port COM6

I2C.SlaveAddress = 3;

I2C.Mode = 'Message';

I2C.I2Cwrite('A'); % Force-send 'A' to slaveAddress 3

I2C.setMessage(34, 'HelloI2Cslave', 5); % message#, message, slaveAddress

sma = NewStateMachine();

sma = AddState(sma, 'Name', 'SendI2CMessage', ...

'Timer', 0,...

'StateChangeConditions', {'Tup', 'exit'},...

'OutputActions', {'I2C1', [1 34]});% 1 is the op code to send a message.

% Because the module is in 'Message' mode, message#34 will

% be sent instead of byte 34.

SendStateMachine(sma);

RawEvents = RunStateMachine;