mirror of
https://github.com/eddyem/stm32samples.git
synced 2025-12-06 02:35:23 +03:00
5.1 KiB
5.1 KiB
Firmware for controllers of thermal sensors
Make regular scan of 8 sensors' pairs. USART speed 115200. Code for ../../kicad/stm32
Serial interface commands (ends with '\n'), small letter for only local processing:
- 0...7 send message to Nth controller, not broadcast (after number should be CAN command)
- @ set/reset debug mode
- a get raw ADC values
- B send dummy CAN messages to broadcast address
- b get/set CAN bus baudrate
- c show coefficients for all thermosensors
- D send dummy CAN messages to master (0) address
- d get current CAN address of device
- Ee end temperature scan
- Ff turn sensors off
- g group (sniffer) CAN mode (print to USB terminal all incoming CAN messages with alien IDs)
- Hh switch I2C to high speed (100kHz)
- Ii (re)init sensors
- Jj get MCU temperature
- Kk get values of U and I
- Ll switch I2C to low speed (default, 10kHz)
- Mm change master id to 0 (m) / broadcast (M)
- N get build number
- Oo turn onboard diagnostic LEDs On or off (both commands are local!)
- P ping everyone over CAN
- Qq get system time
- Rr reinit I2C
- s send CAN message (format: ID data[0..8], dec, 0x - hex, 0b - binary)
- Tt start single temperature measurement
- u unique ID (default) CAN mode
- Vv very low speed
- Xx go into temperature scan mode
- Yy get sensors state over CAN (data format: 3 - state, 4,5 - presense mask [0,1], 6 - npresent, 7 - ntempmeasured
- z check CAN status for errors
The command M allows to temporaly change master ID of all controllers to broadcast ID. So all data they sent will be accessed @ any controller.
PINOUT
- I2C: PB6 (SCL) & PB7 (SDA)
- USART1: PA9 (Tx) & PA10 (Rx)
- CAN bus: PB8 (Rx), PB9 (Tx)
- USB bus: PA11 (DM), PA12 (DP)
- I2C multiplexer: PB0..PB2 (0..2 address bits), PB12 (~EN)
- sensors' power: PB3 (in, overcurrent), PA8 (out, enable power)
- signal LEDs: PB10 (LED0), PB11 (LED1)
- ADC inputs: PA0 (V12/4.93), PA1 (V5/2), PA3 (I12 - 1V/A), PA6 (V3.3/2)
- controller CAN address: PA13..PA15 (0..2 bits), PB15 (3rd bit); 0 - master, other address - slave
LEDS
- LED0 (nearest to sensors' connectors) - heartbeat
- LED1 (above LED0) - CAN bus OK
CAN protocol
Variable data length: from 1 to 8 bytes. First (number zero) byte of every sequence is command mark (0xA5) or data mark (0x5A).
Commands
Common commands
CMD_PING(0) request for PONG cmdCMD_START_MEASUREMENT(1) start single temperature measurementCMD_SENSORS_STATE(2) get sensors stateCMD_START_SCAN(3) run scan modeCMD_STOP_SCAN(4) stop scan modeCMD_SENSORS_OFF(5) turn off power of sensorsCMD_LOWEST_SPEED(6) lowest I2C speedCMD_LOW_SPEED(7) low I2C speed (10kHz)CMD_HIGH_SPEED(8) high I2C speed (100kHz)CMD_REINIT_I2C(9) reinit I2C with current speedCMD_CHANGE_MASTER_B(10) change master id to broadcastCMD_CHANGE_MASTER(11) change master id to 0CMD_GETMCUTEMP(12) MCU temperature valueCMD_GETUIVAL(13) request to get values of V12, V5, I12 and V3.3CMD_GETUIVAL0(14) answer with values of V12 and V5CMD_GETUIVAL1(15) answer with values of I12 and V3.3CMD_REINIT_SENSORS(16) (re)init all sensors (discover all and get calibrated data)CMD_GETBUILDNO(17) get by CAN firmware build number (uint32_t, littleendian, starting from byte #4)CMD_SYSTIME(18) get system time in ms (uint32_t, littleendian, starting from byte #4)
Dummy commands for test purposes
CMD_DUMMY0= 0xDA,CMD_DUMMY1= 0xAD
Commands data format
- byte 1 - Controller number
- byte 2 - Command received
- bytes 3..7 - data
Thermal data format
- byte 3 - Sensor number (10*N + M, where N is multiplexer number, M - number of sensor in pair, i.e. 0,1,10,11,20,21...70,71)
- byte 4 - thermal data H
- byte 5 - thermal data L
Sensors state data format
- byte 3 - Sstate value:
[SENS_INITING]= "init"[SENS_RESETING]= "reset"[SENS_GET_COEFFS]= "getcoeff"[SENS_SLEEPING]= "sleep"[SENS_START_MSRMNT]= "startmeasure"[SENS_WAITING]= "waitresults"[SENS_GATHERING]= "collectdata"[SENS_OFF]= "off"[SENS_OVERCURNT]= "overcurrent"[SENS_OVERCURNT_OFF]= "offbyovercurrent"
- byte 4 -
sens_present[0]value - byte 5 -
sens_present[1]value - byte 6 -
Nsens_presentvalue - byte 7 -
Ntemp_measuredvalue
MCU temperature data format
- byte 3 - data H
- byte 4 - data L
All temperature is in degrC/100!
U and I data format
- byte 2 - type of data (
CMD_GETUIVAL0- V12 and V5,CMD_GETUIVAL1- I12 and V3.3)
case CMD_GETUIVAL0
- bytes 3,4 - V12 H/L
- bytes 5,6 - V5 H/L
case CMD_GETUIVAL1
- bytes 3,4 - I12 H/L
- bytes 5,6 - V33 H/L
Voltage is in V/100, Current is in mA