Skip to content

Inputs and Outputs

The NeuralPlex has a separate Vehicle Interface Processor (VIP) that is responsible for all analog inputs, PWM outputs, VRef, RS232/485, and LIN. It also shares three of the four CAN buses with the SOC, allowing it to send/recieve CAN messages during the early boot process. The VIP interfaces with the SOC via a high speed SPI bus, and is used by the SOC to configure the baud rate of each CAN bus to ensure the VIP and SOC do not have conflicting baud rates. The SPI bus is configured as show below.

  • MSB first
  • SCLK active high
  • CS active low
  • Data capture on 1st edge, shift (transmit) on 2nd
  • 100kHz clock speed
OP CodeData Packet
1 Byte4 Bytes
MSB<------>LSB
OP Codes
SPI_NOP 0x00
ANALOG_INPUT_READ 0x10
PWM_ENABLE 0x20
PWM_CONFIG 0x21
VREF_ENABLE 0x30
VREF_CONFIG 0x31
CAN_ENABLE 0x40
CAN_BAUD_RATE_CONFIG 0x41
CAN_TIMEOUT 0x42
RS232_STREAM 0x50
RS232_CONFIG 0x51
DATA_READY_ENCODE 0x60
DATA_RECEIVE 0x61
IMX_KEEP_ALIVE 0x70
IMX_SHUTDOWN 0x71
IMX_REBOOT 0x72
S32K_RESET 0x73

Individual messages are outlined in the protocol below. The ID represents the OP Code, Byte 0 represents MSB. Message with ID of 0x1XY represents the response message sent back to the SOC (master) one frame after receiving 0xXY. A full frame of 0’s serves as a NOP to allow the SOC to receive a response without sending more data to the VIP. Response to NOP will also be a frame consisting entirely of 0’s.

spidev_test
# Enable PWM 1 (opcode=0x20, channel=0x01)
$ spidev_test -D /dev/spidev0.1 -O -s 100000 -v -S 5 -p "\x20\x01\x00\x00\x00"
# Enable PWM 1 and 3 (opcode=0x20, channel=0x05)
$ spidev_test -D /dev/spidev0.1 -O -s 100000 -v -S 5 -p "\x20\x05\x00\x00\x00"
SPI_Protocol.sym
FormatVersion=5.0 // Do not edit this line!
Title="SOC to VIP SPI Bus Protocol"
{ENUMS}
enum PWM_PARAMETER(0="FREQUENCY", 1="DUTY_CYCLE")
enum PARITY(0="NONE", 1="EVEN", 2="ODD")
enum ADC_RESOLUTION(0="10", 1="11", 2="12")
enum DATA_TYPE(0="NONE", 1="STATUSES", 2="RS232", 3="RS485")
{SENDRECEIVE}
[NOP]
ID=000h
[ANALOG_INPUT_READ]
ID=010h
Var=ADC_CHANNEL unsigned 0,4 /max:1
[ANALOG_INPUT_CONFIG]
ID=011h
Var=RESOLUTION unsigned 0,2 /max:1 /e:ADC_RESOLUTION
[PWM_ENABLE]
ID=020h
Var=CHANNELS unsigned 0,4
[PWM_CONFIG]
ID=021h
Var=PWM_PARAMTER unsigned 4,2 /e:PWM_PARAMETER
Var=VALUE unsigned 8,24 -m
Var=CHANNELS unsigned 0,4
[VREF_ENABLE]
ID=030h
Var=ENABLE unsigned 0,1
[VREF_CONFIG]
ID=031h
Var=VALUE unsigned 0,16 -m
[CAN_ENABLE]
ID=040h
Var=CAN_CHANNEL unsigned 0,4
[CAN_BAUD_RATE_CONFIG]
ID=041h
Var=CAN_CHANNEL unsigned 0,4 /max:1
Var=VALUE unsigned 8,24 -m /max:1
[CAN_TIMEOUT]
ID=042h
Var=CAN_TIMEOUT_S unsigned 8,16 /u:s
Var=CAN_CHANNEL unsigned 0,4
[RS232_STREAM]
ID=050h
Var=TX unsigned 0,32 -m /max:1
[RS232_CONFIG]
ID=051h
Var=BAUD_RATE unsigned 0,5 /max:1
Var=RS485_FLAG unsigned 7,1
Var=BITS_PER_CHAR unsigned 8,4 /max:1
Var=PARITY unsigned 12,3 /max:1 /e:PARITY
Var=STOP_BITS unsigned 15,1
[DATA_READY_DECODE]
ID=060h
[DATA_RECEIVE]
ID=061h
[IMX_KEEP_ALIVE]
ID=070h
Var=KEEP_ALIVE unsigned 0,1
[IMX_SHUTDOWN]
ID=071h
Var=IMX_SHUTDOWN unsigned 0,1
Var=IMX_SHUTDOWN_DELAY_S unsigned 8,16 /u:s
[IMX_REBOOT]
ID=072h
Var=IMX_REBOOT unsigned 0,1
[S32K_RESET]
ID=073h
Var=S32K_RESET unsigned 0,1
[DATA_READY_DECODE_Response]
ID=160h
Var=DATA_TYPE unsigned 0,2 /e:DATA_TYPE
Var=BYTES unsigned 8,8
[ANALOG_INPUT_READ_Response]
ID=110h
Var=ADC_CHANNEL unsigned 0,4 /max:1
Var=VALUE unsigned 8,16 -m /max:1
[DATA_RECEIVE_Response]
ID=161h
Var=DATA unsigned 0,32 -m