⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spi.c

📁 TMS320VC5509A 用CSL配置SPI的代码程序
💻 C
字号:
#include <stdio.h>
#include <csl.h>
#include <csl_mcbsp.h>
#include <csl_irq.h>
#define N       10

extern void VECSTART(void);

MCBSP_Config ConfigLoopBack32= {
 MCBSP_SPCR1_RMK(
    1,               /* DLB    = 1 数字循环模式*/
    0,               /* RJUST  = 0 */
    2,               /* CLKSTP = 0 SPI模式*/
    0,               /* DXENA  = 0 */
    0,               /* ABIS   = 0 */
    0,               /* RINTM  = 0 */
    0,               /* RSYNCER= 0 */
    0,               /* RFULL = 0 N/A */
    0,               /* RRDY = 0 N/A */
    0                /* RRST   = 0 */
   ),
 MCBSP_SPCR2_RMK(
    0,               /* FREE   = 0 */
    0,               /* SOFT   = 0 */
    0,               /* FRST   = 0 */
    0,               /* GRST   = 0 */
    0,               /* XINTM  = 0 */
    0,               /* XSYNCER= N/A */
    0,               /* XEMPTY = N/A */
    0,               /* XRDY   = N/A */            
    0                /* XRST   = 0 */
   ),
 MCBSP_RCR1_RMK( 
    1,               /* RFRLEN1 = 0 每帧2字*/
    2                /* RWDLEN1 = 2 每字16bit*/
  ),
 MCBSP_RCR2_RMK(    
    0,               /* RPHASE  = 0 单相帧*/
    0,               /* RFRLEN2 = 0 */
    0,               /* RWDLEN2 = 0 */
    0,               /* RCOMPAND= 0 */
    0,               /* RFIG    = 0 */
    1                /* RDATDLY = 0 SPI主模式需要1bit延迟 */
    ),  
 MCBSP_XCR1_RMK(    
    1,              /* XFRLEN1 = 0 每帧2字*/ 
    2               /* XWDLEN1 = 2 每帧2字*/  
 ),   
 MCBSP_XCR2_RMK(   
    0,              /* XPHASE  = 0 单相帧*/
    0,              /* XFRLEN2 = 0 */
    0,              /* XWDLEN2 = 0 */
    0,              /* XCOMPAND= 0 */
    0,              /* XFIG    = 0 */
    1               /* XDATDLY = 0 SPI主模式需要1bit延迟*/
  ),            
 MCBSP_SRGR1_RMK( 
   39,              /* FWID   = 1 FWID=40CLKG同步信号为低电平,持续时间为40个时钟周期*/
   35               /* CLKGDV = 1 CLKG=4MHZ*/
 ),   
 MCBSP_SRGR2_RMK(  
    0,              /* FREE    = 0 */
    0,              /* CLKSP   = 0 */
    1,              /* CLKSM   = 1 */
    0,              /* FSGM    = 0 */
    47              /* FPER    = 0 FPER=48CLKG帧周期为48个时钟周期,低40个,高8个*/
 ),  
 0x0000,//MCBSP_MCR1_DEFAULT,
 0x0000,//MCBSP_MCR2_DEFAULT, 
 MCBSP_PCR_RMK(
   0,                /* IDLEEN   = 0   */
   0,                /* XIOEN    = 0   */
   0,                /* RIOEN    = 0   */
   1,                /* FSXM     = 1   */
   0,                /* FSRM     = 0   */
   0,                /* SCLKME   = 0   */
   0,                /* CLKSSTAT = N/A */
   0,                /* DXSTAT = N/A   */
   0,                /* DRSTAT = N/A   */
   1,                /* CLKXM   = 1    */
   0,                /* CLKRM    = 0   */
   1,                /* FSXP = 0 发送帧同步低有效*/
   1,                /* FSRP = 0 接收帧同步低有效  */
   0,                /* CLKXP    = 0   */
   0                 /* CLKRP    = 0   */
 ),
 0x0000,//MCBSP_RCERA_DEFAULT 
 0x0000,//MCBSP_RCERB_DEFAULT 
 0x0000,//MCBSP_RCERC_DEFAULT
 0x0000,//MCBSP_RCERD_DEFAULT 
 0x0000,//MCBSP_RCERE_DEFAULT
 0x0000,//MCBSP_RCERF_DEFAULT
 0x0000,//MCBSP_RCERG_DEFAULT
 0x0000,//MCBSP_RCERH_DEFAULT
 0x0000,//MCBSP_XCERA_DEFAULT
 0x0000,//MCBSP_XCERB_DEFAULT
 0x0000,//MCBSP_XCERC_DEFAULT
 0x0000,//MCBSP_XCERD_DEFAULT  
 0x0000,//MCBSP_XCERE_DEFAULT
 0x0000,//MCBSP_XCERF_DEFAULT  
 0x0000,//MCBSP_XCERG_DEFAULT
 0x0000,//MCBSP_XCERH_DEFAULT
};     

