This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AWR1243: Sequencing of 3 frames

Anonymous
Anonymous
Guru 17045 points
Part Number: AWR1243

Hi,

We'd like to sequence the following chirp configuration in a cascaded AWR1243P design:

CHIRP1 x 512 TX0-MASTER ------> CHIRP2 x 512 TX1-SLAVE -----> CHIRP3 x 512 TX2-SLAVE

For example, master chirp configuration looks like:

if(deviceMap == 1U) 

{ 
setChirpCfgArgs[0].chirpStartIdx = 0; 
setChirpCfgArgs[0].chirpEndIdx = 1; 
setChirpCfgArgs[0].profileId = 0; 
setChirpCfgArgs[0].startFreqVar = 0; 
setChirpCfgArgs[0].freqSlopeVar = freqSlopeVar; 
setChirpCfgArgs[0].idleTimeVar = idleTimeVar; 
setChirpCfgArgs[0].adcStartTimeVar = adcStartTimeVar; 
setChirpCfgArgs[0].txEnable = 1U; 

setChirpCfgArgs[1].chirpStartIdx = 1; 
setChirpCfgArgs[1].chirpEndIdx = 2; 
setChirpCfgArgs[1].profileId = 0; 
setChirpCfgArgs[1].startFreqVar = 0; 
setChirpCfgArgs[1].freqSlopeVar = freqSlopeVar; 
setChirpCfgArgs[1].idleTimeVar = idleTimeVar; 
setChirpCfgArgs[1].adcStartTimeVar = adcStartTimeVar; 
setChirpCfgArgs[1].txEnable = 1U;

setChirpCfgArgs[2].chirpStartIdx = 2; 
setChirpCfgArgs[2].chirpEndIdx = 3; 
setChirpCfgArgs[2].profileId = 0; 
setChirpCfgArgs[2].startFreqVar = 0; 
setChirpCfgArgs[2].freqSlopeVar = freqSlopeVar; 
setChirpCfgArgs[2].idleTimeVar = idleTimeVar; 
setChirpCfgArgs[2].adcStartTimeVar = adcStartTimeVar; 
setChirpCfgArgs[2].txEnable = 0U; 

setChirpCfgArgs[3].chirpStartIdx = 3; 
setChirpCfgArgs[3].chirpEndIdx = 4; 
setChirpCfgArgs[3].profileId = 0; 
setChirpCfgArgs[3].startFreqVar = 0; 
setChirpCfgArgs[3].freqSlopeVar = freqSlopeVar; 
setChirpCfgArgs[3].idleTimeVar = idleTimeVar; 
setChirpCfgArgs[3].adcStartTimeVar = adcStartTimeVar; 
setChirpCfgArgs[3].txEnable = 0U; 

setChirpCfgArgs[4].chirpStartIdx = 4; 
setChirpCfgArgs[4].chirpEndIdx = 5; 
setChirpCfgArgs[4].profileId = 0; 
setChirpCfgArgs[4].startFreqVar = 0; 
setChirpCfgArgs[4].freqSlopeVar = freqSlopeVar; 
setChirpCfgArgs[4].idleTimeVar = idleTimeVar; 
setChirpCfgArgs[4].adcStartTimeVar = adcStartTimeVar; 
setChirpCfgArgs[4].txEnable = 0U; 

setChirpCfgArgs[5].chirpStartIdx = 5; 
setChirpCfgArgs[5].chirpEndIdx = 6; 
setChirpCfgArgs[5].profileId = 0; 
setChirpCfgArgs[5].startFreqVar = 0; 
setChirpCfgArgs[5].freqSlopeVar = freqSlopeVar; 
setChirpCfgArgs[5].idleTimeVar = idleTimeVar; 
setChirpCfgArgs[5].adcStartTimeVar = adcStartTimeVar; 
setChirpCfgArgs[5].txEnable = 0U

We have followed the advFrameCfg API where we loop 255 times every 2 unique -but identical- chirps. We are checking the LVDS valid signal (pin N14) but we only see the first subframe.

subFrameCfgArgs[0].forceProfileIdx = 0;

	subFrameCfgArgs[0].chirpStartIdx = 0;

	subFrameCfgArgs[0].numOfChirps = 2;

	subFrameCfgArgs[0].numLoops = 255;

	subFrameCfgArgs[0].burstPeriodicity = burstPeriodicity;

	subFrameCfgArgs[0].chirpStartIdxOffset = 0;

	subFrameCfgArgs[0].numOfBurst = 1;

	subFrameCfgArgs[0].numOfBurstLoops = 1;

	subFrameCfgArgs[0].subFramePeriodicity = subFramePeriodicity;



	subFrameCfgArgs[1].forceProfileIdx = 0;

	subFrameCfgArgs[1].chirpStartIdx = 2;

	subFrameCfgArgs[1].numOfChirps = 2;

	subFrameCfgArgs[1].numLoops = 255;

	subFrameCfgArgs[1].burstPeriodicity = burstPeriodicity;

	subFrameCfgArgs[1].chirpStartIdxOffset = 0;

	subFrameCfgArgs[1].numOfBurst = 1;

	subFrameCfgArgs[1].numOfBurstLoops = 1;

	subFrameCfgArgs[1].subFramePeriodicity = subFramePeriodicity;



	subFrameCfgArgs[2].forceProfileIdx = 0;

	subFrameCfgArgs[2].chirpStartIdx = 4;

	subFrameCfgArgs[2].numOfChirps = 2;

	subFrameCfgArgs[2].numLoops = 255;

	subFrameCfgArgs[2].burstPeriodicity = burstPeriodicity;

	subFrameCfgArgs[2].chirpStartIdxOffset = 0;

	subFrameCfgArgs[2].numOfBurst = 1;

	subFrameCfgArgs[2].numOfBurstLoops = 1;

	subFrameCfgArgs[2].subFramePeriodicity = subFramePeriodicity;

Is there any better approach to achieve that?

Thanks in advance.

M.

  • Hello,

    I assume you want to trigger frame from one device at a time (either master or slave)??

    In that case you need to turn off Tx for that duration from that specific device so only one will transmit at the moment.

     

    Regards,

    Jitendra

  • Anonymous
    0 Anonymous in reply to Jitendra Gupta

    Hi,

    Aren't we achieving that with txEnable = 0 ? Refer to chirp configurations 2 to 5 in our code snippet. txEnable is set to 0. Slave's chirp configurations 2 to 5 then employ different txEnable.

    What about the LVDS valid signal? why we do not get it active during slave chirpping? We can still see on the spectrum analyzer that the device is employing all TX antennas.

    Thanks

  • Anonymous
    0 Anonymous in reply to Anonymous

    Hi,

    any update on that?

    Thanks.

  • Hello,

    I don't get a full picture of your issue.

    So you are saying that from Slave you don't get LVDS data? 

    Do you observe spectrum with the device during the time when Tx off frame is running?

     

    Regards,

    Jitendra

  • Anonymous
    0 Anonymous in reply to Jitendra Gupta

    Hi,

    we want to make the following chirp configuration

    MASTER TX0 -> SLAVE TX1 -> SLAVE TX2 -> MASTER TX0 ...

    Meaning one chip at a time. We need 512 chirps per subframe. This is the solution we opted for:

    if(deviceMap == 1U)
    
    		{
    
    			setChirpCfgArgs[0].chirpStartIdx = 0;
    
    			setChirpCfgArgs[0].chirpEndIdx = 1;
    
    			setChirpCfgArgs[0].profileId = 0;
    
    			setChirpCfgArgs[0].startFreqVar = 0;
    
    			setChirpCfgArgs[0].freqSlopeVar = freqSlopeVar;
    
    			setChirpCfgArgs[0].idleTimeVar = idleTimeVar;
    
    			setChirpCfgArgs[0].adcStartTimeVar = adcStartTimeVar;
    
    			setChirpCfgArgs[0].txEnable = 1U;
    
    
    
    			setChirpCfgArgs[1].chirpStartIdx = 1;
    
    			setChirpCfgArgs[1].chirpEndIdx = 2;
    
    			setChirpCfgArgs[1].profileId = 0;
    
    			setChirpCfgArgs[1].startFreqVar = 0;
    
    			setChirpCfgArgs[1].freqSlopeVar = freqSlopeVar;
    
    			setChirpCfgArgs[1].idleTimeVar = idleTimeVar;
    
    			setChirpCfgArgs[1].adcStartTimeVar = adcStartTimeVar;
    
    			setChirpCfgArgs[1].txEnable = 1U;
    
    
    
    			setChirpCfgArgs[2].chirpStartIdx = 2;
    
    			setChirpCfgArgs[2].chirpEndIdx = 3;
    
    			setChirpCfgArgs[2].profileId = 0;
    
    			setChirpCfgArgs[2].startFreqVar = 0;
    
    			setChirpCfgArgs[2].freqSlopeVar = freqSlopeVar;
    
    			setChirpCfgArgs[2].idleTimeVar = idleTimeVar;
    
    			setChirpCfgArgs[2].adcStartTimeVar = adcStartTimeVar;
    
    			setChirpCfgArgs[2].txEnable = 0U;
    
    
    
    			setChirpCfgArgs[3].chirpStartIdx = 3;
    
    			setChirpCfgArgs[3].chirpEndIdx = 4;
    
    			setChirpCfgArgs[3].profileId = 0;
    
    			setChirpCfgArgs[3].startFreqVar = 0;
    
    			setChirpCfgArgs[3].freqSlopeVar = freqSlopeVar;
    
    			setChirpCfgArgs[3].idleTimeVar = idleTimeVar;
    
    			setChirpCfgArgs[3].adcStartTimeVar = adcStartTimeVar;
    
    			setChirpCfgArgs[3].txEnable = 0U;
    
    
    
    			setChirpCfgArgs[4].chirpStartIdx = 4;
    
    			setChirpCfgArgs[4].chirpEndIdx = 5;
    
    			setChirpCfgArgs[4].profileId = 0;
    
    			setChirpCfgArgs[4].startFreqVar = 0;
    
    			setChirpCfgArgs[4].freqSlopeVar = freqSlopeVar;
    
    			setChirpCfgArgs[4].idleTimeVar = idleTimeVar;
    
    			setChirpCfgArgs[4].adcStartTimeVar = adcStartTimeVar;
    
    			setChirpCfgArgs[4].txEnable = 0U;
    
    
    
    			setChirpCfgArgs[5].chirpStartIdx = 5;
    
    			setChirpCfgArgs[5].chirpEndIdx = 6;
    
    			setChirpCfgArgs[5].profileId = 0;
    
    			setChirpCfgArgs[5].startFreqVar = 0;
    
    			setChirpCfgArgs[5].freqSlopeVar = freqSlopeVar;
    
    			setChirpCfgArgs[5].idleTimeVar = idleTimeVar;
    
    			setChirpCfgArgs[5].adcStartTimeVar = adcStartTimeVar;
    
    			setChirpCfgArgs[5].txEnable = 0U;
    
    
    
    		} else {
    
    
    
    			setChirpCfgArgs[0].chirpStartIdx = 0;
    
    			setChirpCfgArgs[0].chirpEndIdx = 1;
    
    			setChirpCfgArgs[0].profileId = 0;
    
    			setChirpCfgArgs[0].startFreqVar = 0;
    
    			setChirpCfgArgs[0].freqSlopeVar = freqSlopeVar;
    
    			setChirpCfgArgs[0].idleTimeVar = idleTimeVar;
    
    			setChirpCfgArgs[0].adcStartTimeVar = adcStartTimeVar;
    
    			setChirpCfgArgs[0].txEnable = 0U;
    
    
    
    			setChirpCfgArgs[1].chirpStartIdx = 1;
    
    			setChirpCfgArgs[1].chirpEndIdx = 2;
    
    			setChirpCfgArgs[1].profileId = 0;
    
    			setChirpCfgArgs[1].startFreqVar = 0;
    
    			setChirpCfgArgs[1].freqSlopeVar = freqSlopeVar;
    
    			setChirpCfgArgs[1].idleTimeVar = idleTimeVar;
    
    			setChirpCfgArgs[1].adcStartTimeVar = adcStartTimeVar;
    
    			setChirpCfgArgs[1].txEnable = 0U;
    
    
    
    			setChirpCfgArgs[2].chirpStartIdx = 2;
    
    			setChirpCfgArgs[2].chirpEndIdx = 3;
    
    			setChirpCfgArgs[2].profileId = 0;
    
    			setChirpCfgArgs[2].startFreqVar = 0;
    
    			setChirpCfgArgs[2].freqSlopeVar = freqSlopeVar;
    
    			setChirpCfgArgs[2].idleTimeVar = idleTimeVar;
    
    			setChirpCfgArgs[2].adcStartTimeVar = adcStartTimeVar;
    
    			setChirpCfgArgs[2].txEnable = 2U;
    
    
    
    			setChirpCfgArgs[3].chirpStartIdx = 3;
    
    			setChirpCfgArgs[3].chirpEndIdx = 4;
    
    			setChirpCfgArgs[3].profileId = 0;
    
    			setChirpCfgArgs[3].startFreqVar = 0;
    
    			setChirpCfgArgs[3].freqSlopeVar = freqSlopeVar;
    
    			setChirpCfgArgs[3].idleTimeVar = idleTimeVar;
    
    			setChirpCfgArgs[3].adcStartTimeVar = adcStartTimeVar;
    
    			setChirpCfgArgs[3].txEnable = 2U;
    
    
    
    			setChirpCfgArgs[4].chirpStartIdx = 4;
    
    			setChirpCfgArgs[4].chirpEndIdx = 5;
    
    			setChirpCfgArgs[4].profileId = 0;
    
    			setChirpCfgArgs[4].startFreqVar = 0;
    
    			setChirpCfgArgs[4].freqSlopeVar = freqSlopeVar;
    
    			setChirpCfgArgs[4].idleTimeVar = idleTimeVar;
    
    			setChirpCfgArgs[4].adcStartTimeVar = adcStartTimeVar;
    
    			setChirpCfgArgs[4].txEnable = 4U;
    
    
    
    			setChirpCfgArgs[5].chirpStartIdx = 5;
    
    			setChirpCfgArgs[5].chirpEndIdx = 6;
    
    			setChirpCfgArgs[5].profileId = 0;
    
    			setChirpCfgArgs[5].startFreqVar = 0;
    
    			setChirpCfgArgs[5].freqSlopeVar = freqSlopeVar;
    
    			setChirpCfgArgs[5].idleTimeVar = idleTimeVar;
    
    			setChirpCfgArgs[5].adcStartTimeVar = adcStartTimeVar;
    
    			setChirpCfgArgs[5].txEnable = 4U;
    
    		}

    the reason two chirps are duplicated is because numLoops is limited to 255, so we could not find a better solution for that:

    subFrameCfgArgs[0].forceProfileIdx = 0;
    
    	subFrameCfgArgs[0].chirpStartIdx = 0;
    
    	subFrameCfgArgs[0].numOfChirps = 2;
    
    	subFrameCfgArgs[0].numLoops = 255;
    
    	subFrameCfgArgs[0].burstPeriodicity = burstPeriodicity;
    
    	subFrameCfgArgs[0].chirpStartIdxOffset = 0;
    
    	subFrameCfgArgs[0].numOfBurst = 1;
    
    	subFrameCfgArgs[0].numOfBurstLoops = 1;
    
    	subFrameCfgArgs[0].subFramePeriodicity = subFramePeriodicity;
    
    
    
    	subFrameDataCfgArgs[0].totalChirps = chirpEndIdx+1;
    
    	subFrameDataCfgArgs[0].numChirpsInDataPacket = 1;
    
    
    
    	subFrameCfgArgs[1].forceProfileIdx = 0;
    
    	subFrameCfgArgs[1].chirpStartIdx = 2;
    
    	subFrameCfgArgs[1].numOfChirps = 2;
    
    	subFrameCfgArgs[1].numLoops = 255;
    
    	subFrameCfgArgs[1].burstPeriodicity = burstPeriodicity;
    
    	subFrameCfgArgs[1].chirpStartIdxOffset = 0;
    
    	subFrameCfgArgs[1].numOfBurst = 1;
    
    	subFrameCfgArgs[1].numOfBurstLoops = 1;
    
    	subFrameCfgArgs[1].subFramePeriodicity = subFramePeriodicity;
    
    
    
    	subFrameDataCfgArgs[1].totalChirps = chirpEndIdx+1;
    
    	subFrameDataCfgArgs[1].numChirpsInDataPacket = 1;
    
    
    
    	subFrameCfgArgs[2].forceProfileIdx = 0;
    
    	subFrameCfgArgs[2].chirpStartIdx = 4;
    
    	subFrameCfgArgs[2].numOfChirps = 2;
    
    	subFrameCfgArgs[2].numLoops = 255;
    
    	subFrameCfgArgs[2].burstPeriodicity = burstPeriodicity;
    
    	subFrameCfgArgs[2].chirpStartIdxOffset = 0;
    
    	subFrameCfgArgs[2].numOfBurst = 1;
    
    	subFrameCfgArgs[2].numOfBurstLoops = 1;
    
    	subFrameCfgArgs[2].subFramePeriodicity = subFramePeriodicity;

    However, when checking LVDS valid (pin N4) on master we see a burst corresponding to subFrameCfgArgs[0], but not [1] or [2] which suggests to us that slave is not chirping.

    Thanks.

    Mario

  • Anonymous
    0 Anonymous in reply to Anonymous

    Hi again,

    going back to a more fundamental question: can we sequence 3 frames? or we have to rather use the advFrameConfig API methods to achieve the same results?

    I recall we want to employ Master TX0 during a some chirps and then Slave TX1 during some other chirps (not simultaneously but sequentially).

    Thanks

  • Anonymous
    0 Anonymous in reply to Anonymous

    Hi,

    any update on that?

    Thanks

  • When you state this sentence - 'However, when checking LVDS valid (pin N4) on master we see a burst corresponding to subFrameCfgArgs[0], but not [1] or [2] which suggests to us that slave is not chirping.'

    Did you check with SLAVE end the LVDS signal during subFrame?

    And hopefully you are configuring subFrameCfgArgs[0-2] to both Master and slave but with different set of setChirpCfgArgs?

     

    Regards,

    Jitendra

  • Anonymous
    0 Anonymous in reply to Jitendra Gupta

    Hi Jitendra,

    we believe we have found the issue(s).

    First of all, we believe we are not allowing for transfer time of CSI2/LVDS lanes. After some tunning of chirp duration and periodicities, we got more consistent LVDS valid signals.

    On the other side, we want 512 chirps per sub-frame. For that, the workaround we found was to loop 255 times a unique chirp and repeat the burst twice -> 510. Then totalChirps must be set accordingly to get a proper LVDS signal. However we are not happy with that approach. I recall we want 512 chirps using one TX antenna, 512 using another TX antenna and finally 512 chirps using the third available antenna. For this we have to define at least 3 unique chirps if I'm not mistaken.

    Any suggestions on how to get to 512 (instead of 510)?

    Thanks

  • Hello,

    Glad that you are able to get the correct LVDS signal.

    You need to have same no. of chirp in frameData.subframeDataCfg[x].totalChirps to get all the chirp data over CSI2/LVDS, that you did this time correctly.

    Now for your other question on Tx antenna based chirp config-

    If you need to use single Tx antenna for each chirp then you need to define 3 unique chirps where each chirp is enabled with specific single Tx antenna.

    However on the other hand, if you want to enable all 3 Tx under single chirp then in the chirpConfig you need to enable all 3 TXs and one unique chirp-config is enough.

    Please be noted that burst in advFrameConfig is equivalent to a frame (set of n chirps). If you want to have 512 chirp within one burst of specific sub-frame then frameSeq.subFrameCfg[x].chirpStartIdx = 0, numOfChirps =4, numLoops=128;   This combines [chirp0, chirp1, chirp2, chirp3] x 128 = 512 chirps.

    where chirp0-3 can be same or unique.

     

    Adding clarity to the original question:

    In the cascade setup even though you disable Tx antenna in the chirp config for Master/Slave, you would still get the CSI2/LVDS data from that device. There is no way to disable raw data streaming from Tx disabled device. At the Host end you can opt to ignore that device data. 

    Regards,

    Jitendra

  • Anonymous
    0 Anonymous in reply to Jitendra Gupta

    Great, thanks for your support!