大家好,我用的是STM32F042F6,TSSOP20芯片,CAN引脚为PA11,PA12(与PA9,PA10复用) 当设置为CAN_Mode_LoopBack时,可以在用示波器在TX引脚看到波形,并且程序里可以接收到数据; 当设置为CAN_Mode_Normal时,TX引脚看不到波形,并且也不能接受发送CAN数据。 代码如下,请大家帮忙看看,谢谢!! void CAN1_Init(u16 Baudrate,u16 Receive_MsgId) { GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; CAN_InitTypeDef CAN_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure; /* CAN1 Periph clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA , ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); SYSCFG->CFGR1 |= (uint32_t)SYSCFG_CFGR1_PA11_PA12_RMP; GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_4); GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, GPIO_AF_4); /* Configure CAN pin: RX */ // PA11 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; 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(GPIOA, &GPIO_InitStructure); /* Configure CAN pin: TX */ // PA12 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; 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(GPIOA, &GPIO_InitStructure); /* enabling interrupt */ NVIC_InitStructure.NVIC_IRQChannel = CEC_CAN_IRQn;; NVIC_InitStructure.NVIC_IRQChannelPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); //CAN_INIT();//CA???N?? /* CAN register init */ // CAN_DeInit(CAN); // CAN_StructInit(&CAN_InitStructure); /* CAN cell init */ 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 = CAN_Mode_Normal;//CAN_Mode_LoopBack; // CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; CAN_InitStructure.CAN_BS1 = CAN_BS1_4tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_3tq; CAN_InitStructure.CAN_Prescaler=6; CAN_Init(CAN,&CAN_InitStructure); CAN_FilterInitStructure.CAN_FilterNumber = 1; CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdList; CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; CAN_FilterInitStructure.CAN_FilterIdHigh= (((u32)Receive_MsgId<<21)&0xFFFF0000)>>16; // CAN_FilterInitStructure.CAN_FilterIdHigh=0X00; //????ID?? CAN_FilterInitStructure.CAN_FilterIdLow= (((u32)Receive_MsgId<<21)|CAN_ID_STD|CAN_RTR_DATA)&0xFFFF; //????ID?? CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF; CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF; CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0; CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; CAN_FilterInit(&CAN_FilterInitStructure); /* CAN FIFO0 message pending interrupt enable */ CAN_ITConfig(CAN,CAN_IT_FMP0, ENABLE); } |
否则你对面设备没接,单片机CAN外设就认为通信出错了,也就不会再正常发送了。
所以你把另一边的CAN设备接上再测测。
参考http://community.st.com/s/questi ... /can-loopbacknormal
另外环回模式就是用来测代码的,环回下没问题,代码配置一般就不会有问题
评分
查看全部评分
19-ISO_CAN.zip
2019-4-24 16:30 上传
点击文件名下载附件
下载积分: ST金币 -12.07 MB, 下载次数: 32, 下载积分: ST金币 -1
评分
查看全部评分
CAN正常收发时,必须是两个以上的CAN接点才行,单个节点是会报错的。
只要你的回环模式测试没有问题,这时只要把模式改成正常模式,就可以正常CAN通信了。
从MCU的CAN_TX、CAN_RX引出来后,必须加CAN收发器才行,过收发器后转成CAN电平连接外部的CAN接点。
评分
查看全部评分
我的程序也是在19-ISO基础上做了更改,因为19-ISO这个程序的CAN用的是其他端口,我用的芯片是TSSP20封装,CAN脚用的是PA11,PA12,需要做端口映射一下。