會員登陸
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站導航
最新下載
訪問統計 (自2012/5/3)


正在流覽:   1 名訪客





有關CAN bus傳輸問題
新會員
註冊日期:
5月18日 15:19:28
所屬群組:
註冊會員
文章: 2
等級: 1; EXP: 2
HP : 0 / 0
MP : 0 / 0
離線
目前使用30F4011這塊晶片來做can的傳輸,目前遇到的問題是用Timer控制,約一秒一次,一次發兩組封包時不會有問題,但增加到四組以上封包連續傳送的時候就有蠻高的機率會漏封包。
連續傳四組封包一次可能會漏一到兩組封包,連續傳20組就漏四、五組封包,甚至更多。
如果使用判斷封包進來的方式,一次丟10組,漏封包的次數少很多,原本懷疑是發太快導致的,但現在多加了delay function,也沒有改善…

想問看看是否是有甚麼條件導致這個問題產生,以下是我的程式碼:

void Init_CAN(void)
{
CAN1SetOperationMode( CAN_IDLE_CON & CAN_MASTERCLOCK_0 & CAN_REQ_OPERMODE_CONFIG ) ;

while ( C1CTRLbits.OPMODE <= 3 );
CAN1Initialize( CAN_SYNC_JUMP_WIDTH1 & CAN_BAUD_PRE_SCALE(6),
CAN_WAKEUP_BY_FILTER_DIS &
CAN_PHASE_SEG2_TQ(3) &
CAN_PHASE_SEG1_TQ(4) &
CAN_PROPAGATIONTIME_SEG_TQ(2) &
CAN_SEG2_FREE_PROG & CAN_SAMPLE1TIME ) ;

CAN1SetFilter ( (char) 0 , CAN_FILTER_SID( 0x000 ) & CAN_RX_EID_DIS ,
CAN_FILTER_EID( 0x00000 )) ;

CAN1SetMask ( (char)0 , CAN_MASK_SID ( 0x000 ) & CAN_MATCH_FILTER_TYPE ,
CAN_MASK_EID( 0x00000) ) ;

CAN1SetTXMode( (char) 0 , CAN_TX_STOP_REQ & CAN_TX_PRIORITY_HIGH ) ;
CAN1SetRXMode( (char) 0 , CAN_RXFUL_CLEAR & CAN_BUF0_DBLBUFFER_EN ) ;

CAN1SetOperationMode( CAN_IDLE_CON & CAN_CAPTURE_DIS & CAN_MASTERCLOCK_0 &
CAN_REQ_OPERMODE_NOR ) ;

DIR_CAN1_TX = OUTPUT ;
DIR_CAN1_RX = INPUT ;
}


int main( void )
{
can_init();
while(1)
{
if(CAN_count>5)
{
CAN_count=0;
keep_send_engine();
delay(100000);
keep_send_chassis();
delay(100000);
keep_send_electricity();
delay(100000);
keep_send_outward();
delay(100000);
keep_send_audio();
delay(100000);
}
}
}

void keep_send_electricity(void)
{
delay(500);
CAN1SendMessage(( CAN_TX_SID(0x791)) & CAN_TX_EID_DIS & CAN_SUB_NOR_TX_REQ ,
0 , can_info.iSend_CANData_purifiercln , 8 , 0 ) ;
CAN1AbortAll();
delay(500);
CAN1SendMessage(( CAN_TX_SID(0x792)) & CAN_TX_EID_DIS & CAN_SUB_NOR_TX_REQ ,
0 , can_info.iSend_CANData_wipers , 8 , 0 ) ;
CAN1AbortAll();
delay(500);
CAN1SendMessage(( CAN_TX_SID(0x793)) & CAN_TX_EID_DIS & CAN_SUB_NOR_TX_REQ ,
0 , can_info.iSend_CANData_betterv , 8 , 0 ) ;
CAN1AbortAll();
delay(500);
CAN1SendMessage(( CAN_TX_SID(0x794)) & CAN_TX_EID_DIS & CAN_SUB_NOR_TX_REQ ,
0 , can_info.iSend_CANData_aircompress , 8 , 0 ) ;
CAN1AbortAll();
delay(500);
CAN1SendMessage(( CAN_TX_SID(0x795)) & CAN_TX_EID_DIS & CAN_SUB_NOR_TX_REQ ,
0 , can_info.iSend_CANData_refrigerpre , 8 , 0 ) ;
CAN1AbortAll();
delay(500);
CAN1SendMessage(( CAN_TX_SID(0x796)) & CAN_TX_EID_DIS & CAN_SUB_NOR_TX_REQ ,
0 , can_info.iSend_CANData_insidetemp , 8 , 0 ) ;
CAN1AbortAll();
delay(500);
CAN1SendMessage(( CAN_TX_SID(0x797)) & CAN_TX_EID_DIS & CAN_SUB_NOR_TX_REQ ,
0 , can_info.iSend_CANData_outsidetemp , 8 , 0 ) ;
CAN1AbortAll();
delay(500);
CAN1SendMessage(( CAN_TX_SID(0x798)) & CAN_TX_EID_DIS & CAN_SUB_NOR_TX_REQ ,
0 , can_info.iSend_CANData_convertible , 8 , 0 ) ;
CAN1AbortAll();
delay(500);
CAN1SendMessage(( CAN_TX_SID(0x799)) & CAN_TX_EID_DIS & CAN_SUB_NOR_TX_REQ ,
0 , can_info.iSend_CANData_electhrottle , 8 , 0 ) ;
CAN1AbortAll();
delay(500);
CAN1SendMessage(( CAN_TX_SID(0x790)) & CAN_TX_EID_DIS & CAN_SUB_NOR_TX_REQ ,
0 , can_info.iSend_CANData_drivemode , 8 , 0 ) ;
CAN1AbortAll();
delay(500);
CAN1SendMessage(( CAN_TX_SID(0x770)) & CAN_TX_EID_DIS & CAN_SUB_NOR_TX_REQ ,
0 , can_info.iSend_CANData_map , 8 , 0 ) ;
CAN1AbortAll();
delay(500);
CAN1SendMessage(( CAN_TX_SID(0x771)) & CAN_TX_EID_DIS & CAN_SUB_NOR_TX_REQ ,
0 , can_info.iSend_CANData_catalytic , 8 , 0 ) ;
CAN1AbortAll();
delay(500);
CAN1SendMessage(( CAN_TX_SID(0x772)) & CAN_TX_EID_DIS & CAN_SUB_NOR_TX_REQ ,
0 , can_info.iSend_CANData_tiltangle , 8 , 0 ) ;
CAN1AbortAll();
delay(500);
CAN1SendMessage(( CAN_TX_SID(0x773)) & CAN_TX_EID_DIS & CAN_SUB_NOR_TX_REQ ,
0 , can_info.iSend_CANData_windheater , 8 , 0 ) ;
CAN1AbortAll();
delay(500);
}

