OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4836|回复: 6

关于STM32103的can通信问题

[复制链接]

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2015-4-5
在线时间
18 小时
发表于 2015-4-5 13:50:27 | 显示全部楼层 |阅读模式
5金钱
各位大神,小弟最近在做两块32板子CAN通信的实验。现在发送接收都OK,数据也都对的。但是每次接收都需要我把接收的板子重新复位一次。我感觉是自己接收中断写错了,所以程序卡在里面了,我是不是应该把清除挂起中断改成清除发送中断,各位谁给我点建议。。。下面附上我的代码,请各位帮小弟看看问题出在哪里。
这个是接收中断:
[mw_shl_code=c,true]void USB_LP_CAN1_RX0_IRQHandler(void) { CanRxMsg RxMessage; CAN_Receive(CAN1,CAN_FIFO0, &RxMessage); CAN_ID=RxMessage.StdId; CAN_DATA0=RxMessage.Data[0]; CAN_DATA1=RxMessage.Data[1]; CAN_DATA2=RxMessage.Data[2]; CAN_DATA3=RxMessage.Data[3]; CAN_DATA4=RxMessage.Data[4]; CAN_DATA5=RxMessage.Data[5]; CAN_DATA6=RxMessage.Data[6]; CAN_DATA7=RxMessage.Data[7]; CAN_ClearITPendingBit(CAN1,CAN_IT_FMP0); /* 清除挂起中断 */ ←是不是这句有问题? CanFlag = ENABLE; }[/mw_shl_code]


主函数:
[mw_shl_code=c,true]int main(void) { delay_init(); CAN_Configuration(); USART_Configuration(); printf("\r\n"); printf("*****************************************************************\r\n"); printf("* *\r\n"); printf("* Thank you for using HY-RedBull V3.0 Development Board !^_^ *\r\n"); printf("* *\r\n"); printf("*****************************************************************\r\n"); printf("CAN-Bus Test \r\n"); printf("CAN-Bus Speed 100kHz \r\n"); /* Infinite loop */ while (1) { if( CanFlag == ENABLE ) { CanFlag = DISABLE; printf("CAN Receive Data \r\n"); printf("CAN ID %x \r\n",CAN_ID); printf("CAN_DATA0 %x \r\n",CAN_DATA0); printf("CAN_DATA1 %x \r\n",CAN_DATA1); printf("CAN_DATA2 %x \r\n",CAN_DATA2); printf("CAN_DATA3 %x \r\n",CAN_DATA3); printf("CAN_DATA4 %x \r\n",CAN_DATA4); printf("CAN_DATA5 %x \r\n",CAN_DATA5); printf("CAN_DATA6 %x \r\n",CAN_DATA6); printf("CAN_DATA7 %x \r\n",CAN_DATA7); } CanWriteData(0xA5A5); if( Display ) { /*====LED-ON=======*/ GPIO_SetBits(GPIOF , GPIO_Pin_6); GPIO_SetBits(GPIOF , GPIO_Pin_7); GPIO_SetBits(GPIOF , GPIO_Pin_8); GPIO_SetBits(GPIOF , GPIO_Pin_9); } else { /*====LED-OFF=======*/ GPIO_ResetBits(GPIOF , GPIO_Pin_6); GPIO_ResetBits(GPIOF , GPIO_Pin_7); GPIO_ResetBits(GPIOF , GPIO_Pin_8); GPIO_ResetBits(GPIOF , GPIO_Pin_9); } Display = ~Display; delay_ms(200); /* delay 200ms */ } }[/mw_shl_code]


最佳答案

