请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TMS320F28384D 我在设置配置中找不到任何原因导致这种情况。 有什么想法吗?
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.
我在设置配置中找不到任何原因导致这种情况。 有什么想法吗?
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.
}