-- 作者: ccforever -- 发布时间: 2008/07/08 10:41am
上次winshton大哥说,作为接受节点,如果其标识符做了filter&mask,那么当从节点发送消息时,接受节点通过读自己的标识符,可以知道从节点的标识符。 如主机设置成可接受任意节点(全部filter&mask)的消息,当从节点以标识符1000 0000 010 发过来消息时,主机读自己的11位标示符,可以读到1000 0000 010。 可我在DSP 280X里面用mailbox邮箱做实验室不是这样的情况: 邮箱0 做发送邮箱,标识符设置成:0000 0000 001 发送数据01H 邮箱13(任意选的,做接收邮箱)标识符初始化设置成:1111 1111 111。数据初始化为0x0H 然后设置邮箱13 的验收滤波全部屏蔽,即可以接受任意11位标示符发过来的消息,结果是数据成功接收,但接受成功后再读邮箱13的标识符,还是1111 1111 111。没有变成0000 0000 001. 我很郁闷,根本标识符不变,这样的话,邮箱13怎么知道01H是邮箱0发过来的消息呢? 也没办法像两位版主教我的那样,通过读标识符来识别功能码+地址码了
-- 作者: yuanfang -- 发布时间: 2008/07/08 10:44am
你能否確定是郵箱13接收了報文??
比如郵箱1,郵箱2在default的情況下是不是也是接收模式??是不是數據成功接收後放到了郵箱1中,你卻一直去讀郵箱13??
你的CAN接收是中斷還是查詢方式??如果是中斷,就知道是哪一個mail box發生了接收中斷,如果是查詢,也應該知道是查到哪一個mailbox時有新數據。
-- 作者: ccforever -- 发布时间: 2008/07/08 11:21am
远方大哥: 我只使能了邮箱0 和邮箱13 其他的我都关闭了, 另外,我使用的是中断方式,也只有mail0 和mailbox13使能了中断,分别是发送中断和接受中断,切用的不同的中断响应线。我能判断是只有mail13发生了接受中断
-- 作者: ccforever -- 发布时间: 2008/07/08 11:23am
另外,我还做了试验,让邮箱0发送成功一次产生一次中断,同时发送数据+1,这样,接受数据也会+1. 试验结果一样 数据是接收到了,但ID没有变呢。呵呵,
-- 作者: ccforever -- 发布时间: 2008/07/08 11:25am
所以才比较郁闷,这里只有我一个人搞这个,又是新手,所以问题较多,请版主多多包涵。
-- 作者: ccforever -- 发布时间: 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在接收、发送到信息时产生中断 ECanaRegs.CANMIL.all=0x00000001;//邮箱0在发送成功后在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为发送邮箱 /* 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++)//循环做试验 { if(ECanaRegs.CANRMP.all==0x00020000) {
ECanaRegs.CANRMP.all=0x00020000; }
ECanaRegs.CANTA.all = 0xFFFFFFFF;
ECanaRegs.CANTRS.all = 0x00000001; // 允许邮箱0发送 while(ECanaRegs.CANTA.all != 0x00000001 ) {} // 等待发送成功 ECanaRegs.CANTA.all = 0x00000001; // 发送成功后 复位 发送成功标志 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)//发送中断函数 { Flagsend++; //中断一次标志加1 ECanaMboxes.MBOX0.MDL.all++;//同时发送数据加1 PieCtrlRegs.PIEACK.all |= PIEACK_GROUP9; // Issue PIE ACK
}
-- 作者: ccforever -- 发布时间: 2008/07/08 11:55am
哦,对了,yuanfang大哥:我读的是17号邮箱,上面说举例时,我说的是13号邮箱,不过,没有什么区别,我也只使能了这两个邮箱
-- 作者: ccforever -- 发布时间: 2008/07/08 02:29pm
我刚才看了devicenet上一个叫youngerreader的网友发的那篇关于2407 CAN功能的文章,知道了其实DSP的CAN 的邮箱的标识符在启用滤波的情况下是具备随发送节点的标识符而改变的功能的 可能是我哪里没有设置好,但该设置的我都设置了啊!
-- 作者: winshton -- 发布时间: 2008/07/08 02:33pm
看不清楚滤波寄存器和屏蔽寄存器都是用什么表示的,你贴出来的像这样ECanaLAMRegs.LAM17.all 的变量,我们没用过不知道是指什么寄存器。 从程序结构上看倒是没什么问题。
-- 作者: ccforever -- 发布时间: 2008/07/08 03:55pm
按照 DSP的寄存器定义:LAM17.31=1:表示接受信息是标准格式或者扩展格式,可以使用滤波 LAM17.28~0=1:标示屏蔽滤波,即无论是1还是0 都可以接受,如果LAM17.18~0=0;标示必须与接受邮箱的ID严格匹配才行。
-- 作者: winshton -- 发布时间: 2008/07/08 04:00pm
我觉得还是软件设置上的问题,可以到网上找一找CAN接口的测试代码来试试,比较一下看看设置有什么不同
-- 作者: ccforever -- 发布时间: 2008/07/08 04:39pm
a !! 我突然觉得可能是我一直在 自测试模式下 做的试验,结果不成功。有没有这个可能呢?可惜我没有两块硬件做实验,不然可以验证一下
因为在DSP CAN 文档里有这样一句话: “在自测试工作模式下,CAN模块产生自己的应答信号,不连接到总线上也可以工作,消息不发送,但读取回来存放在相应的邮箱里,接收到的消息的MSGID不保存在MBR” 因为MSGID刚好是包含消息ID的寄存器,这样的话,就不保存了
-- 作者: ccforever -- 发布时间: 2008/07/08 06:56pm
但是我不能确认一定就是这里出现了问题,我没有设备可以试。 如果真是这里有问题就好了,今天打电话联系TI在中国的技术支持,那里的几个工程师一口咬定说DSP 里面CAN不能支持上述功能,即不能获取收到消息的ID,一旦每个邮箱的ID设置好,即使使用了屏蔽滤波,也是只能收消息,但邮箱本身的ID不会改变。 真把我郁闷得要死,我在想,如果DSP里面的CAN模块不能支持这些功能,不能支持对标识符的解析,那CANopen 这些上层协议在DSP面前也无能为力了。
-- 作者: winshton -- 发布时间: 2008/07/09 08:01am
看芯片手册上怎么说,不支持接收ID获取还是符合CAN协议标准的CAN控制器么?TI的芯片设计师不会脑残到这种地步吧
-- 作者: ccforever -- 发布时间: 2008/07/09 09:02am
的确他们这样跟我说,我还专门找了几个不同的人问,说不行,要发送广播信息,就要一个一个的发,不就是广播了吗?有一个这样说。 恩,搞得我真是……。 过了一会另一个打电话过来说,他说他做实验了,不行。我说网上都有人用24系列的做成了,都那样用了,他说不知道,他做实验的结果是不行。 后来,我问是不是自测试模式下不行,他说不清楚,他之前也是在自测试模式下做的,要另做实验才知道,再给我电话。 芯片上说明了支持CAN2.0A&B协议的标准CAN控制器的。是不是只要是支持这协议就必定具备这功能?winshton大哥? 芯片手册上没有说不支持接受ID获取,当然也没有明说支持。 只说自测试模式下,MSGID不保存到MBR中,但他也没说MBR是什么东西,整个手册里就出现MBR一次。
-- 作者: winshton -- 发布时间: 2008/07/09 01:49pm
那就在正常模式下试试,两个CAN节点对发,看看什么结果. MBR 有可能是 Memory buffer register 缓冲区的意思
-- 作者: yuanfang -- 发布时间: 2008/07/09 06:24pm
不會吧,收到了報文,但卻沒有標識符?我覺得是TI的這個工程師對CAN的功能不太熟悉,總的感覺不太可能有這樣的設計。 我知道Infineon的做法是這樣的,即只有一個mask寄存器,一般的還有一個專門的Filter寄存器,如果Mask被設置了,則要看Filter寄存器的值來比對。
但Infineon的CAN就是只設置Mask寄存器,而Filter寄存器設置在接收緩沖區的ID裡面,如果每個位都被設置為要比對,那就是接收緩沖區的ID永遠也不會變,因為不一樣的ID進不來,進來了就是一樣的,但如果不是每個位都mask,那就是變化。
-- 作者: ccforever -- 发布时间: 2008/07/10 10:20am
是的,后来我收到了TI的一封邮件,说正常模式下可以实现接受ID随发送报文ID而改变的功能。 呵呵,哎,终于弄清楚了…… 谢谢版主
|