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