打印
[其他ST产品]

对STR71X中文书上411页上定义ID范围的一段话不了解,请教

[复制链接]
2632|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cgha|  楼主 | 2007-1-20 03:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
通常IDLOW最好选择一些LSB清零的值,IDHIGH选择逻辑包含IDLOW并且有相同LSBS的值。例如0x100~0x3ff可以工作,但0x100~0x2ff则不可以,因为0x100没有逻辑包含到0x2ff中(也就是说0x100&0x2ff = 0)
谁能帮忙解释一下。另外如果我要接收确定ID(单一)的值,是否把屏蔽域中MSK28~MSK0全置1?
沙发
em_zhuzhu| | 2007-1-25 19:24 | 只看该作者

这个是软件封装的问题

实际上
void CAN_SetRxMsgObj(********)
{
    if (idType == CAN_STD_ID)
    {
      CANx->sMsgObj[msg_if].M1R = 0;
      CANx->sMsgObj[msg_if].M2R = STD_RANGE_ID_MSK(idLow, idHigh);

      CANx->sMsgObj[msg_if].A1R = 0;
      CANx->sMsgObj[msg_if].A2R = CAN_A2R_MSGVAL |STD_RANGE_ID_ARB(idLow, idHigh);
      }
        .......
}
#define RANGE_ID_MSK(range_start, range_end)    (~((range_end) - (range_start)))
#define RANGE_ID_ARB(range_start, range_end)    ((range_start) & (range_end))

#define STD_RANGE_ID_MSK(range_start, range_end)    ((u16)((RANGE_ID_MSK((range_start), (range_end)) & 0x7FF) << 2))
#define STD_RANGE_ID_ARB(range_start, range_end)    ((u16)(RANGE_ID_ARB((range_start), (range_end)) << 2))
实际上地址过滤就是设置MSK和ID(总裁)。两者一起合作来过滤地址。

而ST采用的供给用户的软件算法是这样的:
MSR:~(idhigh - idlow);为1的位则对应该位的ID位必须对应,不对应则过滤
ID:(idhigh & idlow);ID总裁作用
可以看出,用户其实是必须设定了ID位,再通过MSR来确定ID的哪几位用作匹配。
实际上它是不能完全起作用的,
举例说明:
用户设定:
  idhigh:0x3FF
  idlow: 0x100
  那么:MSR:为10100000000
        ID: 为00100000000
  所以实际的匹配为为第9和第11位:0x1xxxxxxxx(x表任意值)
  但是可以发现其实,这是有漏洞的,即0x2xx的地址段也包含在用户需要的地址段中,
但是它却会被过滤掉,因为第9位被确定为了1,而0x2xx的第9位为0。
所以实际的接收地址为0x100~0x1FF和
                      0x300~0x3FF两段。

所以,在使用提供函数设置地址过滤的时候,最好自己推算一下。

另外,如果设置唯一地址时,只需要ID放地址然后将MSR置全1即可,可以不需要用ST提供的函数。


使用特权

评论回复
板凳
CGHA| | 2007-1-27 10:32 | 只看该作者

非常感谢你抽这么多时间来回答我的问题

按照你提供的公式,如果低地址不包含在高地址中,则ID=0,不在接收ID范围之内了。
现在明白了,是先设ID,然后根据屏蔽寄存器中的内容再做逻辑运算才是真正要接收的ID(或者范围)。
其实ID并不仅仅是地址,还可以包含对于匹配ID设备的一些命令。

使用特权

评论回复
地板
gyt| | 2007-1-28 23:03 | 只看该作者

好人啊

谢谢说明。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

561

主题

719

帖子

0

粉丝