AWR2944EVM: Difference between HW and SW streaming, LVDS & DCA1000

Part Number: AWR2944EVM

Tool/software:

Hi,

Quick question: what is the difference between HW and SW LVDS streaming? The mmwdemo documentation states that HW refers to ADC data and SW may be configurable.

Anyway, if I wanted to transfer the L3 radar datacube using LVDS, would I have to use SW streaming? Is HW limited to the ADC only? Which is the recommended implementation and provides more bandwidth? I hear that SW streaming leaves 96 KB, then one would have to reset things.

Thanks,

Aaron

  • Hi Aaron,

    Sorry for the delay.  Someone from our team will assist you shortly.

    Regards,
    Sami

  • Hi Sami,

    Thanks for letting me know.

    Anyway, I have an update: seemed to get some sort of data through LVDS SW Streaming, but it's unintelligible. In my DCA1000-captured file, I expected my custom header and payload of int16's to appear, yet they did not.

    In mss_main.c of the AWR2944EVM OOB Demo TDM version 4.6, I managed to disable HW streaming by merely commenting out the areas that were relevant to it, leaving me only with the desired SW streaming capability.

    In the same file, I uncommented the MmwDemo_transferLVDSUserData function and changed it so that it didn't use the object detection results. I instead added a dummy int16 array of length 10 and filled it with 0s. I also changed the header (64 bits, right?) to just 1U for each. Later, I tried doing arrays of ten ones as well as [1,2,3,4,5,6,7,8,9,10]. Here is my very simple code for mss_main.c.

    int16_t fantasticArray[10];
        for(uint32_t i=0;i<10;i++){
            fantasticArray[i]=0;
    }
    ...
     if (MmwDemo_LVDSStreamSwConfig(dpcResults->numObjOut, fantasticArray) < 0)
     {
     ...
     gMmwMssMCB.lvdsStream.userDataHeader->frameNum  = 1U;
    gMmwMssMCB.lvdsStream.userDataHeader->detObjNum = 1U;
    gMmwMssMCB.lvdsStream.userDataHeader->subFrameNum  = (uint16_t) 1U;

    In mmw_lvds_stream.c, I merely did this (matched in the header file too):

    int32_t MmwDemo_LVDSStreamSwConfig (uint32_t numObjOut, int16_t fantasticArray[])
    {
    ...
     if(numObjOut != 0)
    {
        sessionCfg.u.swCfg.userBufferInfo[1].size    = HSIHeader_toCBUFFUnits(10 * sizeof(int16_t));
        sessionCfg.u.swCfg.userBufferInfo[1].address = (uint32_t)fantasticArray;
    }
    ...

    My OOB demo CLI config file:

    sensorStop
    flushCfg
    dfeDataOutputMode 1
    channelCfg 15 15 0
    adcCfg 2 0
    adcbufCfg -1 1 1 1 1
    lowPower 0 0
    profileCfg 0 77 267 7 57.14 0 0 70 1 560 11396 0 0 30
    chirpCfg 0 0 0 0 0 0 0 1
    chirpCfg 1 1 0 0 0 0 0 4
    chirpCfg 1 1 0 0 0 0 0 8
    chirpCfg 2 2 0 0 0 0 0 2
    frameCfg 0 2 16 20 560 100 1 0
    lowPower 0 0
    guiMonitor -1 1 1 0 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
    calibDcRangeSig -1 0 -5 8 256
    clutterRemoval -1 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 1 0 1 0 1 0 1 0
    measureRangeBiasAndRxChanPhase 0 1.5 0.2
    aoaFovCfg -1 -90 90 -90 90
    cfarFovCfg -1 0 0 19.53
    cfarFovCfg -1 1 -1 1.00
    extendedMaxVelocity -1 0
    calibData 0 0 0
    CQRxSatMonitor 0 3 11 121 0
    CQSigImgMonitor 0 127 8
    analogMonitor 0 0
    lvdsStreamCfg -1 1 1 1
    sensorStart

    I am pretty confident that something potentially meaningful (or at least consistent and replicable) was happening with the SW streaming because, using the Demo Visualizer, I saw that I captured 20 frames, and in my DCA1000 captured file (just using DCA1000 CLI provided with mmWave Studio), the same 128-bit pattern was repeated 10 times. Yet, the pattern didn't make any sense to me.While I expected the beginning to correspond to a uint32 "1", it instead was 12 int16 0's and a 1280. I am using MATLAB's fread(fn, 'int16') function.The only problem I can think of is that I am directly passing my array to the function, not a pointer to the array. But not sure. It seemed to me like there was a lot of 0 padding too, does SW streaming always pad to multiples of 128 or 256 bytes per frame?

    Below is the data I captured with a common header of 1U (uint32), 1U (uint16), 1U (uint16)

    zeros_raw_bits.txt: int16 array of ten 0s

    ones_raw_bits.txt: int16 array of ten 1s

    one_to_ten_raw_bits.txt: int16 array of 1 through 10.

    zeros_raw_bits.txt

    ones_raw_bits.txt

    one_to_ten_raw_bits.txt

    1. Could you let me know if I am outputting the data correctly?

    2. What is the correct way to parse the data, if I am doing it wrong? When I read in int16, why do I constantly see the numbers 2780, 3290, 2780, 3290, 240 at the beginning? What do the repeated 3855s mean at the end? What about -23131?

    3. Why is it that only 20 frames are collected? Is there a way to make the sensor go as long as I like, with the DCA1000 writing into new files when the current one reaches its size limit?

    My reference: https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/885225/awr1843-need-help-to-send-a-mount-of-data-through-lvds-when-using-mrr-demo-or-mmw-demo 

    Update 2: If no quick answer can be found to the above case about the test array, you may disregard it. I decided to abandon the idea of a test array and just put in the radarcube. I seem to be getting some of the data but not all of it. Rather than the pulses being spaced by the number of range bins (512), they are spaced by 300 something bins.
    1. My main question remains: is HW LVDS streaming possible with L3 datacube? Say I remove the detMatrix entirely. My goal is to stream range-compressed data while the data transmits and receives continuously, with no pauses and "interframe" period.

    2. Can you confirm that the data streaming limit per session is 32KB, and that I would have to start three sessions consecutively in order to output the maximum 96 KB? I would expect more throughput, considering the LVDS streaming capabilities of HW streaming.

    Thank you so much!!

  • Hello,

    It has been 9 days and I have received no reply. I will repeat my question in hopes that someone sees:

    Can I use HW LVDS streaming to stream the L3 range-compressed datacube in real time? Or am I restricted to SW streaming? I ask because I would like to minimize the interframe period and it would be great if samples could be streamed out as soon as they come in, which is how I understand HW streaming with ADCBUF to work.

    If I am restricted to SW streaming, what is the maximum throughput per call? 32 KB and only 3 lanes seems awfully small to me. It would be great if you could also explain the process for creating semaphores and calling again.

    Thanks,

    Aaron

  • Hi Aaron,

    Apologies for the delay, this query was missed out somehow. Let me check if we have any implementation like that, will get back to you by EOD tomorrow.

    Regards,

    Shruti

  • Hi Aaron,

    The HW or SW streaming depicted here corresponds to the HW or SW trigger mechanism used in a LVDS streaming session within the CBUFF driver.

    HW streaming is used to stream the raw ADC data via chirp interrupts and EDMA without any need for SW intervention. SW streaming can be used to send any custom data that the user wants (such as a radar cube after 1D/2D FFT or object data). We don't have any implementation like that as of now.

    HW streaming doesn't supports the custom data streaming. It can only be used to stream the raw ADC data.

    Regards,

    Shruti