查看完整内容[请看2#楼]

参考下我们的代码: [mw_shl_code=c,true]//接收数据 //fifox:邮箱号 //id:标准ID(11位)/扩展ID(11位+18位) //ide:0,标准帧;1,扩展帧 //rtr:0,数据帧;1,远程帧 //len:接收到的数据长度(固定为8个字节,在时间触发模式下,有效数据为6个字节) //dat:数据缓存区 void CAN_Rx_Msg(u8 fifox,u32 *id,u8 *ide,u8 *rtr,u8 *len,u8 *dat) { *ide=CAN1->sFIFOMailBox[fifox].RIR&0x04; //得到标识符选择位的值 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-4-5 13:50:28 | 显示全部楼层
参考下我们的代码:
[mw_shl_code=c,true]//接收数据 //fifox:邮箱号 //id:标准ID(11位)/扩展ID(11位+18位) //ide:0,标准帧;1,扩展帧 //rtr:0,数据帧;1,远程帧 //len:接收到的数据长度(固定为8个字节,在时间触发模式下,有效数据为6个字节) //dat:数据缓存区 void CAN_Rx_Msg(u8 fifox,u32 *id,u8 *ide,u8 *rtr,u8 *len,u8 *dat) { *ide=CAN1->sFIFOMailBox[fifox].RIR&0x04; //得到标识符选择位的值 if(*ide==0)//标准标识符 { *id=CAN1->sFIFOMailBox[fifox].RIR>>21; }else //扩展标识符 { *id=CAN1->sFIFOMailBox[fifox].RIR>>3; } *rtr=CAN1->sFIFOMailBox[fifox].RIR&0x02; //得到远程发送请求值. *len=CAN1->sFIFOMailBox[fifox].RDTR&0x0F; //得到DLC //*fmi=(CAN1->sFIFOMailBox[FIFONumber].RDTR>>8)&0xFF;//得到FMI //接收数据 dat[0]=CAN1->sFIFOMailBox[fifox].RDLR&0XFF; dat[1]=(CAN1->sFIFOMailBox[fifox].RDLR>>8)&0XFF; dat[2]=(CAN1->sFIFOMailBox[fifox].RDLR>>16)&0XFF; dat[3]=(CAN1->sFIFOMailBox[fifox].RDLR>>24)&0XFF; dat[4]=CAN1->sFIFOMailBox[fifox].RDHR&0XFF; dat[5]=(CAN1->sFIFOMailBox[fifox].RDHR>>8)&0XFF; dat[6]=(CAN1->sFIFOMailBox[fifox].RDHR>>16)&0XFF; dat[7]=(CAN1->sFIFOMailBox[fifox].RDHR>>24)&0XFF; if(fifox==0)CAN1->RF0R|=0X20;//释放FIFO0邮箱 else if(fifox==1)CAN1->RF1R|=0X20;//释放FIFO1邮箱 } #if CAN_RX0_INT_ENABLE //使能RX0中断 //中断服务函数 void USB_LP_CAN1_RX0_IRQHandler(void) { u8 rxbuf[8]; u32 id; u8 ide,rtr,len; CAN_Rx_Msg(0,&id,&ide,&rtr,&len,rxbuf); printf("id:%d\r\n",id); printf("ide:%d\r\n",ide); printf("rtr:%d\r\n",rtr); printf("len:%d\r\n",len); printf("rxbuf[0]:%d\r\n",rxbuf[0]); printf("rxbuf[1]:%d\r\n",rxbuf[1]); printf("rxbuf[2]:%d\r\n",rxbuf[2]); printf("rxbuf[3]:%d\r\n",rxbuf[3]); printf("rxbuf[4]:%d\r\n",rxbuf[4]); printf("rxbuf[5]:%d\r\n",rxbuf[5]); printf("rxbuf[6]:%d\r\n",rxbuf[6]); printf("rxbuf[7]:%d\r\n",rxbuf[7]); } #endif[/mw_shl_code]


我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2015-4-5
在线时间
18 小时
 楼主| 发表于 2015-4-5 13:50:28 | 显示全部楼层
之前说过要上传关于双机CAN通信的相关程序。现在附上~我用的板子是f103,只是写了简单的接收发送,然后串口验证发送是否正确,欢迎大神指正哈

CAN.7z

609.53 KB, 下载次数: 302

回复

使用道具 举报

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2015-4-5
在线时间
18 小时
 楼主| 发表于 2015-4-7 16:24:15 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
好的,原子哥。已解决,是我在写发送函数的时候加了一个挂起中断,结果程序死在里面了。完全是我自己的失误,不应该啊。。后面我把我的代码上传上来,供大家学习~~
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2015-4-8
在线时间
0 小时
发表于 2015-4-8 12:39:11 | 显示全部楼层
回复【3楼】小t是个好孩纸:
---------------------------------
楼主能把can代码发个给我吗,最近在搞这个,都没反应,邮箱sherlock048690@163.com
回复

使用道具 举报

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2015-4-5
在线时间
18 小时
 楼主| 发表于 2015-4-9 21:03:25 | 显示全部楼层
回复【4楼】夜明:
---------------------------------
已上传,欢迎讨论学习
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-4-9 22:40:37 | 显示全部楼层
回复【6楼】小t是个好孩纸:
---------------------------------
谢谢分享
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-24 07:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表