|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
愿意討論can的filter過(guò)濾器嗎 |
| 作者:zbby 欄目:單片機(jī) |
can的腦袋長(zhǎng)達(dá)11(bit)或29(bit) 都被我拿來(lái)當(dāng)命令位了, 我用的是18f258(can連接)16f876a+2510 想讓can自動(dòng)套用各個(gè)過(guò)濾器來(lái)識(shí)別我的各個(gè)命令, 因?yàn)樗?個(gè)過(guò)濾器 但看到它的rb0con寄存器的 bit 1 JTOFF: Jump Table Offset bit (read ONLY copy of RX0DBEN) 1 = Allows Jump Table offset between 6 and 7 0 = Allows Jump Table offset between 1 and 0 Note: This bit allows same FILTER jump table for both RXB0CON and RXB1CON. bit 0 FILHIT0: FILTER Hit bit This bit indicates which acceptance FILTER enabled the message reception into Receive Buffer 0 1 = Acceptance FILTER 1 (RXF1) 0 = Acceptance FILTER 0 (RXF0) 這兩位,好像只是允許在FILTER0,和FILTER1之間切換,而如果你看SJA1000的說(shuō)明,他說(shuō)它的FILTER就32位:要么你開(kāi)一個(gè)32位的,要么你開(kāi)兩個(gè)FILTER,但每個(gè)只用16(bit)有效,但沒(méi)說(shuō)那16位,如何對(duì)應(yīng)can腦袋上的各個(gè)bit位; 另外在18的REGISTER 19-13: RXB1CON – RECEIVE BUFFER 1 CONTROL REGISTER bit 2-0 FILHIT2:FILHIT0: FILTER Hit bits These bits indicate which acceptance FILTER enabled the last message reception into Receive Buffer 1 111 = Reserved 110 = Reserved 101 = Acceptance FILTER 5 (RXF5) 100 = Acceptance FILTER 4 (RXF4) 011 = Acceptance FILTER 3 (RXF3) 010 = Acceptance FILTER 2 (RXF2) 001 = Acceptance FILTER 1 (RXF1) ONLY possible when RXB0DBEN bit is set 000 = Acceptance FILTER 0 (RXF0) ONLY possible when RXB0DBEN bit is set 這里又允許你指定6個(gè)里的一個(gè)有效? 我就不懂了,rxf5是8(比特),一個(gè)有效,不夠長(zhǎng)阿,不能把腦袋都罩住, 還是你將所有的FILTER(6個(gè))都設(shè)上,然后can會(huì)自己在這幾個(gè)FILTER里自己找看看,來(lái)的信息適用哪個(gè)FILTER,就讓他通過(guò)。 |
| 2樓: | >>參與討論 |
| 作者: zbby 于 2003/5/21 21:26:00 發(fā)布:
同時(shí)對(duì)于MICROCHIP的00738b文檔 同時(shí)對(duì)于MICROCHIP的00738b文檔(18can的例程)設(shè)置傳送優(yōu)先級(jí)的地方不懂 BOOL CANSendMessage(unsigned LONG id, BYTE* Data, BYTE DataLen, enum CAN_TX_MSG_FLAGS MsgFlags) { BYTE i; BYTE *ptr; // Find the first empty transmitter. if ( TXB0CON_TXREQ == 0 ) { // TxBuffer0 is empty. Set WIN bits to point to TXB0 CANCON &= 0b11110001; CANCON |= 0b00001000; } else if ( TXB1CON_TXREQ == 0 ) { // TxBuffer1 is empty. Set WIN bits to point to TXB1 CANCON &= 0b11110001; CANCON |= 0b00000110; } else if ( TXB2CON_TXREQ == 0 ) { // TxBuffer2 is empty. Set WIN bits to point to TXB2 CANCON &= 0b11110001; CANCON |= 0b00000100; } else // None of the transmit buffers were empty. return CANFALSE; /* * Now that WIN has remapped RXB0 to empty buffer, simply * populate RXB0 buffer */ //2003/05/20 zby 對(duì)于這里十分不懂 //傳輸?shù)膬?yōu)先級(jí)怎么設(shè)置到rx的寄存器里面了? //而且對(duì)應(yīng)的兩位是bit 1 JTOFF: Jump Table Offset bit //(read ONLY copy of RX0DBEN) //Note: This bit allows same FILTER jump table for both //RXB0CON and RXB1CON. //bit 0 FILHIT0: FILTER Hit bit //This bit indicates which acceptance FILTER enabled the //message reception into Receive Buffer 0 // Set transmit priority. RXB0CON = MsgFlags & CAN_TX_PRIORITY_BITS; // Populate Extended identifier information ONLY if it is // desired. if ( !(MsgFlags & CAN_TX_FRAME_BIT) ) CANIDToRegs((BYTE*)&RXB0SIDH, id, CAN_CONFIG_XTD_MSG); else CANIDToRegs((BYTE*)&RXB0SIDH, id, CAN_CONFIG_STD_MSG); RXB0DLC = DataLen; if ( !(MsgFlags & CAN_TX_RTR_BIT) ) RXB0DLC |= 0b01000000; // Populate data values. ptr = (BYTE*)&RXB0D0; for ( i = 0; i < DataLen; i++ ) ptr[i] = Data[i]; /* * Mark this buffer as ready to start transmit. * We are not using C bit field structure because RXB0 registers * are remapped to one of the empty transmit buffers and their * bit3 is not same as RXB0CON bit3. To avoid confusion, in-line * assembly is used to directly set bit 3 of corresponding TXBnCON * register. */ #if defined(MCHP_C18) _asm bsf RXB0CON, 3, 0 _endasm #endif #if defined(HITECH_C18) asm("bsf _RXB0CON,3"); #endif /* * Restore CAN buffer mapping so that subsequent access to RXB0 * buffers are to the real RXB0 buffer. */ CANCON &= 0b11110001; return CANTRUE; } |
|
| 3樓: | >>參與討論 |
| 作者: 張明峰 于 2003/5/22 11:38:00 發(fā)布:
請(qǐng)仔細(xì)閱讀數(shù)據(jù)手冊(cè) 就你第二個(gè)問(wèn)題我剛剛回答了一個(gè)用戶。答案在數(shù)據(jù)手冊(cè)DS41159A-Page191。 看CANCON寄存器的WIN2:WIN0位的意義。 |
|
| 4樓: | >>參與討論 |
| 作者: zbby 于 2003/5/22 21:35:00 發(fā)布:
microchip.com網(wǎng)站可以下載那個(gè)文檔 你用那個(gè)名字查一下即可 |
|
| 5樓: | >>參與討論 |
| 作者: zbby 于 2003/5/23 11:15:00 發(fā)布:
如何配置bit時(shí)間? 環(huán)境:18f258(自帶can)4MHZ和16F876+2510(11.0592MHZ)聯(lián)絡(luò) 我要求的設(shè)置是 bit空間 Sjw p p1 p2 1 1 4 4 波特率 125k 根據(jù)公式求預(yù)分頻數(shù) 128'BPR = 1.6 - 1 = 0.6; 2510'sBPR = 4.42368 - 1 = 3.42368 由于向寄存器寫入的時(shí)候必須是個(gè)整數(shù), 我向128寫入0 876寫入3 問(wèn)3。42368取3對(duì)還是取4對(duì) 0。6取0對(duì),還是取1對(duì)? 另外:如何利用示波器看出波特率? 我的2510的第三腳輸出為11MHz,這正常嗎? 另外:我不知道為什么我不能在MICROCHIP的800-820-6247免費(fèi)技術(shù)支持電話那里產(chǎn)生中斷(今天總是接不通),可能優(yōu)先級(jí)太低,希望能打進(jìn)的朋友幫我問(wèn)一問(wèn)我這里的問(wèn)題。 另外:也希望同行能打我的電話0412-8227088/8227188/8227288轉(zhuǎn)8054 指導(dǎo)指導(dǎo),討論討論,研究研究 ,關(guān)于pic&&can! zby |
|
| 6樓: | >>參與討論 |
| 作者: zbby 于 2003/5/23 11:16:00 發(fā)布:
193頁(yè)我看了,還是沒(méi)懂,感謝張工。 This SELECTs which of the CAN buffers to SWITCH into the access bank area. This allows access to the buffer registers from any data MEMORY bank. After a frame has caused an interrupt, the ICODE3:ICODE0 bits can be copied to the WIN3:WIN0 bits to SELECT the correct buffer. See Example 19-1 for code example. 這里是選擇哪個(gè)can緩沖跳接到接入點(diǎn),這將允許任何數(shù)據(jù)bank進(jìn)入這個(gè)緩沖寄存器,在幀正常接收引發(fā)中斷以后,icode3:icdpde0 這4個(gè)bit將被拷貝到win3:win0這4個(gè)bit位,以選擇正確的緩沖區(qū)。 具體看例子19-1(匯編的) 感謝張工。 |
|
| 7樓: | >>參與討論 |
| 作者: zbby 于 2003/5/23 11:20:00 發(fā)布:
我的2510初始化 SPI_BitMod(CANCTRL, 0x07, 0x04); SPI_Write(CNF1,0x03); // SPI_Write(CNF2,BTLMODE_CNF3 + PRSEG_4TQ); SPI_Write(CNF3,PHSEG2_4TQ); //2003/05/22 zby 關(guān)閉RB1 SPI_Write(RXM1SIDH, 0xFF); //屏蔽標(biāo)識(shí)符高位 SPI_Write(RXM1SIDL, 0xFF); //屏蔽標(biāo)識(shí)符低位 SPI_Write(RXM1EIDH, 0xFF); //屏蔽擴(kuò)大高位 SPI_Write(RXM1EIDL, 0xFF); //屏蔽擴(kuò)大低位 SPI_Write(RXF2SIDH, 0xFF); //過(guò)濾器標(biāo)識(shí)符高位 SPI_Write(RXF2SIDL, 0xFF); //過(guò)濾器標(biāo)識(shí)符低位 SPI_Write(RXF2EIDH, 0xFF); //過(guò)濾器擴(kuò)大高位 SPI_Write(RXF2EIDL, 0xFF); //過(guò)濾器擴(kuò)大低位 SPI_BitMod(RXB1CTRL,0xFF, 0x02); //置接收緩沖區(qū)1控制位//接受所有成幀的幀//2003/05/20 但除了111111。。。。1111之外都進(jìn)不來(lái) |
|
| 8樓: | >>參與討論 |
| 作者: zbby 于 2003/5/23 12:49:00 發(fā)布:
18258 can的初始化 18258 can的初始化 CANInitialize(1,1,4,4,1,CAN_CONFIG_DEFAULT); |
|
| 9樓: | >>參與討論 |
| 作者: net_boy 于 2003/5/23 15:26:00 發(fā)布:
zbby老大,我較熟悉51系列,但我有一個(gè)項(xiàng)目 是和CANBUS有關(guān)的,本想選擇P8XC591做,但價(jià)格較高57元(人民幣),不知你選用的帶CAN的PIC芯片有何特點(diǎn),價(jià)格怎樣?你能否指點(diǎn)我一下?如果行的話我就要選PIC的芯片來(lái)做了。 |
|
| 10樓: | >>參與討論 |
| 作者: zbby 于 2003/5/23 21:12:00 發(fā)布:
我的can通訊了! 下午microchip.com上?偛康800電話打通了,經(jīng)不知名的高手指點(diǎn)(我的毛病在兩邊波特率偏差太大),終于在下班之前的1個(gè)小時(shí),can通訊了, 經(jīng)過(guò)我編程測(cè)算,在tq和〉8 < 12 ;如果要求波特率介于9600 至125000hz,而且兩邊的波特率偏差小于250Hz,只有一個(gè)組合結(jié)果: 就是波特率定在45。7kHz,tqROOM組成為1:1:5:4(總和長(zhǎng)11tq) |
|
| 11樓: | >>參與討論 |
| 作者: zbby 于 2003/5/24 10:18:00 發(fā)布:
我的can總線通訊波特率配置參數(shù)生成程序的原語(yǔ) 總公式:boundrate = fosc /(2*all_tq*bpr) //給出參數(shù)部分 node 甲:fosc1 node 乙:fosc2 要求甲的預(yù)分頻數(shù):起點(diǎn) ,終點(diǎn) 要求乙的預(yù)分頻數(shù):起點(diǎn) ,終點(diǎn) 兩者共同的tq和的:起點(diǎn) ,終點(diǎn) 允許(或期望)兩點(diǎn)波特率的頻率誤差(比如200Hz 允許) 波特率期望范圍(比如9600 - 125000Hz) //計(jì)算部分 甲的bpr1 起點(diǎn)-終點(diǎn) 步長(zhǎng)1 循環(huán) 嵌套乙的bpr2 起點(diǎn) - 終點(diǎn) 步長(zhǎng) 1 循環(huán) 嵌套兩點(diǎn)共同的tq和 起點(diǎn) - 終點(diǎn) 步長(zhǎng)1 循環(huán) 每次循環(huán)都計(jì)算 node 甲的 boundrate1 node 乙的 boundrate2 兩者差 boundrate1 - boundrate2 判斷條件 (差 小于 允許值) (波特率在你的要求范圍之內(nèi)) 滿足: 打印當(dāng)前的 bpr1 ,bpr2 ,tq 否則: 循環(huán)繼續(xù) 這樣今后can的波特率配置都不用手工計(jì)算了,十分方便,也十 分準(zhǔn)確。 |
|
| 12樓: | >>參與討論 |
| 作者: zbby 于 2003/5/24 10:22:00 發(fā)布:
在廠子我是個(gè)干活的 價(jià)格真是不知道, 用的是PIC18F258,我寫在上面了吧。 具體你可以到MICROCHIP下載一個(gè)datasheet看看 |
|
| 13樓: | >>參與討論 |
| 作者: zbby 于 2003/5/26 14:33:00 發(fā)布:
另外關(guān)于can的過(guò)濾器,我反復(fù)想求證的一件事 一個(gè)消息從can總線上來(lái),會(huì)被兩個(gè)過(guò)濾器過(guò)濾嗎? 我認(rèn)為只能有一個(gè)過(guò)濾器,就是這個(gè)消息一次只能經(jīng)過(guò)一個(gè)過(guò)濾器,要么成功被接受,要么被REJECT. 所以懇請(qǐng)幫助澄清是否會(huì)一次通過(guò)兩個(gè)過(guò)濾器? 尤其是會(huì)不會(huì)被filter0 ,filter1 過(guò)濾,因?yàn)槲夷D:浀煤孟裼幸粋(gè)寄存器變量可以打開(kāi)filter0,filter1的切換允許!就是當(dāng)filter0失敗時(shí),自動(dòng)調(diào)用filter1來(lái)過(guò)濾本次的消息。 f18258,2510有沒(méi)有這個(gè)自動(dòng)切換功能? 消息到底被幾個(gè)過(guò)濾器過(guò)濾? |
|
| 14樓: | >>參與討論 |
| 作者: 農(nóng)夫XP 于 2003/5/26 16:53:00 發(fā)布:
過(guò)濾器也有個(gè)先后問(wèn)題阿。。 先過(guò)濾,,如果成功就不會(huì)往下發(fā)送了。。直接得到過(guò)濾器編號(hào)。。 結(jié)構(gòu)圖上的過(guò)濾器的箭頭就這個(gè)意思吧。。 |
|
| 15樓: | >>參與討論 |
| 作者: zbby 于 2003/5/26 22:35:00 發(fā)布:
我從MICROCHIP上海。800得到的消息是 一個(gè)消息一次只經(jīng)過(guò)一個(gè)過(guò)濾器的過(guò)濾(相對(duì)于rxb0,rxb1而言)。 而在我們李工的實(shí)踐中,在rxb0緩存上設(shè)立了兩個(gè)過(guò)濾器。好像都發(fā)揮了作用,即開(kāi)啟了filter0 ,filter1 分別過(guò)濾消息和廣播,成功了。 這不是說(shuō)明一個(gè)消息至少經(jīng)過(guò)了兩個(gè)過(guò)濾器了嗎? 所以說(shuō)是否有一個(gè)機(jī)制可以讓消息經(jīng)過(guò)所有的過(guò)濾器,只要符合其中一個(gè)就接收? 我越來(lái)越糊涂了!。。。 |
|
| 16樓: | >>參與討論 |
| 作者: 張明峰 于 2003/5/27 11:43:00 發(fā)布:
我的理解 收到的消息會(huì)讓所有過(guò)濾器過(guò)濾(RXB0=>0/1,RXB1=>2/3/4/5),具體經(jīng)過(guò)哪個(gè)過(guò)濾器會(huì)體現(xiàn)在寄存器RXBnCTRL的FILHIT位。你的試驗(yàn)即驗(yàn)證了此點(diǎn)。 |
|
| 17樓: | >>參與討論 |
| 作者: zbby 于 2003/5/28 12:35:00 發(fā)布:
you are right i just now learn the knowledge . 看起來(lái),還是文檔沒(méi)有看仔細(xì)。 |
|
|
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |