新手上路
- 积分
- 28
- 金钱
- 28
- 注册时间
- 2021-2-26
- 在线时间
- 3 小时
|
1金钱
目前用stm32F103C8T6 进行can调试,采用PB8\PB9脚,目前发送已经能正常发送,采用can调试器监控数据一切正常。接收无法收到数据。感觉进入不了中断,请大神帮忙分析,谢谢!程序附上:
u8 CAN1_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)
{
GPIO_InitTypeDef GPIO_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
CanTxMsg TxMessage;
#if CAN1_RX0_INT_ENABLE
NVIC_InitTypeDef NVIC_InitStructure;
#endif
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE); //新增复用功能
GPIO_PinRemapConfig(GPIO_Remap1_CAN1,ENABLE);
//GPIO_PinAFConfig(GPIOB,GPIO_PinSource8,GPIO_AF_CAN1); //GPIOA11复用为CAN1
//GPIO_PinAFConfig(GPIOB,GPIO_PinSource9,GPIO_AF_CAN1); //GPIOA12复用为CAN1
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;//RX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//TX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);
CAN_InitStructure.CAN_TTCM=DISABLE;
CAN_InitStructure.CAN_ABOM=DISABLE;
CAN_InitStructure.CAN_AWUM=DISABLE;
CAN_InitStructure.CAN_NART=DISABLE;
CAN_InitStructure.CAN_RFLM=DISABLE;
CAN_InitStructure.CAN_TXFP=DISABLE;
CAN_InitStructure.CAN_Mode= mode;//CAN_Mode_Normal;
CAN_InitStructure.CAN_SJW=tsjw;//值1
CAN_InitStructure.CAN_BS1=tbs1; //值1
CAN_InitStructure.CAN_BS2=tbs2;//值1
CAN_InitStructure.CAN_Prescaler=brp;
CAN_Init(CAN1, &CAN_InitStructure);
CAN_FilterInitStructure.CAN_FilterNumber=0;
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x1000;
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xFFFF;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;//CAN_Filter_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
#if CAN1_RX0_INT_ENABLE
CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0消息挂号中断屏蔽
CAN_ITConfig(CAN1,CAN_IT_TME,ENABLE);//发送邮箱空中断屏蔽
CAN_ITConfig(CAN1,CAN_IT_BOF,ENABLE);//离线中断屏蔽
NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//11
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
#endif
return 0;
}
#if CAN1_RX0_INT_ENABLE
/* USB中断和CAN接收中断服务程序,USB跟CAN公用I/O,这里只用到CAN的中断。 */
void USB_LP_CAN1_RX0_IRQHandler(void)
{
int i=0;
CanRxMsg RxMessage;
if( CAN_MessagePending(CAN1,CAN_FIFO0)==0)return 0; //没有接收到数据,直接退出
//CAN_Receive(CAN1, 0, &RxMessage);//另一中写法:0改为CAN_FIFO0
//Message.StdId=0x00;
RxMessage.ExtId=0X00;//0];//0x00;
RxMessage.IDE=0;//CAN_ID_EXT;
RxMessage.DLC=0;//
RxMessage.RTR=0;//CAN_RTR_DATA;
RxMessage.FMI=0;
RxMessage.Data[0]= 0x00;
RxMessage.Data[1]= 0x00;
for(i=0;i<8;i++)
RxMessage.Data[i]= 0;
//USART1_DATA(RxMessage.Data,RxMessage.DLC);
//printf("IRQ RxMessage.Data = %s\r\n", RxMessage.Data);
CAN_Receive(CAN1,CAN_FIFO0, &RxMessage);//另一中写法:0改为CAN_FIFO0
extidd[0]=RxMessage.ExtId;
//memset(&RxMessage,0,8);
receive_addr_extidd=extidd[0];
RxMessage.Data[i]=buf[i];//0;
can_receive_process();
// CAN_ClearITPendingBit(CAN1,CAN_IT_FMP0);
}
#endif
|
|