• slider image 514
  • slider image 516
  • slider image 517
  • slider image 518
  • slider image 519
:::


Browsing this Thread:   1 Anonymous Users






Re: 請益dsPIC33F的ECAN
#2
新會員
新會員


查看用戶資訊
自己找到問題了 囧

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 );

中的CAN_BAUD_PRE_SCALE(0)應為CAN_BAUD_PRE_SCALE(1)

/* 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 */

中CAN_SFR_BUFFER_WIN指令位置放錯...orz
應該為
CAN1SetOperationMode( CAN_IDLE_CON &
CAN_MASTERCLK_FCY &
CAN_REQ_OPERMODE_NOR &
CAN_CAPTURE_DISABLE &
CAN_SFR_BUFFER_WIN,
CAN_DO_NOT_CMP_DATABYTES) ;

另外DMA0init裡面DMA0設定錯誤是copy過來時沒copy好@@"

發表於: 2010/1/4 1:20
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


請益dsPIC33F的ECAN
#1
新會員
新會員


查看用戶資訊
目前小弟所使用的是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
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部







You can view topic.
不可以 發起新主題
You cannot reply to posts.
You cannot edit your posts.
You cannot delete your posts.
You cannot add new polls.
You cannot vote in polls.
You cannot attach files to posts.
You cannot post without approval.
You cannot use topic type.
You cannot use HTML syntax.
You cannot use signature.
You cannot create PDF files.
You cannot get print page.

[進階搜尋]


:::

Microchip連結

https://www.facebook.com/microchiptechnologytaiwan/
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=13
https://mu.microchip.com/page/tmu
http://elearning.microchip.com.tw/modules/tad_link/index.php?cate_sn=1
https://page.microchip.com/APAC-PrefCenters-TW.html
http://www.microchip.com/
http://www.microchip.com/treelink
http://www.microchipdirect.com/
http://www.microchip.com.cn/newcommunity/index.php?m=Video&a=index&id=103
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=2
http://www.microchip.com.tw/Data_CD/eLearning/index.html
http://www.microchip.com.tw/RTC/RTC_DVD/
https://www.microchip.com/development-tools/
https://www.youtube.com/user/MicrochipTechnology
[ more... ]

教育訓練中心

!開發工具購買
辦法說明 [業界客戶] [教育單位]
----------------------------------
!校園樣品申請
辦法說明 [教師資格] [學生資格]
----------------------------------