你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 8197|回复: 12

STM32F107 CAN收发问题(求助!)

[复制链接]

1

主题

9

回帖

0

蝴蝶豆

新手上路

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


void  can_configuration(void)
{
CAN_InitTypeDef         CAN_InitStructure;
CAN_FilterInitTypeDef  CAN_FilterInitStructure;
GPIO_InitTypeDef  GPIO_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 CAN1  pin(PB5): RX */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOD, &GPIO_InitStructure);  
/* Configure  CAN1 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 Software  Remapping */
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);
}

发送:
void  CanWriteData(void)
{
CanTxMsg TxMessage;

/* transmit  */
TxMessage.StdId = 0x55;  
TxMessage.RTR = CAN_RTR_DATA;  
TxMessage.IDE = CAN_ID_STD;   
TxMessage.DLC = 8;            
TxMessage.Data[0] = 0x55;   
TxMessage.Data[1] = 0x55;     
TxMessage.Data[2] = 0x55;   
TxMessage.Data[3] = 0x55;     
TxMessage.Data[4] = 0x55;   
TxMessage.Data[5] = 0x55;      
TxMessage.Data[6] = 0x55;   
TxMessage.Data[7] = 0x55;      
CAN_Transmit(CAN1,&TxMessage);  
}

接收:
void  CAN1_RX0_IRQHandler(void)
{
CanRxMsg RxMessage;

CAN_Receive(CAN1,CAN_FIFO0, &RxMessage);  
recv_frame.id =  RxMessage.StdId;
recv_frame.data_buff[0] = RxMessage.Data[0];
recv_frame.data_buff[1] = RxMessage.Data[1];
recv_frame.data_buff[2] = RxMessage.Data[2];
recv_frame.data_buff[3] = RxMessage.Data[3];
recv_frame.data_buff[4] = RxMessage.Data[4];
recv_frame.data_buff[5] = RxMessage.Data[5];
recv_frame.data_buff[6] = RxMessage.Data[6];
recv_frame.data_buff[7] = RxMessage.Data[7];
can_recv_flag =  ENABLE;
}
回复

使用道具 举报

1

主题

9

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
 楼主| 发表于 2012-7-20 11:26:01 | 显示全部楼层

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

都没人回复啊。。。。
回复 支持 反对

使用道具 举报

4

主题

51

回帖

0

蝴蝶豆

中级会员

最后登录
1970-1-1
发表于 2012-7-20 11:44:30 | 显示全部楼层

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

RxMessage.DLC 接收的数据长度是不是需要设置啊!
回复 支持 反对

使用道具 举报

4

主题

51

回帖

0

蝴蝶豆

中级会员

最后登录
1970-1-1
发表于 2012-7-20 11:46:20 | 显示全部楼层

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

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

使用道具 举报

1

主题

9

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
 楼主| 发表于 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 */
回复 支持 反对

使用道具 举报

4

主题

51

回帖

0

蝴蝶豆

中级会员

最后登录
1970-1-1
发表于 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 */ 

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

使用道具 举报

1

主题

9

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
 楼主| 发表于 2012-7-20 15:40:20 | 显示全部楼层

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

中断有使能了的,如果中断没使能的话,自闭环下,自发自收时,中断就收不到了
回复 支持 反对

使用道具 举报

1

主题

9

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
 楼主| 发表于 2012-7-20 15:56:05 | 显示全部楼层

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

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

使用道具 举报

1

主题

9

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
 楼主| 发表于 2012-7-20 16:30:55 | 显示全部楼层

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

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

使用道具 举报

1

主题

9

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
 楼主| 发表于 2012-7-20 16:39:26 | 显示全部楼层

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

问题补充:上面说错了,刚才又测了一下,接上终端电阻,总线及107的CAN控制器管脚都是有波形的,但检测到的还是位填充错误。。。。郁闷哪
回复 支持 反对

使用道具 举报

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版