Tool/software:
I am writing back as I have failed to resolve a critical data parsing issue despite trying standard alignment fixes. My setup uses Node.js for parsing data streamed from the Data Port based on the following configuration.
Please note: My application uses a custom Node.js parser and does not rely on any Python-based tools or GUIs from TI.
Summary of Persistent Problems:
-
TLV Chain Corruption (TLV 2 & 3):
-
TLVs 1, 6, 7, and 9 are received correctly.
-
When TLV 2 (Range Profile) and/or TLV 3 (Noise Profile) are included (e.g.,
guiMonitor -1 1 1 1 0 0 1), the next TLV header (Type and Length) is always corrupted, resulting in nonsensical values (e.g., 143525728). -
I have attempted the two most common solutions:
-
Applying 4-byte and 8-byte boundary alignment after consuming the
tlv.lengthin the main loop (processBuffer). -
Testing 4-byte stepping inside the
parseRangeProfileandparseNoiseProfilefunctions (assuming 2-byte data + 2-byte padding per point).
-
-
All alignment solutions failed, leading me to believe the issue is deeply rooted in the protocol's definition under this specific configuration.
-
-
TLV 4, 5, and 8 Transmission Failure:
-
When attempting to request TLV 4 (Azimuth Static Heatmap), 5 (Range-Doppler Heatmap), or 8 (Azimuth/Elevation Static Heatmap) by setting the corresponding
guiMonitorarguments to 1, the sensor completely stops transmitting any data (including the other working TLVs).
-
Critical Questions:
-
TLV 2 and 3 Data Format/Alignment:
-
Given the persistent misalignment, can you confirm the exact alignment rule for the end of the Range Profile (TLV 2) and Noise Profile (TLV 3) data blocks?
-
Is the internal structure of these TLVs strictly contiguous 2-byte data points or are the points individually padded to a 4-byte or 8-byte boundary?
-
-
TLV 4, 5, and 8 Configuration Requirements:
-
Why does requesting TLV 4, 5, or 8 lead to a complete halt in data transmission?
-
Is a specific configuration command (e.g., related to
adcbufCfg, BPM, or a differentchannelCfg) missing or incorrect in mystartCommandslist, which is required to enable the computation of these heatmap TLVs?
-
- When parsing the TLV header, the type and length are obtained. Does the length include the TLV header itself?
I referred to the datasheet at https://dev.ti.com/tirex/explore/node?node=A__AaagUFIod1NcG0sE-noAfw__radar_toolbox__1AslXXD__LATEST and believe I mapped it correctly, but just in case, I’m including my implementation here.
startCommands = [
'sensorStop',
'flushCfg',
'dfeDataOutputMode 1',
'channelCfg 15 5 0',
'adcCfg 2 1',
'adcbufCfg -1 0 1 1 1',
'profileCfg 0 60 567 7 57.14 0 0 70 1 256 5209 0 0 158',
'chirpCfg 0 0 0 0 0 0 0 1',
'chirpCfg 1 1 0 0 0 0 0 4',
'frameCfg 0 1 16 0 100 1 0',
'lowPower 0 0',
'guiMonitor -1 1 1 1 0 0 1',
'cfarCfg -1 0 2 8 4 3 0 15 1',
'cfarCfg -1 1 0 4 2 3 1 15 1',
'multiObjBeamForming -1 1 0.5',
'clutterRemoval -1 0',
'calibDcRangeSig -1 0 -5 8 256',
'extendedMaxVelocity -1 0',
'bpmCfg -1 0 0 1',
'lvdsStreamCfg -1 0 0 0',
'compRangeBiasAndRxChanPhase 0.0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0',
'measureRangeBiasAndRxChanPhase 0 1.5 0.2',
'CQRxSatMonitor 0 3 5 121 0',
'CQSigImgMonitor 0 127 4',
'analogMonitor 0 0',
'aoaFovCfg -1 -90 90 -90 90',
'cfarFovCfg -1 0 0 8.92',
'cfarFovCfg -1 1 -1 1.00',
'calibData 0 0 0',
'sensorStart'
]
// TLV type 2 - Range Profile.
function parseRangeProfile(buffer, offset, length) {
if (length % 2 !== 0) {
console.warn('TLV type 2, Range Profile length is not multiple of 2, skipping parsing')
return []
}
const numPoints = length / 2
const profile = new Array(numPoints)
for (let i = 0; i < numPoints; i++) {
const base = offset + i * 2
const raw = buffer.readUInt16LE(base)
profile[i] = raw / 512.0
}
return profile
}
// TLV type 3 - Noise Profile.
function parseNoiseProfile(buffer, offset, length) {
if (length % 2 !== 0) {
console.warn('TLV type 3, Noise Profile length is not multiple of 2, skipping parsing')
return []
}
const numPoints = length / 2
const profile = new Array(numPoints)
for (let i = 0; i < numPoints; i++) {
const base = offset + i * 2
const raw = buffer.readUInt16LE(base)
profile[i] = raw / 512.0
}
return profile
}
// TLV type 4 - Azimuth Static Heatmap.
function parseAzimuthStaticHeatmap(buffer, offset, length) {
const numRangeBins = 256
const numVirtualAntAzim = 8
if (length !== numRangeBins * numVirtualAntAzim * 4) {
console.warn('TLV type 4, Azimuth Static Heatmap length mismatch, skipping parsing')
return []
}
const heatmap = []
for (let r = 0; r < numRangeBins; r++) {
const row = []
for (let a = 0; a < numVirtualAntAzim; a++) {
const base = offset + 4 * (r * numVirtualAntAzim + a)
const imag = buffer.readInt16LE(base)
const real = buffer.readInt16LE(base + 2)
row.push({ real, imag })
}
heatmap.push(row)
}
return heatmap
}
// TLV type 5 - Range-Doppler Heatmap.
function parseRangeDopplerHeatmap(buffer, offset, length) {
const numRangeBins = 256
const numDopplerBins = 16
if (length !== numRangeBins * numDopplerBins * 2) {
console.warn('TLV type 5, Range-Doppler Heatmap length mismatch, skipping parsing')
return []
}
const heatmap = []
for (let r = 0; r < numRangeBins; r++) {
const row = []
for (let d = 0; d < numDopplerBins; d++) {
const base = offset + 2 * (r * numDopplerBins + d)
const raw = buffer.readUInt16LE(base)
row.push(raw / 512.0)
}
heatmap.push(row)
}
return heatmap
}
// TLV type 8 - Azimuth/Elevation Static Heatmap.
function parseAzimuthElevationStaticHeatmap(buffer, offset, length) {
const numRangeBins = 256
const numVirtualAntennas = 12
if (length !== numRangeBins * numVirtualAntennas * 4) {
console.warn('TLV type 8, Azimuth/Elevation Static Heatmap length mismatch, skipping parsing')
return []
}
const heatmap = []
for (let r = 0; r < numRangeBins; r++) {
const row = []
for (let a = 0; a < numVirtualAntennas; a++) {
const base = offset + 4 * (r * numVirtualAntennas + a)
const imag = buffer.readInt16LE(base)
const real = buffer.readInt16LE(base + 2)
row.push({ real, imag })
}
heatmap.push(row)
}
return heatmap
}
Thank you for providing a technical answer to these protocol-level questions.










