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

【经验分享】STM32F2-CAN通信-发送任意长度

[复制链接]
STMCU小助手 发布时间:2021-12-1 22:18
STM32F2-CAN通信-发送任意长度,调试好的,与大家分享

  1. #include "include.h"
  2. //************************************************************************************************************************************************
  3. //20190611调试完成
  4. //By Wang
  5. //************************************************************************************************************************************************

  6. CanRxMsg RxMessage;
  7. CanTxMsg TxMessage;
  8. //************************************************************************************************************************************************
  9. //函数名:void NVIC_Config(void)
  10. //功  能:  CAN通信接收RX0中断配置
  11. //参  数:无
  12. //返回值:无
  13. //************************************************************************************************************************************************

  14. void NVIC_Config(void)
  15. {
  16.   NVIC_InitTypeDef  NVIC_InitStructure;

  17. //#ifdef  USE_CAN1

  18.   NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;//与CAN1_RX1_IRQn;区别
  19.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;//不同的中断优先级一样会怎样
  20.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;

  21.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  22.   NVIC_Init(&NVIC_InitStructure);

  23. }

  24. //************************************************************************************************************************************************
  25. //函数名:void CAN_Config(void)
  26. //功  能:  CAN1配置 PD0-RX;PD1-TX
  27. //参  数:无
  28. //返回值;无
  29. //************************************************************************************************************************************************
  30. void CAN_Config(void)
  31. {
  32.   GPIO_InitTypeDef GPIO_InitStructure;
  33.   CAN_InitTypeDef CAN_InitStructure;
  34.   CAN_FilterInitTypeDef CAN_FilterInitStructure;

  35.   /* CAN GPIOs configuration ***********************************/
  36.   /* Enable GPIOD clock */
  37.   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

  38.   /* Connect PD1 to CAN1_Tx pin */
  39.   GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_CAN1);
  40.   /* Connect PD0 to CAN1_Rx pin */
  41.   GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_CAN1);

  42.   /* Configure CAN1_Rx(PD0) and CAN1_Tx(PD1) pins */
  43.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  44.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  45.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  46.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  47.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  48.   GPIO_Init(GPIOD, &GPIO_InitStructure);

  49.    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//Rx要单独初始化,否则进入不了中断,不能按照ST官方库来设定
  50.    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  51.    GPIO_Init(GPIOD, &GPIO_InitStructure);
  52.   /* CAN configuration *****************************************/
  53.     /* Enable CAN1 clock */
  54.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);

  55.   /* CAN register init */
  56.   CAN_DeInit(CAN1);
  57.   /* CAN cell init */
  58.   CAN_InitStructure.CAN_TTCM = DISABLE;
  59.   CAN_InitStructure.CAN_ABOM = DISABLE;
  60.   CAN_InitStructure.CAN_AWUM = DISABLE;
  61.   CAN_InitStructure.CAN_NART = DISABLE;
  62.   CAN_InitStructure.CAN_RFLM = DISABLE;
  63.   CAN_InitStructure.CAN_TXFP = DISABLE;
  64.   CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
  65.   CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
  66.   /* CAN Baudrate = 1MBps (CAN clocked at 30 MHz) */ //30/(1+6+8)/4=500k
  67.   CAN_InitStructure.CAN_BS1 = CAN_BS1_6tq;
  68.   CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq;
  69.   CAN_InitStructure.CAN_Prescaler = 4;
  70.   CAN_Init(CAN1, &CAN_InitStructure);

  71.   /* CAN filter init */
  72.   CAN_FilterInitStructure.CAN_FilterNumber = 0;
  73.   CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
  74.   CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
  75.   CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
  76.   CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
  77.   CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
  78.   CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
  79.   CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;
  80.   CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
  81.   CAN_FilterInit(&CAN_FilterInitStructure);

  82.   /* Enable FIFO 0 message pending Interrupt */  
  83.   Init_TxMes();//发送结构体参数初始化
  84.   Init_RxMes();//接收结构体参数初始化
  85.   NVIC_Config();//中断向量配置
  86.   CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);

  87. }
  88. //************************************************************************************************************************************************
  89. //函数名:void Init_TxMes(CanRxMsg *RxMessage)
  90. //功  能:  Initializes the Tx Message
  91. //参  数:无
  92. //返回值:无
  93. //************************************************************************************************************************************************
  94. void Init_TxMes()
  95. {
  96.     /* Transmit Structure preparation */
  97.   TxMessage.StdId = 0x123;//标准标识符,必须在( TxMessage.IDE = CAN_ID_STD;//标准帧)情况下才有效
  98.   TxMessage.ExtId = 0x00;//设置拓展标识符(29位),必须在( TxMessage.IDE = CAN_ID_EXT;//标准帧)情况下才有效
  99.   TxMessage.RTR = CAN_RTR_DATA;//数据帧
  100.   TxMessage.IDE = CAN_ID_STD;//标准帧
  101.   TxMessage.DLC = 8;//发送数据长度  DLC=0-8
  102. }
  103. //************************************************************************************************************************************************
  104. //函数名:void Init_RxMes(CanRxMsg *RxMessage)
  105. //功  能:  Initializes the Rx Message
  106. //参  数:无
  107. //返回值:无
  108. //************************************************************************************************************************************************
  109. void Init_RxMes()
  110. {
  111.   u8 i = 0;
  112.   RxMessage.StdId = 0x00;//这个可以在接收中断中判断 如果RxMessage->StdId = TxMessage.StdId 接收正确
  113.   RxMessage.ExtId = 0x00;//这个可以在接收中断中判断 如果RxMessage->ExtId = TxMessage.ExtId 接收正确
  114.   RxMessage.IDE = CAN_ID_STD;//这个可以在接收中断中判断 如果RxMessage->IDE = TxMessage.IDE 接收正确
  115.   RxMessage.DLC = 8;//接收数据长度
  116.   RxMessage.FMI =16;//????????????????

  117.   for (i = 0;i < 8;i++)
  118.   {
  119.     RxMessage.Data<i> = 0x00;</i>
  120.   }
  121. }
  122. //************************************************************************************************************************************************
  123. //函数名:void CAN1_RX0_IRQHandler()
  124. //功  能:  CAN1-RX0接收中断服务函数
  125. //参  数:无
  126. //返回值:无
  127. //************************************************************************************************************************************************
  128. void CAN1_RX0_IRQHandler()  //与CAN1_RX1_IRQHandler()区别
  129. {
  130.   if(CAN_GetITStatus(CAN1,CAN_IT_FMP0)!= RESET)//判断是否发生CAN-R0中断
  131.   {
  132.     CAN_ClearITPendingBit(CAN1,CAN_IT_FMP0);//清除中断标志
  133.     if(CAN_MessagePending(CAN1,CAN_FIFO0)!=0)//接收到数据
  134.        CAN_Receive(CAN1,CAN_Filter_FIFO0,&RxMessage);//接收数据最大只能8字节
  135.   }
  136.   Usart_Send_Buff(RxMessage.Data,8);//发送数据RS232通信   
  137. }
  138. //************************************************************************************************************************************************
  139. //函数名:u8 CAN_SendData()
  140. //功  能:  CAN发送数据  发送第二步
  141. //参  数:Msg数据指针;Length数据长度
  142. //返回值:返回成功/失败标志
  143. //************************************************************************************************************************************************
  144. u8 CAN_SendData(u8* Msg,u8 Length)
  145. {
  146.   u16 i=0;
  147.   u8 mbox=0x00;
  148.   TxMessage.DLC = Length;//发送数据长度  DLC=0-8
  149.   for(i=0;i<Length;i++)
  150.   {
  151. <span style="font-style: italic;"><span style="font-style: normal;">     TxMessage.Data=Msg</span><span style="font-style: italic;"><span style="font-style: normal;">;
  152.   }
  153.   mbox=CAN_Transmit(CAN1,&TxMessage);//发送数据  返回邮箱使用数量

  154. //  while((CAN_TransmitStatus(CAN1,mbox)!=CAN_TxStatus_Ok)&&(i<0xfff))
  155. //  {
  156. //    i++;
  157. //  }
  158. //  if(i>=0xfff)
  159. //  {
  160. //    return 0;//发送数据失败
  161. //  }
  162. //  return 1;//发送数据成功
  163. }
  164. //************************************************************************************************************************************************
  165. //函数名:void CAN_SendDataProces(u8* data,u8 Num)
  166. //功  能:CAN发送数据前期处理   发送第一步
  167. //参  数:data数据指针;Num数据长度
  168. //返回值:无
  169. //************************************************************************************************************************************************
  170. void CAN_SendDataProces(u8* data,u8 Num)
  171. {
  172.   u8 flag=0x00,i=0;
  173.   u8 Count=0x00,Left=0x00;

  174.   Count=Num/8;//求多少个8字节倍数
  175.   Left=Num%8;//剩余小于8字节的数量
  176.   for(i=0;i<Count;i++)
  177.   {
  178.     flag=CAN_SendData((data+i*8),8);//发送整8字节的数据
  179.   }
  180.   if(Left>0)//有余数才单独再发送一次
  181.   {
  182.     flag=CAN_SendData((data+8*Count),Left);//发送剩余字节
  183.   }
  184. }
  185. //************************************************************************************************************************************************
  186. </span>
  187. </span></span>
复制代码

收藏 评论0 发布时间:2021-12-1 22:18

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版