請益dsPIC33F的ECAN
|
||||
---|---|---|---|---|
新會員
|
目前小弟所使用的是dsPIC33fJ128GP802這顆單晶片
但在使用ECAN的功能時遇上很大的瓶頸 怎麼設定都無法成功的輸出訊號 我的ECAN主要的功能是與另一棵dsPIC33做溝通 單晶片是使用8Mhz振盪器並PLL至40Mhz 底下附上ECAN & DMA的設定以及輸出所使用的函式 DAM0作為輸出所使用的buffer DAM0作為接收所使用的buffer void ecan1init(void){ char i; // PPS設定 TRISBbits.TRISB8 = 0; TRISBbits.TRISB9 = 1; PPSOutput(PPS_C1TX,PPS_RP8); //CAN TX PPSInput(PPS_C1RX,PPS_RP9); //CAN RX /* Request Configuration Mode */ CAN1SetOperationMode( CAN_IDLE_CON & CAN_MASTERCLK_FCY & CAN_REQ_OPERMODE_CONFIG & CAN_SFR_BUFFER_WIN & CAN_CAPTURE_DISABLE , CAN_DO_NOT_CMP_DATABYTES ) ; while( C1CTRL1bits.OPMODE != 4 ); /* Request Configuration Mode */ //Clock Initial CAN1Initialize(CAN_SYNC_JUMP_WIDTH4 & CAN_BAUD_PRE_SCALE(0), CAN_PHASE_SEG1_TQ(8) & CAN_SEG2_FREE_PROG & CAN_PHASE_SEG2_TQ(6) & CAN_PROPAGATIONTIME_SEG_TQ(5) & CAN_SAMPLE3TIMES ); //Clock Initial CAN1FIFOCon(CAN_DMA_BUF_SIZE_4); /*ecan1WriteRxAcptFilter*/ C1CTRL1bits.WIN=1; CAN1SetFilter ( 1 , CAN_FILTER_SID( 0x7FF ) & CAN_RX_EID_EN , CAN_FILTER_EID( 0x02FFFF )) ; CAN1SetBUFPNT1(CAN_FILTER1_RX_BUFFER1 ); CAN1SetMaskSource( CAN_MASK_FILTER1_MASK0, CAN_MASK_FILTER8_NO_MASK ); CAN1EnableFilter( 1 ); //Enable Filter /*ecan1WriteRxAcptFilter*/ /*ecan1WriteRxAcptMask*/ CAN1SetMask ( 1 , CAN_MASK_SID ( 0x7FF ) & CAN_MATCH_FILTER_TYPE , CAN_MASK_EID( 0x2FFFF ) ) ; C1CTRL1bits.WIN=0; /*ecan1WriteRxAcptMask*/ /* Enter Normal Mode */ CAN1SetOperationMode( CAN_IDLE_CON & CAN_MASTERCLK_FCY & CAN_REQ_OPERMODE_NOR & CAN_CAPTURE_DISABLE, CAN_DO_NOT_CMP_DATABYTES & CAN_SFR_BUFFER_WIN ) ; while( C1CTRL1bits.OPMODE != 0x000 ); /* Enter Normal Mode */ /* ECAN transmit/receive message control */ CAN1ClearRXFUL1(); CAN1ClearRXFUL2(); CAN1ClearRXOVF1(); CAN1ClearRXOVF2(); CAN1SetTXRXMode(0 , CAN_BUFFER0_IS_TX & CAN_TX_HIGHINTM_PRI_BUFFER0 ); CAN1SetTXRXMode(1 , CAN_BUFFER1_IS_RX ); /* ECAN transmit/receive message control */ //enable interupts for irq //i think this activates the DMA transfer EnableIntCAN1; C1INTEbits.RBIE=1; C1INTEbits.TBIE=1; } /* Dma Initialization for ECAN1 Transmission */ void dma0init(void){ /* configures the DMA0 registers: DMA0CON, DMA0REQ, DMA0STA, DMA0STB, DMA0PAD, DMA0CNT */ DMACS0=0; DMA1CON=0x2020; DMA1REQ=0x0046; // ECAN 1 Transmit DMA1STA= __builtin_dmaoffset(&ecan1msgBuf); DMA1PAD=0x0442; // ECAN 1 (C1TXD) DMA1CNT=0x0007; DMA1CONbits.CHEN=1; } /* Dma Initialization for ECAN1 Reception */ void dma2init(void){ /* configures the DMA2 registers: DMA2CON, DMA2REQ, DMA2STA, DMA2STB, DMA2PAD, DMA2CNT*/ DMACS0=0; DMA2CON=0x0020; DMA2REQ=0x0022; // ECAN 1 Receive DMA2PAD=0x0440; // ECAN 1 (C1RXD) DMA2CNT=0x0007; DMA2STA= __builtin_dmaoffset(&ecan1msgBuf); DMA2CONbits.CHEN=1; } 再附上中斷所使用的中斷函式 //--------------------------------------------------------------------- // CAN interrupt handlers //--------------------------------------------------------------------- void __attribute__((interrupt, no_auto_psv))_C1Interrupt(void) { IFS2bits.C1IF = 0; // clear interrupt flag if(C1INTFbits.TBIF) { C1INTFbits.TBIF = 0; } if(C1INTFbits.RBIF) { C1INTFbits.RBIF = 0; } } 在主函式中使用ecan.h中的CAN1SendMessage來輸出 CAN1SendMessage(Txdata,8,0x1FFEFFFF,1,0,ecan1msgBuf[0],0); Buf的設定如下 #define ECAN1_MSG_BUF_LENGTH 4 unsigned int ecan1msgBuf[ECAN1_MSG_BUF_LENGTH][8] __attribute__((space(dma),aligned(256))); 設定是參考"CE227_ECAN_Crosswire"的範例來進行設定 但是一直無法WORK :( 使用示波器看訊號在TX都是恆HIGH在RX都是恆LOW 也就是沒有訊號:( 想請各位大大幫忙:( ECAN一直沒辦法成功WORK:(
發表於: 2009/12/29 17:55
|
|||
|