|
-- 作者: ccforever -- 發(fā)布時間: 2008/07/08 10:41am
上次winshton大哥說,作為接受節(jié)點,如果其標識符做了filter&mask,那么當從節(jié)點發(fā)送消息時,接受節(jié)點通過讀自己的標識符,可以知道從節(jié)點的標識符。 如主機設置成可接受任意節(jié)點(全部filter&mask)的消息,當從節(jié)點以標識符1000 0000 010 發(fā)過來消息時,主機讀自己的11位標示符,可以讀到1000 0000 010。 可我在DSP 280X里面用mailbox郵箱做實驗室不是這樣的情況: 郵箱0 做發(fā)送郵箱,標識符設置成:0000 0000 001 發(fā)送數據01H 郵箱13(任意選的,做接收郵箱)標識符初始化設置成:1111 1111 111。數據初始化為0x0H 然后設置郵箱13 的驗收濾波全部屏蔽,即可以接受任意11位標示符發(fā)過來的消息,結果是數據成功接收,但接受成功后再讀郵箱13的標識符,還是1111 1111 111。沒有變成0000 0000 001. 我很郁悶,根本標識符不變,這樣的話,郵箱13怎么知道01H是郵箱0發(fā)過來的消息呢? 也沒辦法像兩位版主教我的那樣,通過讀標識符來識別功能碼+地址碼了
-- 作者: yuanfang -- 發(fā)布時間: 2008/07/08 10:44am
你能否確定是郵箱13接收了報文??
比如郵箱1,郵箱2在default的情況下是不是也是接收模式??是不是數據成功接收後放到了郵箱1中,你卻一直去讀郵箱13??
你的CAN接收是中斷還是查詢方式??如果是中斷,就知道是哪一個mail box發(fā)生了接收中斷,如果是查詢,也應該知道是查到哪一個mailbox時有新數據。
-- 作者: ccforever -- 發(fā)布時間: 2008/07/08 11:21am
遠方大哥: 我只使能了郵箱0 和郵箱13 其他的我都關閉了, 另外,我使用的是中斷方式,也只有mail0 和mailbox13使能了中斷,分別是發(fā)送中斷和接受中斷,切用的不同的中斷響應線。我能判斷是只有mail13發(fā)生了接受中斷
-- 作者: ccforever -- 發(fā)布時間: 2008/07/08 11:23am
另外,我還做了試驗,讓郵箱0發(fā)送成功一次產生一次中斷,同時發(fā)送數據+1,這樣,接受數據也會+1. 試驗結果一樣 數據是接收到了,但ID沒有變呢。呵呵,
-- 作者: ccforever -- 發(fā)布時間: 2008/07/08 11:25am
所以才比較郁悶,這里只有我一個人搞這個,又是新手,所以問題較多,請版主多多包涵。
-- 作者: ccforever -- 發(fā)布時間: 2008/07/08 11:51am
下面是我的代碼,調試是成功的,沒有語法錯誤,有詳細的注釋,反正實際情況就跟我描述的一樣; void InitECana(void)// Initialize eCAN-A module {EALLOW;// EALLOW enables access to protected bits /* Configure eCAN RX and TX pins for eCAN transmissions using eCAN regs*/ ECanaRegs.CANTIOC.bit.TXFUNC = 1; ECanaRegs.CANRIOC.bit.RXFUNC = 1;
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all; ECanaShadow.CANMC.bit.SCB = 1;//擴展幀模式 ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
ECanaMboxes.MBOX0.MSGCTRL.all = 0x00000000;//初始化 ECanaMboxes.MBOX17.MSGCTRL.all = 0x00000000;
//中斷設置 ECanaRegs.CANMIM.all=0x00020001;//允許Mail17和Mail0在接收、發(fā)送到信息時產生中斷 ECanaRegs.CANMIL.all=0x00000001;//郵箱0在發(fā)送成功后在ECan1INT上產生中斷,郵箱17在接收成功后在ECan0INT上產生中斷
ECanaShadow.CANGIM.all = 0; ECanaShadow.CANGIM.bit.I0EN = 1; // Enable eCAN1INT or eCAN0INT ECanaShadow.CANGIM.bit.I1EN = 1; // Enable eCAN1INT or eCAN0INT ECanaRegs.CANGIM.all = ECanaShadow.CANGIM.all; ECanaRegs.CANMD.all=0xFFFF0000;//郵箱屬性設置,1為接收郵箱,0為發(fā)送郵箱 /* Disable all Mailboxes */ ECanaRegs.CANME.all = 0;// Required before writing the MSGIDs ECanaLAMRegs.LAM17.all=0x9FFFFFFF;//LAMI=1,LAM[28~0]全部為1,表示全部屏蔽
EDIS; }
void SelfTest(void) //實際測試函數 { ECanaMboxes.MBOX0.MSGID.all=0x9555AAA0; ECanaMboxes.MBOX17.MSGID.all=0xD5550001; ECanaMboxes.MBOX17.MDL.all=0; ECanaMboxes.MBOX17.MDH.all=0;
ECanaMboxes.MBOX0.MSGCTRL.bit.DLC=8; ECanaMboxes.MBOX17.MSGCTRL.bit.DLC=8;
ECanaMboxes.MBOX0.MDL.all = 0x00000001; ECanaMboxes.MBOX0.MDH.all = 0x00000000; EALLOW;
ECanaRegs.CANME.all=0x00020001;//允許郵箱0和郵箱17使用
ECanaRegs.CANMC.bit.STM=1; //設置CAN為自測試模式
EDIS;
ECanaLAMRegs.LAM17.all=0x9FFFFFFF;//LAMI=1,LAM[28~0]全部為1,表示全部屏蔽
for(i=0;i<1000;i++)//循環(huán)做試驗 { if(ECanaRegs.CANRMP.all==0x00020000) {
ECanaRegs.CANRMP.all=0x00020000; }
ECanaRegs.CANTA.all = 0xFFFFFFFF;
ECanaRegs.CANTRS.all = 0x00000001; // 允許郵箱0發(fā)送 while(ECanaRegs.CANTA.all != 0x00000001 ) {} // 等待發(fā)送成功 ECanaRegs.CANTA.all = 0x00000001; // 發(fā)送成功后 復位 發(fā)送成功標志 loopcount++;
} interrupt void ECana_receive_isr(void)//接收中斷函數 {
ReceiveID=ECanaMboxes.MBOX17.MSGID.all;//讀取接收郵箱ID
ECanaRegs.CANRMP.bit.RMP17=1;//復位接收成功標示,為下一次接收做準備 Flagreceive++; //中斷一次標志加1 PieCtrlRegs.PIEACK.all |= PIEACK_GROUP9; // Issue PIE ACK
}
interrupt void ECana_send_isr(void)//發(fā)送中斷函數 { Flagsend++; //中斷一次標志加1 ECanaMboxes.MBOX0.MDL.all++;//同時發(fā)送數據加1 PieCtrlRegs.PIEACK.all |= PIEACK_GROUP9; // Issue PIE ACK
}
-- 作者: ccforever -- 發(fā)布時間: 2008/07/08 11:55am
哦,對了,yuanfang大哥:我讀的是17號郵箱,上面說舉例時,我說的是13號郵箱,不過,沒有什么區(qū)別,我也只使能了這兩個郵箱
-- 作者: ccforever -- 發(fā)布時間: 2008/07/08 02:29pm
我剛才看了devicenet上一個叫youngerreader的網友發(fā)的那篇關于2407 CAN功能的文章,知道了其實DSP的CAN 的郵箱的標識符在啟用濾波的情況下是具備隨發(fā)送節(jié)點的標識符而改變的功能的 可能是我哪里沒有設置好,但該設置的我都設置了?。?
-- 作者: winshton -- 發(fā)布時間: 2008/07/08 02:33pm
看不清楚濾波寄存器和屏蔽寄存器都是用什么表示的,你貼出來的像這樣ECanaLAMRegs.LAM17.all 的變量,我們沒用過不知道是指什么寄存器。 從程序結構上看倒是沒什么問題。
-- 作者: ccforever -- 發(fā)布時間: 2008/07/08 03:55pm
按照 DSP的寄存器定義:LAM17.31=1:表示接受信息是標準格式或者擴展格式,可以使用濾波 LAM17.28~0=1:標示屏蔽濾波,即無論是1還是0 都可以接受,如果LAM17.18~0=0;標示必須與接受郵箱的ID嚴格匹配才行。
-- 作者: winshton -- 發(fā)布時間: 2008/07/08 04:00pm
我覺得還是軟件設置上的問題,可以到網上找一找CAN接口的測試代碼來試試,比較一下看看設置有什么不同
-- 作者: ccforever -- 發(fā)布時間: 2008/07/08 04:39pm
a !! 我突然覺得可能是我一直在 自測試模式下 做的試驗,結果不成功。有沒有這個可能呢?可惜我沒有兩塊硬件做實驗,不然可以驗證一下
因為在DSP CAN 文檔里有這樣一句話: “在自測試工作模式下,CAN模塊產生自己的應答信號,不連接到總線上也可以工作,消息不發(fā)送,但讀取回來存放在相應的郵箱里,接收到的消息的MSGID不保存在MBR” 因為MSGID剛好是包含消息ID的寄存器,這樣的話,就不保存了
-- 作者: ccforever -- 發(fā)布時間: 2008/07/08 06:56pm
但是我不能確認一定就是這里出現(xiàn)了問題,我沒有設備可以試。 如果真是這里有問題就好了,今天打電話聯(lián)系TI在中國的技術支持,那里的幾個工程師一口咬定說DSP 里面CAN不能支持上述功能,即不能獲取收到消息的ID,一旦每個郵箱的ID設置好,即使使用了屏蔽濾波,也是只能收消息,但郵箱本身的ID不會改變。 真把我郁悶得要死,我在想,如果DSP里面的CAN模塊不能支持這些功能,不能支持對標識符的解析,那CANopen 這些上層協(xié)議在DSP面前也無能為力了。
-- 作者: winshton -- 發(fā)布時間: 2008/07/09 08:01am
看芯片手冊上怎么說,不支持接收ID獲取還是符合CAN協(xié)議標準的CAN控制器么?TI的芯片設計師不會腦殘到這種地步吧
-- 作者: ccforever -- 發(fā)布時間: 2008/07/09 09:02am
的確他們這樣跟我說,我還專門找了幾個不同的人問,說不行,要發(fā)送廣播信息,就要一個一個的發(fā),不就是廣播了嗎?有一個這樣說。 恩,搞得我真是……。 過了一會另一個打電話過來說,他說他做實驗了,不行。我說網上都有人用24系列的做成了,都那樣用了,他說不知道,他做實驗的結果是不行。 后來,我問是不是自測試模式下不行,他說不清楚,他之前也是在自測試模式下做的,要另做實驗才知道,再給我電話。 芯片上說明了支持CAN2.0A&B協(xié)議的標準CAN控制器的。是不是只要是支持這協(xié)議就必定具備這功能?winshton大哥? 芯片手冊上沒有說不支持接受ID獲取,當然也沒有明說支持。 只說自測試模式下,MSGID不保存到MBR中,但他也沒說MBR是什么東西,整個手冊里就出現(xiàn)MBR一次。
-- 作者: winshton -- 發(fā)布時間: 2008/07/09 01:49pm
那就在正常模式下試試,兩個CAN節(jié)點對發(fā),看看什么結果. MBR 有可能是 Memory buffer register 緩沖區(qū)的意思
-- 作者: yuanfang -- 發(fā)布時間: 2008/07/09 06:24pm
不會吧,收到了報文,但卻沒有標識符?我覺得是TI的這個工程師對CAN的功能不太熟悉,總的感覺不太可能有這樣的設計。 我知道Infineon的做法是這樣的,即只有一個mask寄存器,一般的還有一個專門的Filter寄存器,如果Mask被設置了,則要看Filter寄存器的值來比對。
但Infineon的CAN就是只設置Mask寄存器,而Filter寄存器設置在接收緩沖區(qū)的ID裡面,如果每個位都被設置為要比對,那就是接收緩沖區(qū)的ID永遠也不會變,因為不一樣的ID進不來,進來了就是一樣的,但如果不是每個位都mask,那就是變化。
-- 作者: ccforever -- 發(fā)布時間: 2008/07/10 10:20am
是的,后來我收到了TI的一封郵件,說正常模式下可以實現(xiàn)接受ID隨發(fā)送報文ID而改變的功能。 呵呵,哎,終于弄清楚了…… 謝謝版主
|