我正在使用一个带有STM32F107VCT6控制器的定制板。这块板的主要目的是连接两个can网络,进行一些计算,并通过SPI将一些数据转发到另一个控制器,另一些转发到另一个CAN网络,反之亦然。
我让CAN1网络完全按照我想要的方式进行接收和传输;然而,CAN2网络只能传输(因此不是硬件故障)。
在复制代码时,仍然将滤波器组更改为大于14的值,正如许多其他论坛所建议的那样;以及设置其他要求以更改为CAN2,但在中断或轮询模式下仍不会收到。
我已经使用STM32Cube MX生成了与CAN1相同的初始化代码,尽管它们位于不同的总线上,具有不同的中断优先级。
但是代码不起作用,就好像总线上没有消息一样。我正在使用Microchip CAN总线分析器发送和接收测试消息。
另一个细节:我仍然让CAN1运行,只是没有数据进入它;因此,它的所有时钟仍然在运行。
下面是我的测试代码:
主循环
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_CAN1_Init();
MX_CAN2_Init();
MX_RTC_Init();
MX_SPI1_Init();
MX_USART1_UART_Init();
CAN_FilterConfTypeDef sFilterConfig2;
sFilterConfig2.FilterNumber = 0;
sFilterConfig2.FilterMode = CAN_FILTERMODE_IDMASK;
sFilterConfig2.FilterScale = CAN_FILTERSCALE_32BIT;
sFilterConfig2.FilterIdHigh = 0x0000;
sFilterConfig2.FilterIdLow = 0x0000;
sFilterConfig2.FilterMaskIdHigh = 0x0000;
sFilterConfig2.FilterMaskIdLow = 0x0000;
sFilterConfig2.FilterFIFOAssignment = CAN_FILTER_FIFO1;
sFilterConfig2.FilterActivation = ENABLE;
sFilterConfig2.BankNumber = 20;
HAL_CAN_ConfigFilter(&hcan2, &sFilterConfig2);
hcan2.pRxMsg = &RxMessage2;
while (1)
{
HAL_CAN_Receive (&hcan2, CAN_FIFO1, 1000);
{
uint8_t buf[100], l = sprintf(buf, " ID: %d DLC: %d Data: %d %d %d %d %d %d %d %d \n\r", RxMessage2.StdId, RxMessage2.DLC, RxMessage2.Data[0], RxMessage2.Data[1], RxMessage2.Data[2], RxMessage2.Data[3], RxMessage2.Data[4], RxMessage2.Data[5], RxMessage2.Data[6], RxMessage2.Data[7]);
HAL_UART_Transmit(&huart1, buf, l, 1000);
}
if (RxMessage2.StdId !=0) {
while(1);
}
}
}非常感谢你的意见,干杯,汤姆
发布于 2019-03-11 16:32:07
在过滤器配置中,添加附加行,说明从属滤波器组的起始数。
sFilterConfig2.SlaveStartBankNumber = 14;
有了这个,CAN过滤器组肯定被分成了两个不同的部分。然后,您可以对CAN2使用从14到28的滤波器组编号。
https://stackoverflow.com/questions/46390303
复制相似问题