初级会员

- 积分
- 113
- 金钱
- 113
- 注册时间
- 2011-5-27
- 在线时间
- 11 小时
|
1金钱
各位大神,我用的STM32F072CBT6,调试CAN,换回模式收发都没有问题,但是接上USBCAN分析仪后,MCU给电脑发送,电脑上的的软件收不到数据;电脑软件给MCU发送,USBCAN的error灯亮,MCU收不到数据。哪位大神调过F072的CAN,指教一下!!!
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
uint32_t i = 0;
uint8_t TransmitMailbox = 0;
/* NVIC configuration *******************************************************/
/* Enable CAN RX0 interrupt IRQ channel */
NVIC_InitStructure.NVIC_IRQChannel = CEC_CAN_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 0x0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* CAN GPIOs configuration **************************************************/
/* Enable GPIO clock */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
/* Connect CAN pins to AF4 */
GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_4);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, GPIO_AF_4);
/* Configure CAN RX and TX pins */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 |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);
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;// | GPIO_Pin_12
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
//// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
// GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
// GPIO_Init(GPIOA, &GPIO_InitStructure);
/* CAN configuration ********************************************************/
/* Enable CAN clock */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);
/* 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_LoopBack;//CAN_Mode_Normal
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
/* CAN Baudrate = 1MBps (CAN clocked at 36 MHz) */
CAN_InitStructure.CAN_BS1 = CAN_BS1_9tq;//CAN_BS1_9tq
CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq;//CAN_BS2_8tq
CAN_InitStructure.CAN_Prescaler = 4;//2
// CAN_Baud_Process(500,&CAN_InitStructure);
CAN_Init(CAN, &CAN_InitStructure);
/* CAN filter init "FIFO0" */
CAN_FilterInitStructure.CAN_FilterNumber = 0;
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh = 0;//0x6420
CAN_FilterInitStructure.CAN_FilterIdLow = 0;//0x2461
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
/* CAN FIFO0 message pending interrupt enable */
CAN_ITConfig(CAN, CAN_IT_FMP0, ENABLE);
/* transmit */
TxMessage.StdId = 1;
TxMessage.ExtId = 0;
TxMessage.IDE = CAN_Id_Standard;
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.DLC = 2;
TxMessage.Data[0] = 0xCA;
TxMessage.Data[1] = 0xFE;
CAN_Transmit(CAN, &TxMessage);
|
最佳答案
查看完整内容[请看2#楼]
问题解决了,官方例程里的注释为CAN总线频率为36MH在,这个注释是错误的,CAN是挂在APB总线上的,所以CAN总线的频率应该为48MHz,所以根据48MHz来计算波特率才对。
下面是250kbps的配置
/* CAN Baudrate = 1MBps (CAN clocked at 48 MHz) */
CAN_InitStructure.CAN_BS1 = CAN_BS1_9tq;//CAN_BS1_9tq
CAN_InitStructure.CAN_BS2 = CAN_BS2_2tq;//CAN_BS2_8tq
CAN_InitStructure.CAN_Prescaler = 16;//2
// CAN_Bau ...
|