/* Define a MCBSP_Handle object to be used with MCBSP_open function */
MCBSP_Handle mhMcbsp;
Uint32 xmt[N], rcv[N];
volatile Uint16 XfrCnt = 0;
Uint16 err = 0;
Uint16 old_intm;
Uint16 rcvEventId, xmtEventId;

// Interrupt Service Routine Prototypes
interrupt void writeIsr(void); 
interrupt void readIsr(void);

void taskFxn(void);
  
void main(void)
{
    Uint16 i;

    /* Initialize CSL library - This is REQUIRED !!! */
    CSL_init();
    
    /* Set IVPD/IVPH to start of interrupt vector location */
    IRQ_setVecs((Uint32)(&VECSTART));

    for (i = 0; i <= N - 1; i++) {  
        xmt[i] = i;
        rcv[i] = 0;
    }

    /* Call function to effect transfer */
    taskFxn();
}

void taskFxn(void)
{
    Uint16 i;

    old_intm = IRQ_globalDisable();

  
    /* Open MCBSP Port 1 and set registers to their power on defaults */
    mhMcbsp = MCBSP_open(MCBSP_PORT1, MCBSP_OPEN_RESET);   

    /* Get EventId's associated with MCBSP Port 0 receive and transmit */
    /* The event Id's are used to communicate with the CSL interrupt   */
    /* module functions.                                               */
    rcvEventId = MCBSP_getRcvEventId(mhMcbsp);
    xmtEventId = MCBSP_getXmtEventId(mhMcbsp);
   
    /* Clear any pending receive or transmit interrupts */
    IRQ_clear(rcvEventId);           
    IRQ_clear(xmtEventId);
       
    /* Place address of interrupt service routines at */
    /* associated vector location  */
    IRQ_plug(rcvEventId, &readIsr);            
    IRQ_plug(xmtEventId, &writeIsr);
   
    /* Write values from configuration structure to MCBSP control regs */
    MCBSP_config(mhMcbsp, &ConfigLoopBack32); 

    /* Enable the MCBSP receive and transmit interrupts */
    IRQ_enable(rcvEventId);          
    IRQ_enable(xmtEventId);

    /* Enable MCBSP transmit and receive */
    MCBSP_start(mhMcbsp, 
                MCBSP_RCV_START | MCBSP_XMIT_START, 
                0
               );
   
   /* Prime MCBSP transmit */
    while(!MCBSP_xrdy(mhMcbsp)){
      ;
    }
    MCBSP_write16(mhMcbsp,xmt[XfrCnt]);
    
   /* Enable all masked interrupts */
   IRQ_globalEnable();   

   /* Start Sample Rate Generator and Frame Sync */
   MCBSP_start(mhMcbsp, 
               MCBSP_SRGR_START | MCBSP_SRGR_FRAMESYNC, 
               0x300
               );
 
    /* Wait for transfer of data */
    while (XfrCnt < 10) {
        ;
    }

   
    /*------------------------------------------*\
     * Compare values 
    \*------------------------------------------*/   
    for(i = 0; i <= N - 1; i++){
        if (rcv[i] != xmt[i]){
            ++err;
            break;
       }
    }

    if (err) {
        printf(" :-< MCBSP Example 1 Failed >-:\n");
    }
    else {
        printf(" :-> MCBSP Example 1 Successful <-:\n");
    }

    /* Restore old value of INTM */
    IRQ_globalRestore(old_intm);
    
    /* We're done with MCBSP, so close it */
    MCBSP_close(mhMcbsp);                     
}

interrupt void writeIsr(void)
{
    IRQ_disable(xmtEventId);     
    MCBSP_write16(mhMcbsp,xmt[XfrCnt]);
}

interrupt void readIsr(void)
{
    rcv[XfrCnt] = MCBSP_read16(mhMcbsp);
    ++XfrCnt;
  
    if (XfrCnt == N) {
        IRQ_disable(rcvEventId);
        IRQ_disable(xmtEventId);
        MCBSP_reset(mhMcbsp);
    } 
    else {
        IRQ_enable(xmtEventId); 
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -