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.

TMS320C6713 MCBSP0 SPI Slave模式 接收进不了中断

TI专家,各位朋友:
    SPI slave模式CPU轮询可以接收到数据,并且是正确的,但是 配置为中断接收却进步了中断

中断配置代码:

void Setup_Spi_Interrupt(void)
{

	//point to the IRQ vector table
	IRQ_setVecs(vectors);
	     
 	//Globally enable interrupts
 	IRQ_globalEnable();        
  	        
  	//Enable NMI interrupt
 	IRQ_nmiEnable();
 	   
  	//Map McBSP0 RINT0 events(0x0c) to physical interrupt number      
 	IRQ_map(IRQ_EVT_EXTINT4, IRQ_EVT_RINT0);
 	
  	//Reset the ext events
	IRQ_reset(IRQ_EVT_EXTINT4);
	
	//Enable the ext events(events are disabled while resetting)
    IRQ_enable(IRQ_EVT_EXTINT4);

}

中断向量表:

*------------------------------------------------------------------------------
* Global symbols defined here and exported out of this file
*------------------------------------------------------------------------------
   .global _vectors
   .global _c_int00
   .global _vector1
   .global _vector2
   .global _vector3
   .global _c_int04 
   .global _vector5
   .global _vector6
   .global _vector7
   .global _vector8
   .global _vector9	  
   .global _vector10 
   .global _vector11   
   .global _vector12  
   .global _vector13   
   .global _vector14 ; Hookup the c_int14 ISR in main()
   .global _vector15

*------------------------------------------------------------------------------
* Global symbols referenced in this file but defined somewhere else. 
* Remember that your interrupt service routines need to be referenced here.
*------------------------------------------------------------------------------
   .ref _c_int00

*------------------------------------------------------------------------------
* This is a macro that instantiates one entry in the interrupt service table.
*------------------------------------------------------------------------------
VEC_ENTRY .macro addr
    STW   B0,*--B15
    MVKL  addr,B0
    MVKH  addr,B0
    B     B0
    LDW   *B15++,B0
    NOP   2
    NOP   
    NOP   
   .endm


*------------------------------------------------------------------------------
* This is a dummy interrupt service routine used to initialize the IST.
*------------------------------------------------------------------------------
_vec_dummy:
  B    B3
  NOP  5

*------------------------------------------------------------------------------
* This is the actual interrupt service table (IST). It is properly aligned and
* is located in the subsection .text:vecs. This means if you don't explicitly
* specify this section in your linker command file, it will default and link
* into the .text section. Remember to set the ISTP register to point to this
* table.
*------------------------------------------------------------------------------
 .sect ".text:vecs"
 .align 1024

_vectors:
_vector0:   VEC_ENTRY _c_int00    ;RESET
_vector1:   VEC_ENTRY _vec_dummy  ;NMI
_vector2:   VEC_ENTRY _vec_dummy  ;RSVD
_vector3:   VEC_ENTRY _vec_dummy
_vector4:   VEC_ENTRY _c_int04 
_vector5:   VEC_ENTRY _vec_dummy
_vector6:   VEC_ENTRY _vec_dummy
_vector7:   VEC_ENTRY _vec_dummy
_vector8:   VEC_ENTRY _vec_dummy
_vector9:   VEC_ENTRY _vec_dummy
_vector10:  VEC_ENTRY _vec_dummy
_vector11:  VEC_ENTRY _vec_dummy
_vector12:  VEC_ENTRY _vec_dummy
_vector13:  VEC_ENTRY _vec_dummy
_vector14:  VEC_ENTRY _vec_dummy ; Hookup the c_int14 ISR in main()
_vector15:  VEC_ENTRY _vec_dummy

*------------------------------------------------------------------------------


********************************************************************************
* End of vecs.asm
********************************************************************************

MCBSP0配置:

