社区
智能硬件
帖子详情
基于STM32的CAN的收发程序怎么写?
就是干吧
2017-08-16 02:37:20
谁知道CAN的收发程序怎么写?拜托啦
...全文
503
2
打赏
收藏
基于STM32的CAN的收发程序怎么写?
谁知道CAN的收发程序怎么写?拜托啦
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
small_clown
2017-09-05
打赏
举报
回复
#include "can.h" #include "led.h" #include "delay.h" #include "usart.h" ////////////////////////////////////////////////////////////////////////////////// //±¾³ÌÐòÖ»¹©Ñ§Ï°Ê¹Óã¬Î´¾×÷ÕßÐí¿É£¬²»µÃÓÃÓÚÆäËüÈκÎÓÃ; //ALIENTEKÕ½½¢STM32¿ª·¢°å //CANÇý¶¯ ´úÂë //ÕýµãÔ×Ó@ALIENTEK //¼¼ÊõÂÛ̳:www.openedv.com //ÐÞ¸ÄÈÕÆÚ:2012/9/11 //°æ±¾£ºV1.0 //°æȨËùÓУ¬µÁ°æ±Ø¾¿¡£ //Copyright(C) ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾ 2009-2019 //All rights reserved ////////////////////////////////////////////////////////////////////////////////// //CAN³õʼ»¯ //tsjw:ÖØÐÂͬ²½ÌøԾʱ¼äµ¥Ôª.·¶Î§:1~3; CAN_SJW_1tq CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tq //tbs2:ʱ¼ä¶Î2µÄʱ¼äµ¥Ôª.·¶Î§:1~8; //tbs1:ʱ¼ä¶Î1µÄʱ¼äµ¥Ôª.·¶Î§:1~16; CAN_BS1_1tq ~CAN_BS1_16tq //brp :²¨ÌØÂÊ·ÖƵÆ÷.·¶Î§:1~1024;(ʵ¼ÊÒª¼Ó1,Ò²¾ÍÊÇ1~1024) tq=(brp)*tpclk1 //×¢ÒâÒÔÉϲÎÊýÈκÎÒ»¸ö¶¼²»ÄÜÉèΪ0,·ñÔò»áÂÒ. //²¨ÌØÂÊ=Fpclk1/((tsjw+tbs1+tbs2)*brp); //mode:0,ÆÕͨģʽ;1,»Ø»·Ä£Ê½; //Fpclk1µÄʱÖÓÔÚ³õʼ»¯µÄʱºòÉèÖÃΪ36M,Èç¹ûÉèÖÃCAN_Normal_Init(1,8,7,5,1); //Ôò²¨ÌØÂÊΪ:36M/((1+8+7)*5)=450Kbps //·µ»ØÖµ:0,³õʼ»¯OK; // ÆäËû,³õʼ»¯Ê§°Ü; u8 CAN_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode) { GPIO_InitTypeDef GPIO_InitStructure; CAN_InitTypeDef CAN_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure; #if CAN_RX0_INT_ENABLE NVIC_InitTypeDef NVIC_InitStructure; #endif RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//ʹÄÜPORTAʱÖÓ RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//ʹÄÜCAN1ʱÖÓ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸´ÓÃÍÆÍì GPIO_Init(GPIOA, &GPIO_InitStructure); //³õʼ»¯IO GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//ÉÏÀÊäÈë GPIO_Init(GPIOA, &GPIO_InitStructure);//³õʼ»¯IO //CANµ¥ÔªÉèÖà CAN_InitStructure.CAN_TTCM=DISABLE; //·Çʱ¼ä´¥·¢Í¨ÐÅģʽ // CAN_InitStructure.CAN_ABOM=DISABLE; //Èí¼þ×Ô¶¯ÀëÏß¹ÜÀí // CAN_InitStructure.CAN_AWUM=DISABLE; //˯Ãßģʽͨ¹ýÈí¼þ»½ÐÑ(Çå³ýCAN->MCRµÄSLEEPλ)// CAN_InitStructure.CAN_NART=ENABLE; //½ûÖ¹±¨ÎÄ×Ô¶¯´«ËÍ // CAN_InitStructure.CAN_RFLM=DISABLE; //±¨ÎIJ»Ëø¶¨,еĸ²¸Ç¾ÉµÄ // CAN_InitStructure.CAN_TXFP=DISABLE; //ÓÅÏȼ¶Óɱ¨Îıêʶ·û¾ö¶¨ // CAN_InitStructure.CAN_Mode= mode; //ģʽÉèÖ㺠mode:0,ÆÕͨģʽ;1,»Ø»·Ä£Ê½; // //ÉèÖò¨ÌØÂÊ CAN_InitStructure.CAN_SJW=tsjw; //ÖØÐÂͬ²½ÌøÔ¾¿í¶È(Tsjw)Ϊtsjw+1¸öʱ¼äµ¥Î» CAN_SJW_1tq CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tq CAN_InitStructure.CAN_BS1=tbs1; //Tbs1=tbs1+1¸öʱ¼äµ¥Î»CAN_BS1_1tq ~CAN_BS1_16tq CAN_InitStructure.CAN_BS2=tbs2;//Tbs2=tbs2+1¸öʱ¼äµ¥Î»CAN_BS2_1tq ~ CAN_BS2_8tq CAN_InitStructure.CAN_Prescaler=brp; //·ÖƵϵÊý(Fdiv)Ϊbrp+1 // CAN_Init(CAN1, &CAN_InitStructure); // ³õʼ»¯CAN1 CAN_FilterInitStructure.CAN_FilterNumber=0; //¹ýÂËÆ÷0 CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32λ CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;////32λID CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32λMASK CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000; CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//¹ýÂËÆ÷0¹ØÁªµ½FIFO0 CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //¼¤»î¹ýÂËÆ÷0 CAN_FilterInit(&CAN_FilterInitStructure);//Â˲¨Æ÷³õʼ»¯ #if CAN_RX0_INT_ENABLE CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0ÏûÏ¢¹ÒºÅÖжÏÔÊÐí. NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // Ö÷ÓÅÏȼ¶Îª1 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // ´ÎÓÅÏȼ¶Îª0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); #endif return 0; } #if CAN_RX0_INT_ENABLE //ʹÄÜRX0ÖÐ¶Ï //ÖжϷþÎñº¯Êý void USB_LP_CAN1_RX0_IRQHandler(void) { CanRxMsg RxMessage; int i=0; CAN_Receive(CAN1, 0, &RxMessage); for(i=0;i<8;i++) printf("rxbuf[%d]:%d\r\n",i,RxMessage.Data[i]); } #endif //can·¢ËÍÒ»×éÊý¾Ý(¹Ì¶¨¸ñʽ:IDΪ0X12,±ê×¼Ö¡,Êý¾ÝÖ¡) //len:Êý¾Ý³¤¶È(×î´óΪ8) //msg:Êý¾ÝÖ¸Õë,×î´óΪ8¸ö×Ö½Ú. //·µ»ØÖµ:0,³É¹¦; // ÆäËû,ʧ°Ü; u8 Can_Send_Msg(u8* msg,u8 len) { u8 mbox; u16 i=0; CanTxMsg TxMessage; TxMessage.StdId=0x12; // ±ê×¼±êʶ·ûΪ0 TxMessage.ExtId=0x12; // ÉèÖÃÀ©Õ¹±êʾ·û£¨29룩 TxMessage.IDE=0; // ʹÓÃÀ©Õ¹±êʶ·û TxMessage.RTR=0; // ÏûÏ¢ÀàÐÍΪÊý¾ÝÖ¡£¬Ò»Ö¡8λ TxMessage.DLC=len; // ·¢ËÍÁ½Ö¡ÐÅÏ¢ for(i=0;i<len;i++) TxMessage.Data[i]=msg[i]; // µÚÒ»Ö¡ÐÅÏ¢ mbox= CAN_Transmit(CAN1, &TxMessage); i=0; while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++; //µÈ´ý·¢ËͽáÊø if(i>=0XFFF)return 1; return 0; } //can¿Ú½ÓÊÕÊý¾Ý²éѯ //buf:Êý¾Ý»º´æÇø; //·µ»ØÖµ:0,ÎÞÊý¾Ý±»ÊÕµ½; // ÆäËû,½ÓÊÕµÄÊý¾Ý³¤¶È; u8 Can_Receive_Msg(u8 *buf) { u32 i; CanRxMsg RxMessage; if( CAN_MessagePending(CAN1,CAN_FIFO0)==0)return 0; //ûÓнÓÊÕµ½Êý¾Ý,Ö±½ÓÍ˳ö CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);//¶ÁÈ¡Êý¾Ý for(i=0;i<8;i++) buf[i]=RxMessage.Data[i]; return RxMessage.DLC; }
一对二加王炸
2017-09-01
打赏
举报
回复
这个很简单啊,就配置好参数,写个收和发的函数进行了,函数里配置好RTR IDE STDID EXTDID等等
基于
STM32
的can
收发
程序
基于
stm32
的can通信,主要包含can
收发
程序
,变成语言是C,适合初学者学习can通信编程。
基于
STM32
F107的can通讯例程
基于
STM32
F107的can通讯历程,上电运行此
程序
后,按下KEY1 按键后CAN1 会向CAN2 发送数据,当CAN2 收的 数据后判断确实是CAN1 发来的数据,就会点亮LED2,代表CAN2 接收成功;按 下KEY2 按键后CAN2 会向CAN1 发送数据...
基于
stm32
的can
收发
例程
本
程序
可以提供新人学习can总线如何进行can
收发
,还有一些can的基础设计的流程
基于
STM32
F4移植FreeRTOS实现CAN1 CAN2 双向通信例程
本例程基于
STM32
F407实现了FreeRTOS的移植,实现了CAN1、 CAN2的双向通信以及IAP的在线升级,但是
程序
中并不包含IAP过程,仅仅是APP部分,所以有需要的朋友在编译的时候需要对环境做一些设置,否则跑不起来,IAP 的...
基于
STM32
F103C8T6的CAN总线通信
程序
用
STM32
F103C8T6核心板实现了can总线的基本配置,采用回环模式,定时发送can报文,回环接收到can报文后将led闪烁。本工程用keil4开发
智能硬件
1,616
社区成员
753
社区内容
发帖
与我相关
我的任务
智能硬件
智能硬件,智能手表,可穿戴设备,智能电视,谷歌眼镜,Google Glass 相关讨论。
复制链接
扫一扫
分享
社区描述
智能硬件,智能手表,可穿戴设备,智能电视,谷歌眼镜,Google Glass 相关讨论。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章