STM32F429进不了CAN接收中断

dandelion4277 2018-09-27 01:17:30

使用STM32F429,SN65HVD230芯片,8脚接1K电阻。用5块板子测试,A机轮询查看其它四台机子数据,每一台都有120欧终端电阻,机子之间2m距离。
目前,如果是4台机子测试时,A机能够轮询其它3台机子数据,同时也能正常FIFO0的接收中断。但如果将第4台接上,A机就无法轮询了,无法进入接收中断。
请问下各位大侠,可能是哪方面出了问题,有点急,谢谢各位了!
下面是CAN1的主要配置:
GPIO_InitTypeDef GPIO_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
uint16_t mask = 0x7FF, temp;
//显示屏、主副机要关注的报文ID
uint16_t FilterIDDISP[]={NUMASENDDATA, NUMBSENDDATA, NUMCSENDDATA,
NUMDSENDDATA, NUMESENDDATA, NUMFSENDDATA
};
uint16_t FilterIDA[]={DISPCLEANOUT,DISPSENDTEMPLIMIT, DISPSENDDELAYLIMIT, DISPSENDRESTORE,
REQUEST_NUMADATA
};
uint16_t FilterIDB[]={DISPCLEANOUT,DISPSENDTEMPLIMIT, DISPSENDDELAYLIMIT, DISPSENDRESTORE,
NUMASENDFANCMD, NUMASENDVIRUSCMD,
REQUEST_NUMADATA
};
uint16_t FilterIDC[]={DISPCLEANOUT,DISPSENDTEMPLIMIT, DISPSENDDELAYLIMIT, DISPSENDRESTORE,
NUMASENDFANCMD, NUMASENDVIRUSCMD,
REQUEST_NUMADATA
};
uint16_t FilterIDD[]={DISPCLEANOUT, DISPSENDTEMPLIMIT, DISPSENDDELAYLIMIT, DISPSENDRESTORE,
NUMASENDFANCMD, NUMASENDVIRUSCMD,
REQUEST_NUMADATA
};
uint16_t FilterIDE[]={DISPCLEANOUT, DISPSENDTEMPLIMIT, DISPSENDDELAYLIMIT, DISPSENDRESTORE,
NUMASENDFANCMD, NUMASENDVIRUSCMD,
REQUEST_NUMADATA
};
uint16_t FilterIDF[]={DISPCLEANOUT, DISPSENDTEMPLIMIT, DISPSENDDELAYLIMIT, DISPSENDRESTORE,
NUMASENDFANCMD, NUMASENDVIRUSCMD,
REQUEST_NUMADATA
};
/* CAN GPIOs 配置*/
/* 使能GPIO时钟 */
RCC_AHB1PeriphClockCmd(CAN_GPIO_TX_CLK|CAN_GPIO_RX_CLK, ENABLE);

/* 引脚映射为CAN功能 */
GPIO_PinAFConfig(CAN_GPIO_RX_PORT, CAN_RX_SOURCE, CAN_AF_PORT);
GPIO_PinAFConfig(CAN_GPIO_TX_PORT, CAN_TX_SOURCE, CAN_AF_PORT);