void ConfigMcbsp(MCBSP_Handle *hMcbsp_ch0)
{
	MCBSP_Config MyMcbspConfig;
	
	*hMcbsp_ch0 = MCBSP_open(0, MCBSP_OPEN_RESET);
	
	//串口控制寄存器 
	MyMcbspConfig.spcr= (Uint32)
                      	((MCBSP_SPCR_XINTM_XRDY      << _MCBSP_SPCR_XINTM_SHIFT   )
                      	|(MCBSP_SPCR_RINTM_RRDY      << _MCBSP_SPCR_RINTM_SHIFT   )
                      	|(MCBSP_SPCR_CLKSTP_DELAY    << _MCBSP_SPCR_CLKSTP_SHIFT  )
                      	|(MCBSP_SPCR_DLB_OFF         << _MCBSP_SPCR_DLB_SHIFT     )
                      //|( MCBSP_SPCR_XRST_1         << _MCBSP_SPCR_XRST_SHIFT    )
                     	//|( MCBSP_SPCR_RINTM_FRM      << _MCBSP_SPCR_RINTM_SHIFT   )  
                      	);
	//接收控制寄存器                    
	MyMcbspConfig.rcr = (Uint32)
                      	((MCBSP_RCR_RPHASE_SINGLE    << _MCBSP_RCR_RPHASE_SHIFT   )
                      	|(MCBSP_RCR_RCOMPAND_DEFAULT << _MCBSP_RCR_RCOMPAND_SHIFT )//MSB
                      	|(MCBSP_RCR_RFIG_YES         << _MCBSP_RCR_RFIG_SHIFT     )
                      	|(MCBSP_RCR_RDATDLY_0BIT     << _MCBSP_RCR_RDATDLY_SHIFT  )
                      	|(MCBSP_RCR_RWDLEN1_8BIT    << _MCBSP_RCR_RWDLEN1_SHIFT  )//8BIT
                      	|(MCBSP_RCR_RFRLEN1_DEFAULT  << _MCBSP_RCR_RFRLEN1_SHIFT  )
                      	);
	//发送控制寄存器                                         
	MyMcbspConfig.xcr = (Uint32)
                      	((MCBSP_XCR_XPHASE_SINGLE    << _MCBSP_XCR_XPHASE_SHIFT   )
                      	|(MCBSP_XCR_XCOMPAND_DEFAULT << _MCBSP_XCR_XCOMPAND_SHIFT )//MSB
 						//|(MCBSP_XCR_XCOMPAND_8BITLSB << _MCBSP_XCR_XCOMPAND_SHIFT )//lSB
                      	|(MCBSP_XCR_XFIG_YES         << _MCBSP_XCR_XFIG_SHIFT     )
                      	|(MCBSP_XCR_XDATDLY_0BIT     << _MCBSP_XCR_XDATDLY_SHIFT  )
                      	|(MCBSP_XCR_XWDLEN1_8BIT    << _MCBSP_XCR_XWDLEN1_SHIFT  )//8BIT
                      	|(MCBSP_XCR_XFRLEN1_DEFAULT  << _MCBSP_XCR_XFRLEN1_SHIFT  )
                      	);
	//采样率产生寄存器                    
	MyMcbspConfig.srgr= (Uint32)
                      	((MCBSP_SRGR_CLKSM_INTERNAL  << _MCBSP_SRGR_CLKSM_SHIFT   )
                      	|(MCBSP_SRGR_FSGM_DXR2XSR    << _MCBSP_SRGR_FSGM_SHIFT    )
					    //|(MCBSP_SRGR_FSGM_FSG    << _MCBSP_SRGR_FSGM_SHIFT    )//ERROR
                      	|(MCBSP_SRGR_CLKGDV_OF(0)   << _MCBSP_SRGR_CLKGDV_SHIFT  )//20M
                      	);
	//引脚控制 
	MyMcbspConfig.pcr = (Uint32)
                      	((MCBSP_PCR_XIOEN_SP         << _MCBSP_PCR_XIOEN_SHIFT    )
                      	|(MCBSP_PCR_RIOEN_SP         << _MCBSP_PCR_RIOEN_SHIFT    )
                      	|(MCBSP_PCR_FSXM_EXTERNAL    << _MCBSP_PCR_FSXM_SHIFT     )
                      	|(MCBSP_PCR_FSRM_EXTERNAL    << _MCBSP_PCR_FSRM_SHIFT     )
                      	|(MCBSP_PCR_CLKXM_INPUT      << _MCBSP_PCR_CLKXM_SHIFT    )//slave
                      	|(MCBSP_PCR_CLKRM_INPUT      << _MCBSP_PCR_CLKRM_SHIFT    )//slave
                      	|(MCBSP_PCR_FSXP_ACTIVELOW   << _MCBSP_PCR_FSXP_SHIFT     )
                      	|(MCBSP_PCR_FSRP_ACTIVELOW   << _MCBSP_PCR_FSRP_SHIFT     )
                      	//|(MCBSP_PCR_CLKXP_RISING     << _MCBSP_PCR_CLKXP_SHIFT  )
                      	|(MCBSP_PCR_CLKXP_FALLING    << _MCBSP_PCR_CLKXP_SHIFT    )
                      	|(MCBSP_PCR_CLKRP_FALLING    << _MCBSP_PCR_CLKRP_SHIFT    )
                      	);
                      	
	MCBSP_config(*hMcbsp_ch0, &MyMcbspConfig);
} /* end config_mcbsp */

