[讨论] TMS320C6713 MCBSP0 SPI Slave模式 接收进不了中断

weilee   2016-4-28 10:05 楼主
各位朋友:
    SPI slave模式CPU轮询可以接收到数据,并且是正确的,但是 配置为中断接收却进步了中断

中断配置代码:
  1. void Setup_Spi_Interrupt(void)
  2. {

  3.     //point to the IRQ vector table
  4.     IRQ_setVecs(vectors);
  5.          
  6.     //Globally enable interrupts
  7.     IRQ_globalEnable();        
  8.             
  9.     //Enable NMI interrupt
  10.     IRQ_nmiEnable();
  11.       
  12.     //Map McBSP0 RINT0 events(0x0c) to physical interrupt number      
  13.     IRQ_map(IRQ_EVT_EXTINT4, IRQ_EVT_RINT0);
  14.    
  15.     //Reset the ext events
  16.     IRQ_reset(IRQ_EVT_EXTINT4);
  17.    
  18.     //Enable the ext events(events are disabled while resetting)
  19.     IRQ_enable(IRQ_EVT_EXTINT4);

  20. }
中断向量表:
  1. *------------------------------------------------------------------------------
  2. * Global symbols defined here and exported out of this file
  3. *------------------------------------------------------------------------------
  4.    .global _vectors
  5.    .global _c_int00
  6.    .global _vector1
  7.    .global _vector2
  8.    .global _vector3
  9.    .global _c_int04
  10.    .global _vector5
  11.    .global _vector6
  12.    .global _vector7
  13.    .global _vector8
  14.    .global _vector9   
  15.    .global _vector10
  16.    .global _vector11   
  17.    .global _vector12  
  18.    .global _vector13   
  19.    .global _vector14 ; Hookup the c_int14 ISR in main()
  20.    .global _vector15

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

  26. *------------------------------------------------------------------------------
  27. * This is a macro that instantiates one entry in the interrupt service table.
  28. *------------------------------------------------------------------------------
  29. VEC_ENTRY .macro addr
  30.     STW   B0,*--B15
  31.     MVKL  addr,B0
  32.     MVKH  addr,B0
  33.     B     B0
  34.     LDW   *B15++,B0
  35.     NOP   2
  36.     NOP   
  37.     NOP   
  38.    .endm


  39. *------------------------------------------------------------------------------
  40. * This is a dummy interrupt service routine used to initialize the IST.
  41. *------------------------------------------------------------------------------
  42. _vec_dummy:
  43.   B    B3
  44.   NOP  5

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

  54. _vectors:
  55. _vector0:   VEC_ENTRY _c_int00    ;RESET
  56. _vector1:   VEC_ENTRY _vec_dummy  ;NMI
  57. _vector2:   VEC_ENTRY _vec_dummy  ;RSVD
  58. _vector3:   VEC_ENTRY _vec_dummy
  59. _vector4:   VEC_ENTRY _c_int04
  60. _vector5:   VEC_ENTRY _vec_dummy
  61. _vector6:   VEC_ENTRY _vec_dummy
  62. _vector7:   VEC_ENTRY _vec_dummy
  63. _vector8:   VEC_ENTRY _vec_dummy
  64. _vector9:   VEC_ENTRY _vec_dummy
  65. _vector10:  VEC_ENTRY _vec_dummy
  66. _vector11:  VEC_ENTRY _vec_dummy
  67. _vector12:  VEC_ENTRY _vec_dummy
  68. _vector13:  VEC_ENTRY _vec_dummy
  69. _vector14:  VEC_ENTRY _vec_dummy ; Hookup the c_int14 ISR in main()
  70. _vector15:  VEC_ENTRY _vec_dummy

  71. *------------------------------------------------------------------------------


  72. ********************************************************************************
  73. * End of vecs.asm
  74. ********************************************************************************
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模式下不能中断接收呢,请指点,谢谢!


回复评论 (2)

兄弟后来怎么搞的?我也遇到了这个问题

点赞  2019-12-17 15:19

看看接受中断事件寄存器有没有置位。

点赞  2020-1-10 09:53
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复