** ** Before doing a firmware update, be sure to connect to the first COM port and ** bring up the menu in a serial terminal program. Make a note of the RTC ** calibration value displayed in the title block as you will need to re-enter ** this after a firmware update. ** ========== == V4.8 == ========== 27 March 2023 - Debugged Production Test ====================== == V4.7 (sw V2.1.5) == ====================== 17 March 2023 - Added optional parameter to serial-mode newfile command to allow a file to be named explicitly. - Changed board type so it would show up as SPLat rather than HMI430 - Fixed F3 SD SPI Driver issues - Three years plus of system changes: - System: Added SPxTxfrU instruction to generate a CRC16. - Changed SPxTxfrU instruction to a SPxChOut instruction: Load U with the data, V with the length, then issue a CPU SPxChOut command with code 0 for 16 bits and 1 for 24 bits. Results start at U[1] - Also removed a warning from the VM LCD code. - (System) Added magnitude checking when sending the LSB of an analog value over SEXI - SX10508: Work in progress on debugging the file system problems commencing with the STM32F3 changes in 2016 - Modified reset cause determination to put watchdog before pin reset because - at least on the F3 - both seem to be set by the IWDG signal. - Reset cause only seems to be used by one product so far. - Modified order of reset condition testing so watchdog would have first priority. - Added code to handle a Modbus ReadInputRegisters command, faking it to read the RAM. - Added Modbus code also to read and write addresses in the 4000 range and the 5000 range, faking them as RAM locations. - Modified System source files so their ARM_vCrash calls can be trapped. - Updated SPX code for CPU. - Modified LCD code so that if the LCD is OFF and OBLCD_Dim has ever been called, the buttons will be marked as inactive. - Changed checking of pin reset reason in resetInit function before checking standby. - boolean VM_oSPLatLinkConnectivity(void) function is added to splat_vm.c - Turned off VBUS sensing code as it doesn't seem to affect normal operations and allows the VBUS pin to be used for other things. - Modified STM32 F4 register allocation to allow PWM signals to be generated on the N outputs on port E. This might or might not work. - Modified PWM driver code to cope with inverse outputs correctly. - Modified STM32 PWM code to only include inverted inputs for 405/407. - Added utility function to check and convert numbers incorrectly converted by FloatMem16S. - Updated source code for FloatMem16S to convert numbers correctly. - CRC16 init value define added. - Added maths functions to the HMI700. - Added hooks in all currently-used device types to run CRC calculations on all transmitted bytes. - Working on making the SPx calls for the CPU more available. - Completed mapping all SPx commands implemented in 32-bit CPU to SPLat functions. - Added commands to implement indexed CRCs, whereby a user can run up to 5 CRC implementations at a time. - Increased allowable Modbus message length from 125 to 253 to allow more registers to be sent at once with the available buffer size. - Added beep when a button is pressed, but only if none are pressed before. ========== == V4.6 == ========== 28 May 2020 (on branch SX10508_v4.6) - Back-tracked to version 4.4 because it worked. - Added XwirePhys command during initialisation of SPLat code to ensure it's set to something - Added XWireStop command when selecting User mode to ensure the Xwire code stops running ========== == V4.5 == ========== 25 May 2020 - Added XwirePhys command during initialisation of SPLat code to ensure it's set to something - Added XWireStop command when selecting User mode to ensure the Xwire code stops running - Included 4 years of system code updates: - OS: STMF4 DAC configuration now allows the buffer to be enabled or disabled - VM: Fixed display of PermStore values in the "Module" window in SPLat/PC as all bytes were off by 1, thus the first byte was always missing and the "status" was never correct. - VM: the Xwire LCD master now sends zeroes for the command bytes (blink, etc) otherwise sending these bytes sent garbage and stuffed up the LCD. - OS: created common VTrim module - OS: Updated older projects to use the BILED module - OS: Saw the 1 second timer getting delayed, manifested by ComTestStartTimer taking 13 seconds dignal rather than 10. Due to timers being deleted before the next timer was fetched. - VM: ComTestStartTimer now using fast tick to avoid expiring after 9 - 10 seconds (only following RUN from SPLat/PC, power on was always 10s). - VM: XwireGetPollCntr now increments as soon as a packet is received rather than at the start of sending the response, this also fixed a problem where poll count was not incrementing if the slave had no data to return; interpacket time delays have been shortend to increase throughput. - Increased timer stack from 64 to 80 - STM32: The watchdog can now have it's timeout set by the application - VM: Fixed STTest which was not working correctly due to a typo. It was especially worse with small delays. - STM32F0: DIO_vWrite() was HardFaulting when clearing a pin, moved it to the BRR specific register - OS: added UTIL_bBitReverse() - VM: NVReadRec & NVWriteRec were incorrectly expecting a 16 bit address but it's only an 8 bit address. - STM32F3: EEPROM driver is working - STM32: I2C EEPROM device can now be specified at runtime - STM32: Lowered priority given to reporting watchdog resets as it was being reported rather than power on from standby (when the wake from standby was being intentionally triggered by the dog). - VM: simplified Shadow function (write now does a clear too) - VM: SEXI was not working when analogue I/O didn't start at 0 - VM: now able to report analogue I/O when numbering doesn't start at 0 - SPLatVM: SEXI was not turning off blinking outputs when SPLat/PC connected - SEXI: a duplicate slave entry in the Xwire table now doesn't incorrectly increase the nof I/O's; - VM: More than 10 analogues, in or out, are now correctly sent to SPLat/PC. - VM: Now ensure countdown timers are cleared on VM reset - VM: GoIfInOn/Off/K were ignoring "J" - VM: ComTestStartTimer now using fast tick to avoid expiring after 9 - 10 seconds (only following RUN from SPLat/PC, power on was always 10s). - VM: XwireGetPollCntr now increments as soon as a packet is received rather than at the start of sending the response, this also fixed a problem where poll count was not incrementing if the slave had no data to return; interpacket time delays have been shortend to increase throughput. - VM: Fixed display of PermStore values in the "Module" window in SPLat/PC as all bytes were off by 1, thus the first byte was always missing and the "status" was never correct. - VM: the Xwire LCD master now sends zeroes for the command bytes (blink, etc) otherwise sending these bytes sent garbage and stuffed up the LCD. - OS: Created IO_UNUSED() macro - VM: Created a generic conductivity module. - VM: WaitOnKT wasn't working (incorrect opcode length) - OS: OBLCD now returns a SeqCount whenever the buffer has changed so the caller can refresh only when necessary. - VM: WtoU, QtoU, UtoW, UtoQ, fixToU, floatFromU, would incorrectly error when loading a float into U[16+] - VM: Doing a fGetTimer or Test quickly after starting a timer may sometimes have caused the timer to expire immediately. - STM32F3: now support the DACs - VM: fixed a serious bug in fSTTimeSince & STTest that 2 days after the controller is turned on made both functions think the elapsed time is always greater than 167772.16s. - ARM: The SPLat/VM on ARM boards was throwing a RAM OutOfBounds error when trying to access byte 250 which is actually the legal last address. - created VM keypad driver - SPLatVM: MemToUV and UVToMem were ignoring the u[n] offset and always starting from u[0]. - ARM: volatile in typedef was placing constants in the .data segment, moved volatile keyword to variables themselves. - ARM: created common function for fetching device ID; STM32F4 devices will now report a different USB serial number, hence their COM port assigned by windows will change. - ARM: a 16bit and 24bit ID is now available on all ARM boards. These are a CRC of a bigger ID so there's a small chance two controllers may have the same ID (chance is obviously less with the 24bit version). - VM: sometimes a controller running MODBUS would reset when SPLat/PC connected due to an incorrect method of mutex release when closing the MODBUS port. - ARM: removed "oIsSDA" flag for I2C definition as it's now done automatically - VM: a pullup can now be specified for the serial RX pin. - Added RXPULLUP to F3 and NXP builds - ARM STMicro boards: If MODBUS was set to 8 data bits even parity, a 0x00 would cause a LIN break and resulted in the packet being dumped resulting MODBUS errors (typically no response if the SPLat is a MODBUS slave). - VM: SPx callbacks modified to receive the registered address, this allow multiple instances to exist. - OS: created htonl() - VM: floatFromU and fixToU were corrected to treat W as big endian when transferring between U - removed double handling of the xwire physical interface number, so now it's not in VMXW module but is only in the XW module. - ARM: SEXI was incorrectly calculating the output size limit, so a value of 37 outputs which is legal was throwing a "too big" error. - ARM: WarmBoot now doesn't cause an error, it just restarts the VM. This is the same behaviour as the 8bit controllers. - ARM: fixed a reset that could occur if Xwire Slave was restarted when it & MODBUS Slave were operating simultaneously. - Xwire: the Xwire slave thread could run out of stack and cause a reset - NVEM may now report SPxNoResp instead of NVEMPtrOOB if there's a problem communicating with an external EEPROM - VM:The CAN bus interface is now supported - VM: SPxChOut is no longer NULL terminated, allowing V to be any value without impacting the data in U. - FatFS: added SD card "how it works" docs - logger1302: updated for latest OS - various SPx modules updated for latest OS - now filling both stacks to help detect overflow - OS: created a generic ST SPI configuration, clock & txfr function. - OS: increased IRQ stack to avoid overflow in debug builds - VM: Fixed InputOM that was returning wildly incorrect values. - VM: the delay between a slave receiving and replying was to quick causing legacy controllers to miss the response, increased to around 500us. - VM: Oh dear, RTCDateToUV, RTCDMToUV, RTCHHMMToUV, RTCHHMMSSToUV were all incorrectly using the _current_time_ rather than the values in the RTC registers. So functions like OBLCD_HHMMSS were displaying the current time rather than the time in the RTC registers. - VM: stop I/O messages during app upload - Setting the NV pointer no longer checks for OOB, it now only check to ensure the pointer is < 0xFFFF. This means the PTR can be set and page chosen in any order. The check for NVOOB is done only when reading/writing NVEM. - VM: YieldTask may now be called in single tasking mode without throwing en error. This is especially useful in subroutines which may be shared by both single and multi-tasking applications. - VM: ARM based OBQC_fGet used to return 0 thru 16777215, but this meant moving backward from 0 would cause a jump to 16777215. So now it returns negative, which is the same as 8bit SPLat controllers. - VM: ARM controllers now support UVtoNV for NVEM page 1 and up. - VM: A race condition existed in the QuadratureCounter that could cause wrong readings to be returned, often this was seen when moving backwards with the count being returned as a large positive number rather than a small negative number. Thanks to Michael B for spotting this. - VM: OBLCD_Dim may now be used without throwing an error on boards that only support a virtual LCD, it is simply ignored. - STM32F3: can now measure the 3V3 rail based on an internal reference - VM: floatFromU was not working correctly for negative numbers. - ARM ST: added generic speaker driver for ST parts, this required a large structural change to the analogue output module (both PWM & DAC) - VM: reading the internal analogue reference via a float (ie in the VM) now returns a normalised number based on the ST factory calibration value (multiply by 3.3 to get Vcc) - VM: relay driver can now invert the PWM signal, for those times it's connected to an inverting input. - SPLatOS: AIO_oReadVref now returns a normalised value, unscaled as some boards may use 3.4V rather than 3.3. - SPLat/PC is now able to connect via TTL serial to ARM boards on the first attempt. - VM: comms profile 5 was 8bits, odd_parity, 2stop but should have been no_parity as per MODBUS standards - OS: ANALOGUE_OUTPUT now includes an INVERTPWM parameter, so fAnOut 0.0 means maximum. - VM: added support for OBLCD_HGraph, OBLCD_CursorOff, OBLCD_CursorOn, OBLCD_CursorBlink. These also work over Xwire, both as master and as slave. - VM: suspend and resume were using little endian rather than big endian, never caused a problem, only a train spotter would notice. - VM: UVtoNV wasn't working right as it was ignoring the "offset", so now modified for use in ARM meaning V must be explicitly set, it won't use NVRecLen to allow for a more flexible instruction. - VM: added generic module for driving outputs as either analogue or digital - VM: If the first output in a call to OutputM didn't exist the controller would correctly reset but incorrectly not report the error to SPLat/PC. - STM32: created PWM measurement driver - Added SPxPoll1 function to LCD VM so it could: - Read a character from the LCD buffer at a nominated position; - Read the current brightness (also available via the CPU). - Also added macro paste commands to the utilities. - Added SPxCmd2 command to write a byte to a specified LCD buffer location. Command format is SPxCmd2 2,address with U[0]=offset and U[1]=byte. - Utils: Added 32-bit version of bit reversal code just to complete the set. (There was a gap between 16 and 64 bits.) - Implemented SPx command (Cmd4, specifically) to set any random baud rate on any port - The command number is the physical port number and U[0..3] is the baud rate as a float. - SetCursor or SetCursorYX now outputs the new position to the display immediately if the cursor is on. - (System/VM): Added new function to enable setting just the receive call-back function. - System: Added new allowable baud rate value of 15626 (offset 13), specifically for the RFID device. - (System) Increased U part of UV register array from 21 bytes to 251. - Added code to implement OBLCD_GetCurYX - SetCursor or SetCursorYX now outputs the new position to the display immediately if the cursor is on. - Added framework code behind the SPiceX calls: SPiceConfigU, SPxTxfrU and SPxMode. - SPLat/OS: Modified LCD driver code to minimise the chance of multiple threads writing to the LCD at the same time. - SPLat/OS LCD Driver Update: - Changed order of LCD initialisation to ensure the buffer is cleared after the CGRAM is set. - Moved 50us delay into LCD_vWriteByte to ensure every command includes an appropriate delay. - (System) Implemented signed version of byte-sized display routines (OBLCD_SDecDispMFW, OBLCD_SDecDispMVW, OBLCD_SDecDispXFW and OBLCD_SDecDispXVW) - System Firmware for 32-Bit: Changed 256-instruction limit to be 1024 instructions, as the 32-bit code is about 10 times faster than the 8-bit code where this limitation was introduced. - System: SPxCPU: Changed SPxTxfrU instruction to a SPxChOut instruction. Load U with the data, V with the length, then issue a CPU SPxChOut command with code 0 for 16 bits and 1 for 24 bits. Results start at U[1] - (System) Added magnitude checking when sending the LSB of an analog value over SEXI ========== == V4.4 == ========== 12 Feb 2016 - SX10508: The RS485 port may be used for logging ASCII/Binary data rather than just Xwire. The default app will use the RS485 port for this data if link J1 is removed. - SX10508: added the ability to write the RTC cal anytime. - SX10508: Enabled code protection.