新手入门
- 积分
- 11
- 金钱
- 11
- 注册时间
- 2023-9-19
- 在线时间
- 4 小时
|
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)); //清空字符串,准备下一次对比口令
}
|
|