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.

[参考译文] TMS320F28384D:McBSP 在设置 Tx 值之前发送3个前导0位

Guru**** 2386610 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1131343/tms320f28384d-mcbsp-transmits-3-leading-0-bits-prior-to-set-tx-values

器件型号:TMS320F28384D

我在设置配置中找不到任何原因导致这种情况。 有什么想法吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    David、

    我不知道发生这种情况的原因。  是否可以共享您的设置/使用代码供我查看?

    最棒的

    Matthew

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    void InitMcbspb(void)
       {
       // McBSP-B register settings
    
       McbspbRegs.SPCR2.all=0x0000;     // Reset FS generator, sample rate generator & transmitter
       McbspbRegs.SPCR1.all=0x0000;     // Reset Receiver, Right justify word
       //Loopback mode does not apply here
       //McbspbRegs.SPCR1.bit.DLB = 1;  // Enable loopback mode for test. Comment out for normal McBSP transfer mode.
    
    
       McbspbRegs.MFFINT.all=0x0;           // Disable all interrupts
    
       McbspbRegs.RCR1.all=0x0;
       McbspbRegs.RCR2.all=0x0;         // Single-phase frame, No companding (Receive)
       McbspbRegs.RCR1.bit.RFRLEN1 = MCBSP_RECEIVE_FRAME_LENGTH(McBSPNumRxWords);
       McbspbRegs.RCR2.bit.RDATDLY = MCBSP_0_BIT_DELAY;
       //McbspbRegs.RCR2.bit.RFIG    = 1; //Ignore incoming frame-sync pulses (the FPGA only sends one for the whole packet)
    
       McbspbRegs.XCR1.all=0x0;
       McbspbRegs.XCR2.all=0x0;         // Single-phase frame, No companding (Transmit)
       McbspbRegs.XCR1.bit.XFRLEN1 = MCBSP_TRANSMIT_FRAME_LENGTH(McBSPNumTxWords);
       McbspbRegs.XCR2.bit.XDATDLY = MCBSP_0_BIT_DELAY;
    
       InitMcbspb16bit();         //Sets RCR1.bit.RWDLEN1 and XCR1.bit.XWDLEN1
    
       McbspbRegs.PCR.bit.FSXM     = MCBSP_INTERNAL_TX_FRAME_SYNC;       // FSX generated internally, FSR derived from an external source
       McbspbRegs.PCR.bit.CLKXM    = MCBSP_INTERNAL_TX_CLK;              // CLK-TX is driven by the sample rate generator clock
       McbspbRegs.PCR.bit.CLKRM    = MCBSP_INTERNAL_RX_CLK;              // CLK-RX is driven by the sample rate generator clock
       McbspbRegs.PCR.bit.CLKXP    = MCBSP_TX_DATA_UPDATE_ON_FALLING;    // TX data clocked on falling edges (should be sampled on rising)
       McbspbRegs.PCR.bit.CLKRP    = MCBSP_RX_SAMPLED_ON_FALLING;        // RX data sampled on falling edges
    
       //CLKSM=1 and SCLKME=0 defines the sample-rate-generator based on the internal sample rate generator
       McbspbRegs.PCR.bit.SCLKME   = 0;
       McbspbRegs.SRGR2.bit.CLKSM  = MCBSP_SAMPLE_RATE_GENERATOR_LSPCLK;
    
       McbspbRegs.SRGR2.bit.FPER   = MCBSP_FRAME_SYNC_PERIOD(16);        // FPER = 16 bits plus 1 FS bit
       McbspbRegs.SRGR1.bit.FWID   = MCBSP_FRAME_SYNC_PULSE_WIDTH(1);    // Frame Width = 1 CLKG period
       McbspbRegs.SRGR1.bit.CLKGDV = MCBSP_CLOCK_DIVIDE(McBSPClockDivider);// CLKG frequency = LSPCLK/(x) (or SYSCLKOUT/{x*4})
    
       //For debug: stop the McBSP clock on emulator halt:
       McbspbRegs.SPCR2.bit.FREE   = 0;                                  //Stop the clock on breakpoint halt
       McbspbRegs.SPCR2.bit.SOFT   = 0;                                  //And don't finish the word
    
       delay_loop();                    // Wait at least 2 SRG clock cycles
       McbspbRegs.SPCR2.bit.GRST=1;     // Enable the sample rate generator
       clkg_delay_loop();               // Wait at least 2 CLKG cycles
       McbspbRegs.SPCR2.bit.XRST=1;     // Release TX from Reset
       McbspbRegs.SPCR1.bit.RRST=1;     // Release RX from Reset
       McbspbRegs.SPCR2.bit.FRST=1;     // Frame Sync Generator reset
    
       //Connect DMA channel 5 to McBSPA receive:
       DMACH5AddrConfig((U16 *)&McBSPRxDataUInt[0], (U16*)&McbspbRegs.DRR1.all);
    
       EALLOW;
       //The inner-loop is the burst per trigger:
       DMA5_WRITE_BURST_SIZE(1);                    //One "DATASIZE" value at a time
       DMA5_WRITE_SRC_BURST_STEP(0);                //The transfer-loop will increment
       DMA5_WRITE_DST_BURST_STEP(0);                //All transmissions written to a single address (no increment)
    
       //The outer-loop transfers a total of BURST_SIZE * TRANSFER_SIZE words.
       DMA5_WRITE_TRANSFER_SIZE(McBSPNumRxWords);   //Number of transfers of 1 word(burst) at a time
       DMA5_WRITE_SRC_TRANSFER_STEP(0);             //Source address does not change
       DMA5_WRITE_DST_TRANSFER_STEP(1);             //1 word increment after each 1-word received
    
       DMA5_WRITE_SOURCE_WRAP_SIZE(0xFFFF);         // Wrap disabled
       DMA5_WRITE_SOURCE_WRAP_STEP(0xFFFF);         // Wrap disabled
       DMA5_WRITE_DST_WRAP_SIZE(0xFFFF);            // Wrap disabled
       DMA5_WRITE_DST_WRAP_STEP(0xFFFF);            // Wrap disabled
    
       // Set up MODE Register:
       DmaClaSrcSelRegs.DMACHSRCSEL2.bit.CH5 = DMA_MREVTB;   // Triggered by DMA_MREVTB
       DmaRegs.CH5.MODE.bit.PERINTSEL   = 5;                 // DMA channel 5
       DmaRegs.CH5.MODE.bit.CHINTE      = CHINT_DISABLE;     // No Transfer-complete interrupt
       DmaRegs.CH5.MODE.bit.DATASIZE    = SIXTEEN_BIT;       // 16-bit data size transfers
       DmaRegs.CH5.MODE.bit.CONTINUOUS  = CONT_DISABLE;      // Channel is disabled after transfer is complete
       DmaRegs.CH5.MODE.bit.ONESHOT     = ONESHOT_DISABLE;   // Oneshot disabled (One burst per event)
       DmaRegs.CH5.MODE.bit.CHINTMODE   = CHINT_END;         // Generate interrupt to CPU at end of transfer
       DmaRegs.CH5.MODE.bit.PERINTE     = PERINT_ENABLE;     // Peripheral interrupt enable
       DmaRegs.CH5.MODE.bit.OVRINTE     = OVERFLOW_DISABLE;  // Disable the overflow interrupt
    
       // Clear any spurious flags:
       DmaRegs.CH5.CONTROL.bit.PERINTCLR = 1;       // Clear any spurious interrupt flags
       DmaRegs.CH5.CONTROL.bit.ERRCLR    = 1;       // Clear any spurious sync error flags
    
       EDIS;
       StartDMACH5();                               //The transfer starts when the event/interrupt occurs:
       //When the McBSP receives a word, it generates the REVT events to the DMA-engine, which reads the word.
       //It is assumed the transfer is complete by the end of the HSL.
    
    
       //Connect DMA channel 6 to McBSPB transmit:
       DMACH6AddrConfig((U16*)&McbspbRegs.DXR1.all, (U16 *)&McBSPTxDataUInt[0]);
    
       EALLOW;
       //The inner-loop is the burst per trigger:
       DMA6_WRITE_BURST_SIZE(1);                    //One "DATASIZE" value at a time
       DMA6_WRITE_SRC_BURST_STEP(0);                //The transfer-loop will increment
       DMA6_WRITE_DST_BURST_STEP(0);                //All transmissions written to a single address (no increment)
    
       //The outer-loop transfers a total of BURST_SIZE * TRANSFER_SIZE words.
       DMA6_WRITE_TRANSFER_SIZE(McBSPNumTxWords);   //Number of transfers of 1 word(burst) at a time
       DMA6_WRITE_SRC_TRANSFER_STEP(1);             //1 word increment after each 1-word transmitted
       DMA6_WRITE_DST_TRANSFER_STEP(0);             //Destination address does not change
    
       DMA6_WRITE_SOURCE_WRAP_SIZE(0xFFFF);         // Wrap disabled
       DMA6_WRITE_SOURCE_WRAP_STEP(0xFFFF);         // Wrap disabled
       DMA6_WRITE_DST_WRAP_SIZE(0xFFFF);            // Wrap disabled
       DMA6_WRITE_DST_WRAP_STEP(0xFFFF);            // Wrap disabled
    
       // Set up MODE Register:
       DmaClaSrcSelRegs.DMACHSRCSEL2.bit.CH6 = DMA_MXEVTB;   // Triggered by DMA_MXEVTB
       DmaRegs.CH6.MODE.bit.PERINTSEL   = 6;                 // DMA channel 6
       DmaRegs.CH6.MODE.bit.CHINTE      = CHINT_DISABLE;     // No Transfer-complete interrupt
       DmaRegs.CH6.MODE.bit.DATASIZE    = SIXTEEN_BIT;       // 16-bit data size transfers
       DmaRegs.CH6.MODE.bit.CONTINUOUS  = CONT_DISABLE;      // Channel is disabled after transfer is complete
       DmaRegs.CH6.MODE.bit.ONESHOT     = ONESHOT_DISABLE;   // Oneshot disabled (One burst per event)
       DmaRegs.CH6.MODE.bit.CHINTMODE   = CHINT_END;         // Generate interrupt to CPU at end of transfer
       DmaRegs.CH6.MODE.bit.PERINTE     = PERINT_ENABLE;     // Peripheral interrupt enable
       DmaRegs.CH6.MODE.bit.OVRINTE     = OVERFLOW_DISABLE;  // Disable the overflow interrupt
    
       // Clear any spurious flags:
       DmaRegs.CH6.CONTROL.bit.PERINTCLR = 1;       // Clear any spurious interrupt flags
       DmaRegs.CH6.CONTROL.bit.ERRCLR    = 1;       // Clear any spurious sync error flags
    
       EDIS;
       StartDMACH6();                               //The transfer starts when the event/interrupt occurs:
       //Force an event (trigger) onto the DMA engine by calling DMA6_FORCE_TRIGGER(), which inserts an event into DMA6. Then
       //the McBSP transmit-register is written with the first array element. The McBSP produces an XEVT when XRDY is true,
       //which kicks off the next word-write. It is assumed the transfer is complete by the end of the HSL.
       }
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    David、

    我将于明天在办公室外回复我的 PC/EVM 访问受限。

    最棒的

    Matthew  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    David、

    您是否可以尝试从 CPU 直接写入 McbspaRegs.DXR1寄存器而不是使用 DMA、并注意如果行为不同?  我想看看 DMA 是否在发挥作用。

    最棒的

    Matthew