void delay(int x)
{
unsigned int m,n;
for(n=0; n<20; n++)
{
for(m=0; m<x; m++);
}
}


謝謝。

5月18日 15:41:04
轉換PDF檔 列印


Re: 有關CAN bus傳輸問題
資深會員
註冊日期:
2010/07/12 16:45
來自 台灣的某一個角落
所屬群組:
註冊會員
文章: 251
等級: 14; EXP: 81
HP : 0 / 345
MP : 83 / 6936
離線
好幾年前有用過,印象中是這樣的

// Enable transmission
C1TX0CONbits.TXREQ = 1;
while (C1TX0CONbits.TXREQ == 1)
{
LATDbits.LATD2 = !PORTDbits.RD2;
}

看sample code發送都會看C1TX0CONbits.TXREQ有沒有變成0,
有變成0表示傳送出去,才可以在送下一筆封包。
另外也會檢查是否有錯誤flag發生,
因為有錯誤也會造成CAN BUS停止。

CAN1SendMessage這個函數只有作到C1TX0CONbits.TXREQ = 1;
印象中他沒有檢查是否有做發送成功的回應,所以應該要自己做。

微薄意見請參考。

5月18日 16:02:43
_________________
除役的胖子FAE
轉換PDF檔 列印


Re: 有關CAN bus傳輸問題
新會員
註冊日期:
5月18日 15:19:28
所屬群組:
註冊會員
文章: 2
等級: 1; EXP: 2
HP : 0 / 0
MP : 0 / 0
離線
您好,大致上了解您的意思,就是發值時C1TX0CONbits.TXREQ會等於1,傳送完畢後會歸0,這樣對嗎?

我將發值的function改為:

void keep_send_electricity(void)
{
if(C1TX0CONbits.TXREQ == 0)
{
delay(500);
CAN1SendMessage(( CAN_TX_SID(0x791)) & CAN_TX_EID_DIS & CAN_SUB_NOR_TX_REQ ,
0 , can_info.iSend_CANData_purifiercln , 8 , 0 ) ;
CAN1AbortAll();
}
if(C1TX0CONbits.TXREQ == 0)
{
delay(500);
CAN1SendMessage(( CAN_TX_SID(0x792)) & CAN_TX_EID_DIS & CAN_SUB_NOR_TX_REQ ,
0 , can_info.iSend_CANData_wipers , 8 , 0 ) ;
CAN1AbortAll();
}
.....
}

漏封包的情形還是沒有改善,不曉得是我理解有問題還是哪裡沒有加到..謝謝!

5月18日 18:18:21
轉換PDF檔 列印


Re: 有關CAN bus傳輸問題
資深會員
註冊日期:
2004/07/23 16:25
所屬群組:
註冊會員
文章: 1150
等級: 29; EXP: 67
HP : 0 / 716
MP : 383 / 26894
離線
蝦米叫漏封包?

can bus 至少要有兩個『正常』的設備才能正常運作

一、沒有一個正常的can device ,你程式怎麼寫都不會正常

二、can bus 的傳輸,區區的1hz,500k 250k 都在傳了,不可能1hz 傳到會出錯

5月19日 01:25:51
轉換PDF檔 列印


Re: 有關CAN bus傳輸問題
新會員
註冊日期:
2011/05/22 18:13
所屬群組:
註冊會員
文章: 16
等級: 2; EXP: 74
HP : 0 / 43
MP : 5 / 766
離線
你怎麼看有漏封包??從你的描述只看得到一片30F4011,沒看到其他的device,不是你環境的問題,就是你設定,但從你的設定看起來好像又沒有問題,可以多提供一點你測試環境的說明嗎,這樣大家比較好幫你debug

5月19日 09:10:39
轉換PDF檔 列印






無法在此發表文章
可以在此觀看文章
無法回覆文章
無法編輯自己的文章
無法刪除自己的文章
無法發起投票調查
無法在此投票
無法上傳附加檔案
無法不經審核直接發表文章

[進階搜尋]


搜尋
線上教學影片
網頁捷徑
教育訓練
其它網站連結
電話: 02-25000405
產品技術問題產品技術支援專線:0800-717718 台北02-25088600 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project