小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

DND開發(fā)論壇

 瘋狂金屬 2011-05-03

以文本方式查看主題

- DND開發(fā)論壇 (http://www./cgi-bin/forum/leoboard.cgi)
-- (http://www./cgi-bin/forum/forums.cgi?forum=2)
--- DSP CAN控制器是不是和獨立控制器不一樣? (http://www./cgi-bin/forum/forums.cgi?forum=2&topic=595)


-- 作者: 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而改變的功能。
 呵呵,哎,終于弄清楚了……
謝謝版主

 


© 版權所有: DNDev.COM  版本: LB5000MX 2.00

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多