/* 配置 CAN RX 和 TX 引脚 */
GPIO_InitStructure.GPIO_Pin = CAN_RX_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(CAN_GPIO_RX_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = CAN_TX_PIN;
GPIO_Init(CAN_GPIO_TX_PORT, &GPIO_InitStructure);

/* CAN配置*/
/* 使能CAN时钟 */
RCC_APB1PeriphClockCmd(CAN_CLK, ENABLE);

/* 复位CAN寄存器 */
CAN_DeInit(CANx);

/*
TTCM = time triggered communication mode
ABOM = automatic bus-off management
AWUM = automatic wake-up mode
NART = no automatic retransmission
RFLM = receive FIFO locked mode
TXFP = transmit FIFO priority
*/
CAN_InitStructure.CAN_TTCM = DISABLE; /* 禁止时间触发模式(不生成时间戳), T */
CAN_InitStructure.CAN_ABOM = DISABLE; /* 禁止自动总线关闭管理 */
CAN_InitStructure.CAN_AWUM = ENABLE; /* 禁止自动唤醒模式 */
CAN_InitStructure.CAN_NART = DISABLE; /* 禁止仲裁丢失或出错后的自动重传功能 */
CAN_InitStructure.CAN_RFLM = DISABLE; /* 禁止接收FIFO加锁模式 */
CAN_InitStructure.CAN_TXFP = DISABLE; /* 禁止传输FIFO优先级 */
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; /* 设置CAN为正常工作模式 */

/*
CAN 波特率 = RCC_APB1Periph_CAN1 / Prescaler / (SJW + BS1 + BS2);

SJW = synchronisation_jump_width
BS = bit_segment

本例中,设置CAN波特率为0.5Mbsp
CAN 波特率 = 420000000 / 7 / (1 + 9 + 2) / = 0.5Mbsp,采样点为83.3%
另外尽可能的把采样点设置为 CiA 推荐的值:
75% when 波特率 > 800K
80% when 波特率 > 500K
87.5% when 波特率 <= 500K
采样点=(CAN_SJW+CAN_BS1)/(CAN_SJW+CAN_BS1+CAN_BS2)
*/
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1 = CAN_BS1_9tq;
CAN_InitStructure.CAN_BS2 = CAN_BS2_2tq;
CAN_InitStructure.CAN_Prescaler = 7;
CAN_Init(CANx, &CAN_InitStructure);

/* 设置CAN滤波器0 */
CAN_FilterInitStructure.CAN_FilterNumber = 2; /* 滤波器序号,0-13,共14个滤波器 */
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; /* 滤波器模式,设置ID掩码模式 */
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; /* 32位滤波 */
if(MACHINEDISP == MachineNum)
{
mask = 0x7FF;
for(uint32_t i =0; i < sizeof(FilterIDDISP)/sizeof(FilterIDDISP[0]); i++)
{
temp = FilterIDDISP[i] ^ (~FilterIDDISP[0]);
mask &= temp;
}
CAN_FilterInitStructure.CAN_FilterIdHigh = (FilterIDDISP[0]<<5); /* 掩码后ID的高16bit */
CAN_FilterInitStructure.CAN_FilterIdLow = 0; /* 掩码后ID的低16bit */
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (mask<<5); /* ID掩码值高16bit */
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
}
else if(MACHINENUMA == MachineNum)
{
mask = 0x7FF;
for(uint32_t i =0; i < sizeof(FilterIDA)/sizeof(FilterIDA[0]); i++)
{
temp = FilterIDA[i] ^ (~FilterIDA[0]);
mask &= temp;
}
CAN_FilterInitStructure.CAN_FilterIdHigh = (FilterIDA[0]<<5); /* 掩码后ID的高16bit */
CAN_FilterInitStructure.CAN_FilterIdLow = 0; /* 掩码后ID的低16bit */
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (mask<<5); /* ID掩码值高16bit */
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;

}
else if(MACHINENUMB == MachineNum)
{
mask = 0x7FF;
for(uint32_t i =0; i < sizeof(FilterIDB)/sizeof(FilterIDB[0]); i++)
{
temp = FilterIDB[i] ^ (~FilterIDB[0]);
mask &= temp;
}
CAN_FilterInitStructure.CAN_FilterIdHigh = (FilterIDB[0]<<5); /* 掩码后ID的高16bit */
CAN_FilterInitStructure.CAN_FilterIdLow = 0; /* 掩码后ID的低16bit */
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (mask<<5); /* ID掩码值高16bit */
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
}
else if(MACHINENUMC == MachineNum)
{
mask = 0x7FF;
for(uint32_t i =0; i < sizeof(FilterIDC)/sizeof(FilterIDC[0]); i++)
{
temp = FilterIDC[i] ^ (~FilterIDC[0]);
mask &= temp;
}
CAN_FilterInitStructure.CAN_FilterIdHigh = FilterIDC[0]<<5; /* 掩码后ID的高16bit */
CAN_FilterInitStructure.CAN_FilterIdLow = 0; /* 掩码后ID的低16bit */
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (mask<<5); /* ID掩码值高16bit */
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
}
else if(MACHINENUMD == MachineNum)
{
mask = 0x7FF;
for(uint32_t i =0; i < sizeof(FilterIDD)/sizeof(FilterIDD[0]); i++)
{
temp = FilterIDD[i] ^ (~FilterIDD[0]);
mask &= temp;
}
CAN_FilterInitStructure.CAN_FilterIdHigh = FilterIDD[0]<<5; /* 掩码后ID的高16bit */
CAN_FilterInitStructure.CAN_FilterIdLow = 0; /* 掩码后ID的低16bit */
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (mask<<5); /* ID掩码值高16bit */
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
}
else if(MACHINENUME == MachineNum)
{
mask = 0x7FF;
for(uint32_t i =0; i < sizeof(FilterIDE)/sizeof(FilterIDE[0]); i++)
{
temp = FilterIDE[i] ^ (~FilterIDE[0]);
mask &= temp;
}
CAN_FilterInitStructure.CAN_FilterIdHigh = FilterIDE[0]<<5;
...全文
871 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
yishumei 2018-09-28
  • 打赏
  • 举报
回复
1楼正解,485或CAN多机通讯只在起始机位和终点机位接入终端电阻,常用120Ω。终端电阻阻值错误或者位置接错会使通讯信号产生反射波,造成通讯故障。
然油宝 2018-09-27
  • 打赏
  • 举报
回复
正常一个can网络上最多只挂两个终端电阻。挂多了不保证正常通信

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