sparkwxl 发表于 2012-7-20 10:49:42

STM32F107 CAN收发问题(求助!)

最近在用107的板子在调试CAN,参考了网上的代码,用CAN1通讯,板子上对应的IO为PD0,PD1,已经remap,中断接收,轮循发送,自发自收没有问题,NORMAL模式下就无法收到CAN盒的数据帧,CAN盒也收不到板子发送的数据帧(追踪到发送状态一直是CAN_TxStatus_Pending),用示波器量过,发送和接收时总线上都是有差分信号出来的,检查了代码,发现好像也没啥问题,求指正!


voidcan_configuration(void)
{
CAN_InitTypeDef         CAN_InitStructure;
CAN_FilterInitTypeDefCAN_FilterInitStructure;
GPIO_InitTypeDefGPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

/* GPIOB Periph clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO |   RCC_APB2Periph_GPIOD ,ENABLE);
/* Enable CAN1 clock*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1 , ENABLE);

NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);


/* Configure CAN1pin(PB5): RX */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOD, &GPIO_InitStructure);
/* ConfigureCAN1 pin(PB6): TX */
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);

/* Enable the USART2 Pins SoftwareRemapping */
GPIO_PinRemapConfig(GPIO_Remap2_CAN1,ENABLE);


/* CAN1 register init */
CAN_DeInit(CAN1);
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 = ENABLE;
CAN_InitStructure.CAN_Mode =CAN_Mode_Normal;
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 = 9;   //500kHz

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=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);

CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE);
}

发送:
voidCanWriteData(void)
{
CanTxMsg TxMessage;

/* transmit*/
TxMessage.StdId = 0x55;
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.IDE = CAN_ID_STD;   
TxMessage.DLC = 8;            
TxMessage.Data = 0x55;   
TxMessage.Data = 0x55;   
TxMessage.Data = 0x55;   
TxMessage.Data = 0x55;   
TxMessage.Data = 0x55;   
TxMessage.Data = 0x55;      
TxMessage.Data = 0x55;   
TxMessage.Data = 0x55;      
CAN_Transmit(CAN1,&TxMessage);
}

接收:
voidCAN1_RX0_IRQHandler(void)
{
CanRxMsg RxMessage;

CAN_Receive(CAN1,CAN_FIFO0, &RxMessage);
recv_frame.id =RxMessage.StdId;
recv_frame.data_buff = RxMessage.Data;
recv_frame.data_buff = RxMessage.Data;
recv_frame.data_buff = RxMessage.Data;
recv_frame.data_buff = RxMessage.Data;
recv_frame.data_buff = RxMessage.Data;
recv_frame.data_buff = RxMessage.Data;
recv_frame.data_buff = RxMessage.Data;
recv_frame.data_buff = RxMessage.Data;
can_recv_flag =ENABLE;
}

sparkwxl 发表于 2012-7-20 11:26:01

RE:STM32F107 CAN收发问题(求助!)

都没人回复啊。。。。:o

cedar-358594 发表于 2012-7-20 11:44:30

RE:STM32F107 CAN收发问题(求助!)

RxMessage.DLC 接收的数据长度是不是需要设置啊!

cedar-358594 发表于 2012-7-20 11:46:20

RE:STM32F107 CAN收发问题(求助!)

你调试CAN 是不是需要从设备啊,没有接收设备吗,还有你的波特率好像也没有设置啊

sparkwxl 发表于 2012-7-20 11:57:26

RE:STM32F107 CAN收发问题(求助!)

接收数据长度是按标准帧来的,应该不用设置吧,现在是接收中断都没有进。。。
我是107的板子和周立功的USBCAN-II作通讯
波特率在这几句中设置了的
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 = 9; //500kHz
/* CANbps= Fpclk/((BRP+1)*((Tseg1+1)+(Tseg2+1)+1)此处计算为CANbps=36000000/(9*(4+3+1))=500kHz */

cedar-358594 发表于 2012-7-20 15:10:18

回复:STM32F107 CAN收发问题(求助!)

回复第 5 楼 于2012-07-20 11:57:26发表:
接收数据长度是按标准帧来的,应该不用设置吧,现在是接收中断都没有进。。。
我是107的板子和周立功的USBCAN-II作通讯
波特率在这几句中设置了的
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 = 9; //500kHz
/* CANbps= Fpclk/((BRP+1)*((Tseg1+1)+(Tseg2+1)+1) 此处计算为 CANbps=36000000/(9*(4+3+1))=500kHz */ 

你现在就是中断不能进去吗,那就是中断设置的问题,你看看看中断都使能了,中断入口正确吗
 

sparkwxl 发表于 2012-7-20 15:40:20

回复:STM32F107 CAN收发问题(求助!)

中断有使能了的,如果中断没使能的话,自闭环下,自发自收时,中断就收不到了

sparkwxl 发表于 2012-7-20 15:56:05

RE:STM32F107 CAN收发问题(求助!)

进一步追踪接收的问题,当CAN盒发送出数据帧时,107这边中断没触发,查询CAN_FLAG_LEC,发现返回0x01,位填充错误。。。
请教位填充错误是哪里设置错误?如何解决?

sparkwxl 发表于 2012-7-20 16:30:55

RE:STM32F107 CAN收发问题(求助!)

问题补充:现在出现位填充错误,不知道是不是跟我107板子上,CAN_H和CAN_L之间没有接120欧的终端电阻造成的?但我接上这个终端电阻,在传送数据帧时,总线上就没波形了。。。。求解!

sparkwxl 发表于 2012-7-20 16:39:26

RE:STM32F107 CAN收发问题(求助!)

问题补充:上面说错了,刚才又测了一下,接上终端电阻,总线及107的CAN控制器管脚都是有波形的,但检测到的还是位填充错误。。。。郁闷哪
页: [1] 2
查看完整版本: STM32F107 CAN收发问题(求助!)