OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 1730|回复: 0

MCP2515配置CAN报文过滤,想通过串口指令去设置报文过滤条件,但无法实现过滤

[复制链接]

3

主题

3

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2023-9-19
在线时间
4 小时
发表于 2023-9-19 09:55:04 | 显示全部楼层 |阅读模式
1金钱
对应的代码如下:
        //口令为MCP2515外部CAN过滤报文,前面为id,后面为掩码,形式为STANDARD_CAN_Filter:0x00 0x7FF 0x20 0x644
        else if(strcmp("STANDARD_CAN_Filter:",Str_Comp) == 0)
        {

                  uint8_t CAN_STAT;
                  uint8_t id_high;//用的RXF0
                  uint8_t id_low;
                  uint8_t rxm0high;//用的RXM0
                  uint8_t rxm0low;
                  uint8_t addr1;
                  uint16_t data1;
                  uint8_t rxm0addr;
                  uint16_t rxm0data;

               
            MCP2515_Single_Write(&hspi5, 0x0F, 0x80); //进入配置模式
                  while((CAN_STAT & 0xE0) != 0x80) {MCP2515_Seq_Read(&hspi5, 0x0E, 1, &CAN_STAT);}
               
                  addr1 = (char_to_num(rx_buffer[i+2])<<4)+char_to_num(rx_buffer[i+3]);//提取要写入的设备地址
                  data1 = (char_to_num(rx_buffer[i+7])<<8)+(char_to_num(rx_buffer[i+8])<<4)+char_to_num(rx_buffer[i+9]);  //提取要写入的设备数据
                       
                        id_high =(uint8_t)(data1 >> 3) & 0xFF;
                        id_low  =(uint8_t)(data1 & 0x07) << 5;
                       
                  rxm0addr = (char_to_num(rx_buffer[i+13])<<4)+char_to_num(rx_buffer[i+14]);
                  rxm0data = (char_to_num(rx_buffer[i+18])<<8)+(char_to_num(rx_buffer[i+19])<<4)+char_to_num(rx_buffer[i+20]);
                       
                        rxm0high =(uint8_t)(rxm0data >> 3) & 0xFF;
                        rxm0low  =(uint8_t)(rxm0data & 0x07) << 5;
                                                               
                  debug_printf("\r\n写操作开始,id地址为0x%02x,id数据为0x%03x\r\n,0x%02x 0x%02x",addr1,data1,id_high,id_low);
      MCP2515_Single_Write(&hspi5, addr1, id_high);
                        MCP2515_Single_Write(&hspi5, addr1+1, id_low);
                        debug_printf("写操作完成,id地址及高8位数据已变为为0x%02x 0x%02x\r\n",addr1,id_high);
                        debug_printf("写操作完成,id地址及低3位数据已变为为0x%02x 0x%02x\r\n",addr1+1,id_low);
                       
                  printf("\r\nSPI读操作开始,读取id高位地址为0x%02x\r\n",addr1);
      MCP2515_Seq_Read(&hspi5, addr1, 1, &id_high);
                        printf("SPI读操作完成,读出id高位数据为0x%02x\r\n",id_high);
                         
                        printf("\r\nSPI读操作开始,读取id低位地址为0x%02x\r\n",addr1+1);
                        MCP2515_Seq_Read(&hspi5, addr1+1, 1, &id_low);
                        printf("SPI读操作完成,读出id地位数据为0x%02x\r\n",        id_low);

                        debug_printf("\r\n写操作开始,掩码地址为0x%02x,掩码数据为0x%03x\r\n",rxm0addr,rxm0data);
      MCP2515_Single_Write(&hspi5, rxm0addr, rxm0high);
                        MCP2515_Single_Write(&hspi5, rxm0addr+1, rxm0low);
                        debug_printf("写操作完成,掩码地址及高8位数据已变为为0x%02x 0x%02x\r\n",rxm0addr,rxm0high);
                        debug_printf("写操作完成,掩码地址及低3位数据已变为为0x%02x 0x%02x\r\n",rxm0addr+1,rxm0low);
                       
                  printf("\r\nSPI读操作开始,读取掩码高位地址为0x%02x\r\n",rxm0addr);
      MCP2515_Seq_Read(&hspi5, rxm0addr, 1, &rxm0high);
                        printf("SPI读操作完成,读出掩码高位数据为0x%02x\r\n",rxm0high);
                         
                        printf("\r\nSPI读操作开始,读取掩码低位地址为0x%02x\r\n",rxm0addr+1);
                        MCP2515_Seq_Read(&hspi5, rxm0addr+1, 1, &rxm0low);
                        printf("SPI读操作完成,读出掩码地位数据为0x%02x\r\n",        rxm0low);
                          
               
                    MCP2515_Single_Write(&hspi5, 0x2B, 0x03);    //配置中断使能
        MCP2515_Single_Write(&hspi5, 0x2C, 0x00);    //清除各中断标志位
        MCP2515_Single_Write(&hspi5, 0x60, 0x04);    //接收缓冲器0配置,接收所有报文,使能滚存
        MCP2515_Single_Write(&hspi5, 0x70, 0x00);    //接收缓冲器1配置,同上
                    MCP2515_Single_Write(&hspi5, 0x0f, 0x00);    //回到正常模式
                  while(CAN_STAT & 0xE0) {MCP2515_Seq_Read(&hspi5, 0x0E, 1, &CAN_STAT);}
                  memset(Str_Comp,0,sizeof(Str_Comp));    //清空字符串,准备下一次对比口令
        }

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-24 05:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表