是否在slave模式下不能中断接收呢,请指点,谢谢!

  • 试试中断函数名用interrupt关键字定义一下。
    interrupt void Setup_Spi_Interrupt(void)

  • 您可能看错了,那个不是中断服务程序,是中断的配置程序。

    中断服务程序是这个,我这样写的。

    //SPI interrupt service routine  
    interrupt void  c_int04(void)    
    {
    	//while(!(0x00000002==(SPCR0&0x00000002)));
    	data=MCBSP_read(hMcbsp_ch0);
     
    } 
    
  • 不好意思,确实看错了。

    如果中断子程序前加了interrupt关键字是对的。


    IRQ_map(IRQ_EVT_EXTINT4, IRQ_EVT_RINT0);这一句看着有问题,改成下面的试试

    IRQ_map(IRQ_EVT_RINT0, 4);

    修改执行后,看看MUXL[4:0]的值是不是01101?

  • 更正后正确的配置方法:

    void Setup_Spi_Interrupt(void)
    {
    
    	//point to the IRQ vector table
    	IRQ_setVecs(vectors);
    	     
     	//Globally enable interrupts
     	IRQ_globalEnable();        
      	        
      	//Enable NMI interrupt
     	IRQ_nmiEnable();
     	   
      	//Map McBSP0 RINT0 events(0x0D) to physical interrupt number      
     	IRQ_map(IRQ_EVT_RINT0,4);
     	
      	//Reset the ext events
    	IRQ_reset(IRQ_EVT_RINT0);
    	
    	//Enable the ext events(events are disabled while resetting)
        IRQ_enable(IRQ_EVT_RINT0);
    }
    

    不过函数调用的时候,需要以下次序才能进中断。

    //Config Mcbsp
    ConfigMcbsp(&hMcbsp_ch0);

    //Config Spi Receive Interrupt
    Setup_Spi_Interrupt();

    //Start the mcbsp
    start_mcbsp(&hMcbsp_ch0);

     ConfigMcbsp(&hMcbsp_ch0);要在Setup_Spi_Interrupt();的前面,反过来就不行。

  • 现在又遇到一个新问题,我接收的中断方式由“RINT is driven by RRDY (end-of-word) and end-of-frame in A-bis mode.”修改为“RINT is generated by a new frame synchronization.”,无中断触发。

    具体的SPCR寄存器的描述如下图:


     

  • *hMcbsp_ch0 = MCBSP_open(0, MCBSP_OPEN_RESET);后调用Setup_Spi_Interrupt。

  • 先看一下IFR寄存器相应位有没有置1?看中断有没有发生。

  • 你好,我在用6713作为SPI也遇到了类似的问题,就是rrdy位一直不能置1.

    您可以把您McBSP的程序和SPI主机的配置发我邮箱吗?谢谢!邮箱:haokx1993@163.com

x 出现错误。请重试或与管理员联系。