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.
Bus Settings
Section titled “Bus Settings”- MSB first
- SCLK active high
- CS active low
- Data capture on 1st edge, shift (transmit) on 2nd
- 100kHz clock speed
Frame Structure
Section titled “Frame Structure”| OP Code | Data Packet |
|---|---|
| 1 Byte | 4 Bytes |
| MSB<--- | --->LSB |
OP Codes
Section titled “OP Codes”SPI_NOP 0x00ANALOG_INPUT_READ 0x10PWM_ENABLE 0x20PWM_CONFIG 0x21VREF_ENABLE 0x30VREF_CONFIG 0x31CAN_ENABLE 0x40CAN_BAUD_RATE_CONFIG 0x41CAN_TIMEOUT 0x42RS232_STREAM 0x50RS232_CONFIG 0x51DATA_READY_ENCODE 0x60DATA_RECEIVE 0x61IMX_KEEP_ALIVE 0x70IMX_SHUTDOWN 0x71IMX_REBOOT 0x72S32K_RESET 0x73Messages
Section titled “Messages”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.
# 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
Section titled “SPI Protocol”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=010hVar=ADC_CHANNEL unsigned 0,4 /max:1
[ANALOG_INPUT_CONFIG]ID=011hVar=RESOLUTION unsigned 0,2 /max:1 /e:ADC_RESOLUTION
[PWM_ENABLE]ID=020hVar=CHANNELS unsigned 0,4
[PWM_CONFIG]ID=021hVar=PWM_PARAMTER unsigned 4,2 /e:PWM_PARAMETERVar=VALUE unsigned 8,24 -mVar=CHANNELS unsigned 0,4
[VREF_ENABLE]ID=030hVar=ENABLE unsigned 0,1
[VREF_CONFIG]ID=031hVar=VALUE unsigned 0,16 -m
[CAN_ENABLE]ID=040hVar=CAN_CHANNEL unsigned 0,4
[CAN_BAUD_RATE_CONFIG]ID=041hVar=CAN_CHANNEL unsigned 0,4 /max:1Var=VALUE unsigned 8,24 -m /max:1
[CAN_TIMEOUT]ID=042hVar=CAN_TIMEOUT_S unsigned 8,16 /u:sVar=CAN_CHANNEL unsigned 0,4
[RS232_STREAM]ID=050hVar=TX unsigned 0,32 -m /max:1
[RS232_CONFIG]ID=051hVar=BAUD_RATE unsigned 0,5 /max:1Var=RS485_FLAG unsigned 7,1Var=BITS_PER_CHAR unsigned 8,4 /max:1Var=PARITY unsigned 12,3 /max:1 /e:PARITYVar=STOP_BITS unsigned 15,1
[DATA_READY_DECODE]ID=060h
[DATA_RECEIVE]ID=061h
[IMX_KEEP_ALIVE]ID=070hVar=KEEP_ALIVE unsigned 0,1
[IMX_SHUTDOWN]ID=071hVar=IMX_SHUTDOWN unsigned 0,1Var=IMX_SHUTDOWN_DELAY_S unsigned 8,16 /u:s
[IMX_REBOOT]ID=072hVar=IMX_REBOOT unsigned 0,1
[S32K_RESET]ID=073hVar=S32K_RESET unsigned 0,1
[DATA_READY_DECODE_Response]ID=160hVar=DATA_TYPE unsigned 0,2 /e:DATA_TYPEVar=BYTES unsigned 8,8
[ANALOG_INPUT_READ_Response]ID=110hVar=ADC_CHANNEL unsigned 0,4 /max:1Var=VALUE unsigned 8,16 -m /max:1
[DATA_RECEIVE_Response]ID=161hVar=DATA unsigned 0,32 -m