问答

汇集网友智慧,解决技术难题

21ic问答首页 - TAG - TMS320F280049
  • TMS320F280049使用SPI作为从机通讯和ADC采样冲突问题 sos 赏300家园币

    [align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]我想请教一下各位大佬,遇到了下面这个问题,恳请提供建议和帮助,谢谢!描述和问题如下:[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]1.使用了SPIA,作为从机,比特率为15M,FIFO的接收和发送的深度都为8,同步收发16位的200个数组元素的数组。[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]2.SPI启用了DMA的CH4(RX)、CH5(TX),都为循环模式,burst_size=8,transfer_size=25,都开启了循环模式。[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]3.ADC使用了EPWM的SOC触发采样,使用了三个ADC,ADC1,、ADC2、ADC3,分别采样128个数据。[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]4.ADC分别使用了CH1、CH2、CH3[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]5.问题现象:现在的工况是工作是开启ADC采样DMA发送完成触发中断后调用函数执行FFT以及触发CLA任务完成后再次开启采样,直道工作接收停止这个循环过程;SPI配置好和主机同步后就一直通过DMA循环接收,中间不停止不重启,现在是只要不启动工作,SPI的通讯收发是正常的,但是只要开启工作,ADC一直开始采样,SPI的接收FIFO就会溢出,清除标志位也一样很快溢出,调试看DMA的发送完成中断触发的时间变慢了,一溢出通讯就异常了,是因为DMA总线被ADC一直大量占用了吗,还是中断的优先级比其他的低导致SPI的中断和DMA的中断相应不及时导致的,试了降低比特率和FIFO的阈值都起不到效果, 恳请给出好的建议!!![/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]一下是程序的一些配置:[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]void ADC_init(){ //AD_PI initialization[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]// ADC Initialization: Write ADC configurations and power up the ADC // Configures the ADC module's offset trim ADC_setOffsetTrimAll(ADC_REFERENCE_EXTERNAL,ADC_REFERENCE_3_3V); // Configures the analog-to-digital converter module prescaler. ADC_setPrescaler(AD_PI_BASE, ADC_CLK_DIV_2_0); // Sets the timing of the end-of-conversion pulse ADC_setInterruptPulseMode(AD_PI_BASE, ADC_PULSE_END_OF_CONV); // Powers up the analog-to-digital converter core. ADC_enableConverter(AD_PI_BASE); // Delay for 1ms to allow ADC time to power up DEVICE_DELAY_US(500);[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]// SOC Configuration: Setup ADC EPWM channel and trigger settings // Disables SOC burst mode. ADC_disableBurstMode(AD_PI_BASE); // Sets the priority mode of the SOCs. ADC_setSOCPriority(AD_PI_BASE, ADC_PRI_ALL_ROUND_ROBIN); // Start of Conversion 0 Configuration // Configures a start-of-conversion (SOC) in the ADC and its interrupt SOC trigger. // SOC number : 0 // Trigger : ADC_TRIGGER_EPWM3_SOCA // Channel : ADC_CH_ADCIN0 // Sample Window : 16 SYSCLK cycles // Interrupt Trigger: ADC_INT_SOC_TRIGGER_NONE ADC_setupSOC(AD_PI_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_EPWM3_SOCA, ADC_CH_ADCIN0, 16U); ADC_setInterruptSOCTrigger(AD_PI_BASE, ADC_SOC_NUMBER0, ADC_INT_SOC_TRIGGER_NONE); // ADC Interrupt 1 Configuration // SOC/EOC number : 0 // Interrupt Source: enabled // Continuous Mode : enabled ADC_setInterruptSource(AD_PI_BASE, ADC_INT_NUMBER1, ADC_SOC_NUMBER0); ADC_enableInterrupt(AD_PI_BASE, ADC_INT_NUMBER1); ADC_clearInterruptStatus(AD_PI_BASE, ADC_INT_NUMBER1); ADC_enableContinuousMode(AD_PI_BASE, ADC_INT_NUMBER1);[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]//AD_SI initialization[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]// ADC Initialization: Write ADC configurations and power up the ADC // Configures the ADC module's offset trim ADC_setOffsetTrimAll(ADC_REFERENCE_EXTERNAL,ADC_REFERENCE_3_3V); // Configures the analog-to-digital converter module prescaler. ADC_setPrescaler(AD_SI_BASE, ADC_CLK_DIV_2_0); // Sets the timing of the end-of-conversion pulse ADC_setInterruptPulseMode(AD_SI_BASE, ADC_PULSE_END_OF_CONV); // Powers up the analog-to-digital converter core. ADC_enableConverter(AD_SI_BASE); // Delay for 1ms to allow ADC time to power up DEVICE_DELAY_US(500);[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]// SOC Configuration: Setup ADC EPWM channel and trigger settings // Disables SOC burst mode. ADC_disableBurstMode(AD_SI_BASE); // Sets the priority mode of the SOCs. ADC_setSOCPriority(AD_SI_BASE, ADC_PRI_ALL_ROUND_ROBIN); // Start of Conversion 0 Configuration // Configures a start-of-conversion (SOC) in the ADC and its interrupt SOC trigger. // SOC number : 0 // Trigger : ADC_TRIGGER_EPWM3_SOCA // Channel : ADC_CH_ADCIN4 // Sample Window : 16 SYSCLK cycles // Interrupt Trigger: ADC_INT_SOC_TRIGGER_NONE ADC_setupSOC(AD_SI_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_EPWM3_SOCA, ADC_CH_ADCIN4, 16U); ADC_setInterruptSOCTrigger(AD_SI_BASE, ADC_SOC_NUMBER0, ADC_INT_SOC_TRIGGER_NONE); // ADC Interrupt 1 Configuration // SOC/EOC number : 0 // Interrupt Source: enabled // Continuous Mode : enabled ADC_setInterruptSource(AD_SI_BASE, ADC_INT_NUMBER1, ADC_SOC_NUMBER0); ADC_enableInterrupt(AD_SI_BASE, ADC_INT_NUMBER1); ADC_clearInterruptStatus(AD_SI_BASE, ADC_INT_NUMBER1); ADC_enableContinuousMode(AD_SI_BASE, ADC_INT_NUMBER1);[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]//AD_SU initialization[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]// ADC Initialization: Write ADC configurations and power up the ADC // Configures the ADC module's offset trim ADC_setOffsetTrimAll(ADC_REFERENCE_EXTERNAL,ADC_REFERENCE_3_3V); // Configures the analog-to-digital converter module prescaler. ADC_setPrescaler(AD_SU_BASE, ADC_CLK_DIV_2_0); // Sets the timing of the end-of-conversion pulse ADC_setInterruptPulseMode(AD_SU_BASE, ADC_PULSE_END_OF_CONV); // Powers up the analog-to-digital converter core. ADC_enableConverter(AD_SU_BASE); // Delay for 1ms to allow ADC time to power up DEVICE_DELAY_US(500);[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]// SOC Configuration: Setup ADC EPWM channel and trigger settings // Disables SOC burst mode. ADC_disableBurstMode(AD_SU_BASE); // Sets the priority mode of the SOCs. ADC_setSOCPriority(AD_SU_BASE, ADC_PRI_ALL_ROUND_ROBIN); // Start of Conversion 0 Configuration // Configures a start-of-conversion (SOC) in the ADC and its interrupt SOC trigger. // SOC number : 0 // Trigger : ADC_TRIGGER_EPWM3_SOCA // Channel : ADC_CH_ADCIN0 // Sample Window : 16 SYSCLK cycles // Interrupt Trigger: ADC_INT_SOC_TRIGGER_NONE ADC_setupSOC(AD_SU_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_EPWM3_SOCA, ADC_CH_ADCIN0, 16U); ADC_setInterruptSOCTrigger(AD_SU_BASE, ADC_SOC_NUMBER0, ADC_INT_SOC_TRIGGER_NONE); // ADC Interrupt 1 Configuration // SOC/EOC number : 0 // Interrupt Source: enabled // Continuous Mode : enabled ADC_setInterruptSource(AD_SU_BASE, ADC_INT_NUMBER1, ADC_SOC_NUMBER0); ADC_enableInterrupt(AD_SU_BASE, ADC_INT_NUMBER1); ADC_clearInterruptStatus(AD_SU_BASE, ADC_INT_NUMBER1); ADC_enableContinuousMode(AD_SU_BASE, ADC_INT_NUMBER1);[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]}[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]void FB_start(void) { EPWM_clearADCTriggerFlag(EPWM_AD_BASE, EPWM_SOC_A);[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]ADC_clearInterruptStatus(AD_PI_BASE, ADC_INT_NUMBER1); ADC_clearInterruptStatus(AD_SI_BASE, ADC_INT_NUMBER1); ADC_clearInterruptStatus(AD_SU_BASE, ADC_INT_NUMBER1);[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]DMA_clearTriggerFlag(DMA_CH1_BASE); DMA_clearTriggerFlag(DMA_CH2_BASE); DMA_clearTriggerFlag(DMA_CH3_BASE);[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="] // Clearing all pending interrupt flags & Start DMA //DMA_clearTriggerFlag(DMA_CH1_BASE); DMA_startChannel(DMA_CH1_BASE); //DMA_clearTriggerFlag(DMA_CH2_BASE); DMA_startChannel(DMA_CH2_BASE); //DMA_clearTriggerFlag(DMA_CH3_BASE); DMA_startChannel(DMA_CH3_BASE);[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]EPWM_enableADCTrigger(EPWM_AD_BASE, EPWM_SOC_A); }[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]SPI配置:[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]SPi_To_N32_Init(); // // // // Initialize DMA // // // DMA_initController(); DMA_triggerSoftReset(DMA_CH4_BASE); DMA_triggerSoftReset(DMA_CH5_BASE); //---------------------------------------------------------------------------------------------------------------------------------- // DMA channel 4 set up for SPI_RX DMA_configAddresses(DMA_CH4_BASE, (uint16_t *)DSP_RxArray, (uint16_t *)(SCR_SPI_BASE + SPI_O_RXBUF)); // Perform enough 16-word bursts to fill the results buffer. Data will be // transferred 32 bits at a time hence the address steps below. DMA_configBurst(DMA_CH4_BASE, burst_size, 0, 1); DMA_configTransfer(DMA_CH4_BASE, transfer_size, 0, 1); DMA_configMode(DMA_CH4_BASE, DMA_TRIGGER_SPIARX, (DMA_CFG_ONESHOT_DISABLE | DMA_CFG_CONTINUOUS_ENABLE | DMA_CFG_SIZE_16BIT));[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]// // Configure DMA Ch4 interrupts // DMA_setInterruptMode(DMA_CH4_BASE, DMA_INT_AT_END); DMA_enableInterrupt(DMA_CH4_BASE); DMA_enableTrigger(DMA_CH4_BASE);[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]// DMA channel 5 set up for SPI_TX DMA_configAddresses(DMA_CH5_BASE, (uint16_t *)(SCR_SPI_BASE + SPI_O_TXBUF), (uint16_t *)DSP_TxArray); // Perform enough 16-word bursts to fill the results buffer. Data will be // transferred 32 bits at a time hence the address steps below. DMA_configBurst(DMA_CH5_BASE, burst_size, 1, 0); DMA_configTransfer(DMA_CH5_BASE, transfer_size, 1, 0); DMA_configMode(DMA_CH5_BASE, DMA_TRIGGER_SPIATX, (DMA_CFG_ONESHOT_DISABLE | DMA_CFG_CONTINUOUS_ENABLE | DMA_CFG_SIZE_16BIT));[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]// // Configure DMA Ch5 interrupts // DMA_setInterruptMode(DMA_CH5_BASE, DMA_INT_AT_END); DMA_enableInterrupt(DMA_CH5_BASE); DMA_enableTrigger(DMA_CH5_BASE);[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]//SCR_SPI initialization SPI_disableModule(SCR_SPI_BASE); SPI_clearInterruptStatus(SCR_SPI_BASE, SPI_INT_RXFF | SPI_INT_TXFF); SPI_setFIFOInterruptLevel(SCR_SPI_BASE, SPI_FIFO_TX8, SPI_FIFO_RX8); SPI_setConfig(SCR_SPI_BASE, DEVICE_LSPCLK_FREQ, SPI_PROT_POL0PHA1, SPI_MODE_SLAVE, 15000000, 16); SPI_disableLoopback(SCR_SPI_BASE); SPI_enableFIFO(SCR_SPI_BASE); SPI_setEmulationMode(SCR_SPI_BASE, SPI_EMULATION_STOP_MIDWAY); SPI_enableInterrupt(SCR_SPI_BASE, SPI_INT_RXFF | SPI_INT_TXFF); SPI_enableModule(SCR_SPI_BASE);[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]// SPI_FIFO DMA_startChannel(DMA_CH4_BASE); DMA_startChannel(DMA_CH5_BASE);[/font][/backcolor][/color][/align][align=left][color=rgb(51, 51, 51)][backcolor=rgb(255, 255, 255)][font="]}[/font][/backcolor][/color][/align]

    DSP TI 技术交流 使用 从机 TMS320F280049

    209浏览量 0回复量 关注量