OpenEdv-开源电子网

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

关于stn32f4can总线的通讯问题

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2021-1-6
在线时间
3 小时
发表于 2021-1-6 19:58:15 | 显示全部楼层 |阅读模式
1金钱
新人小白一枚,最近在调试电机,使用到了电调,通过can总线向电调发送消息来控制电机,但是发送了数据,电机没有反应。。。有没有大神帮忙看下
  1. void CAN1_Init()
  2. {
  3.         //声明GPIO、NVIC、CAN、CAN筛选器的结构体
  4.         GPIO_InitTypeDef                 gpio;
  5.         NVIC_InitTypeDef                 nvic;
  6.         CAN_InitTypeDef                 can;
  7.         CAN_FilterInitTypeDef         can_filter;
  8.         //打开can1时钟
  9.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1,ENABLE);
  10.         //打开GPIOD的时钟
  11.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
  12.         //定义can1使用到的引脚
  13.         gpio.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;
  14.         gpio.GPIO_Mode=GPIO_Mode_AF;//设定引脚为复用模式
  15.         gpio.GPIO_Speed=GPIO_Speed_100MHz;//端口输出速度为100MHz
  16.         GPIO_Init(GPIOD,&gpio);//初始化PD0,PD1
  17.         GPIO_PinAFConfig(GPIOD,GPIO_PinSource0,GPIO_AF_CAN1);//PD0复用为can1
  18.         GPIO_PinAFConfig(GPIOD,GPIO_PinSource1,GPIO_AF_CAN1);//PD1复用为can1
  19.        
  20.         //设置中断
  21.         nvic.NVIC_IRQChannel=CAN1_RX0_IRQn;//选择CAN1_RX0中断.如果是来自FIFO0的接收中断,则用CAN1_RX0_IRQn中断来处理。如果是来自FIFO1的接收中断,则用CAN1_RX1_IRQn中断来处理
  22.         nvic.NVIC_IRQChannelPreemptionPriority=5;//设置抢占优先级为5
  23.         nvic.NVIC_IRQChannelSubPriority=0;//设置响应优先级为0
  24.         nvic.NVIC_IRQChannelCmd=ENABLE;//使能CAN1_RX0中断通道
  25.         NVIC_Init(&nvic);//初始化中断
  26.         nvic.NVIC_IRQChannel=CAN1_TX_IRQn;//选择CAN1_TX中断
  27.         nvic.NVIC_IRQChannelPreemptionPriority=5;//设置抢占优先级为5
  28.         nvic.NVIC_IRQChannelSubPriority=0;//设置响应优先级为0
  29.         nvic.NVIC_IRQChannelCmd=ENABLE;//使能CAN1_TX中断通道
  30.         NVIC_Init(&nvic);//初始化中断
  31.        
  32.         CAN_DeInit(CAN1);//将CAN1恢复默认状态
  33.         CAN_StructInit(&can);//用默认值填满can初始化结构体中每一个成员
  34.         can.CAN_TTCM=DISABLE;//禁止时间触发通信模式
  35.         can.CAN_ABOM=DISABLE;//软件自动离线管理
  36.         can.CAN_AWUM=DISABLE;//睡眠模式通过软件唤醒
  37.         can.CAN_NART=DISABLE;//报文自动播送
  38.         can.CAN_RFLM=DISABLE;//报文不锁定,新的覆盖旧的
  39.         can.CAN_TXFP=ENABLE;//优先级由报文标识符决定
  40.         can.CAN_Mode=CAN_Mode_Normal;//设置模式为普通模式
  41.         can.CAN_SJW=CAN_SJW_1tq;//设置同步跳跃时间单元为1
  42.         can.CAN_BS1=CAN_BS1_6tq;//设置时段1为6
  43.         can.CAN_BS2=CAN_BS2_8tq;//设置时段2为8
  44.         can.CAN_Prescaler=3;//设置分频系数为3 波特率=45/((1+8+6)*3)=1
  45.         CAN_Init(CAN1,&can);//初始化can1
  46.         //配置筛选器
  47.         can_filter.CAN_FilterNumber=0; //筛选器0
  48.         can_filter.CAN_FilterMode=CAN_FilterMode_IdMask;//标识符屏蔽模式
  49.         can_filter.CAN_FilterScale=CAN_FilterScale_32bit; //32位标识符
  50.         can_filter.CAN_FilterIdHigh=0x0000;//32位id
  51.         can_filter.CAN_FilterIdLow=0x0000;
  52.         can_filter.CAN_FilterMaskIdHigh=0x0000;//32位MASK                  
  53.         can_filter.CAN_FilterMaskIdLow=0x0000;
  54.         can_filter.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;
  55.         can_filter.CAN_FilterActivation=ENABLE;//激活筛选器
  56.         CAN_FilterInit(&can_filter);//初始化筛选器
  57.         CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//允许CAN1接受中断       
  58. }

  59. static void CAN2_Init()
  60. {
  61.         //结构体声明
  62.         GPIO_InitTypeDef           gpio;       
  63.         NVIC_InitTypeDef           nvic;
  64.         CAN_InitTypeDef            can;
  65.         CAN_FilterInitTypeDef  can_filter;
  66.         //时钟配置
  67.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
  68.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);
  69.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
  70.         //引脚配置
  71.         gpio.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13;
  72.         gpio.GPIO_Mode = GPIO_Mode_AF;                                                                                                       
  73.         gpio.GPIO_Speed = GPIO_Speed_50MHz;
  74.         GPIO_Init(GPIOB, &gpio);
  75.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_CAN2);
  76.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_CAN2);
  77.         //中断设置
  78.         nvic.NVIC_IRQChannel = CAN2_RX0_IRQn;                                         
  79.         nvic.NVIC_IRQChannelPreemptionPriority = 4; //抢占优先级为4   
  80.         nvic.NVIC_IRQChannelSubPriority = 2;//响应优先级为2
  81.         nvic.NVIC_IRQChannelCmd = ENABLE;
  82.         NVIC_Init(&nvic);       
  83.         nvic.NVIC_IRQChannel = CAN2_TX_IRQn;                                         
  84.         nvic.NVIC_IRQChannelPreemptionPriority = 6; //抢占优先级为6  
  85.         nvic.NVIC_IRQChannelSubPriority = 2;//响应优先级为2                  
  86.         nvic.NVIC_IRQChannelCmd = ENABLE;
  87.         NVIC_Init(&nvic);
  88.         //can配置
  89.         CAN_DeInit(CAN2);
  90.         CAN_StructInit(&can);
  91.         can.CAN_TTCM = DISABLE;          
  92.         can.CAN_ABOM = DISABLE;          
  93.         can.CAN_AWUM = DISABLE;                  
  94.         can.CAN_NART = DISABLE;                  
  95.         can.CAN_RFLM = DISABLE;                  
  96.         can.CAN_TXFP = ENABLE;                         
  97.         can.CAN_Mode = CAN_Mode_Normal;          
  98.         can.CAN_SJW  = CAN_SJW_1tq;
  99.         can.CAN_BS1 = CAN_BS1_8tq;
  100.         can.CAN_BS2 = CAN_BS2_6tq;
  101.         can.CAN_Prescaler = 3;         //CAN BaudRate 45/(1+6+8)/3=1Mbps
  102.         CAN_Init(CAN2, &can);
  103.         //筛选器配置
  104.         can_filter.CAN_FilterNumber=14;
  105.         can_filter.CAN_FilterMode=CAN_FilterMode_IdMask;
  106.         can_filter.CAN_FilterScale=CAN_FilterScale_32bit;
  107.         can_filter.CAN_FilterIdHigh=0x0000;
  108.         can_filter.CAN_FilterIdLow=0x0000;
  109.         can_filter.CAN_FilterMaskIdHigh=0x0000;                                   
  110.         can_filter.CAN_FilterMaskIdLow=0x0000;
  111.         can_filter.CAN_FilterFIFOAssignment=0;
  112.         can_filter.CAN_FilterActivation=ENABLE;
  113.         CAN_FilterInit(&can_filter);       
  114.                
  115.         CAN_ITConfig(CAN2,CAN_IT_FMP0,ENABLE);                 
  116.         CAN_ITConfig(CAN2,CAN_IT_TME,ENABLE);

  117. }
  118. void Moter_CAN_Init(void)
  119. {
  120.         CAN1_Init();
  121. //        CAN2_Init();
  122. }

  123. //发送数据
  124. void CanSendMsg(CAN_TypeDef* CANx,uint32_t SendID,int16_t* message)
  125. {
  126.         int i=0;
  127.         u8 mbox;
  128.         CanTxMsg tx_message;
  129.         tx_message.StdId=SendID;
  130.         tx_message.IDE=CAN_Id_Standard;//标准id
  131.         tx_message.RTR=CAN_RTR_DATA;//数据帧
  132.         tx_message.DLC=0x08;

  133.         tx_message.Data[0]=(uint8_t)(message[0]>>8);
  134.         tx_message.Data[1]=(uint8_t)(message[0]);
  135.         tx_message.Data[2]=(uint8_t)(message[1]>>8);
  136.         tx_message.Data[3]=(uint8_t)(message[1]);
  137.         tx_message.Data[4]=(uint8_t)(message[2]>>8);
  138.         tx_message.Data[5]=(uint8_t)(message[2]);
  139.         tx_message.Data[6]=(uint8_t)(message[3]>>8);
  140.         tx_message.Data[7]=(uint8_t)(message[3]);
  141.         mbox=CAN_Transmit(CANx,&tx_message);
  142.         while(CAN_TransmitStatus(CANx,mbox)==CAN_TxStatus_Failed&&i++<0xffff);
  143. }
复制代码
  1. #include "stm32f4xx.h"
  2. #include "delay.h"
  3. #include "can.h"
  4. #include "pid.h"
  5. #include "usart.h"
  6. #include "led.h"

  7. int16_t can1_send_data[8];
  8. int main()
  9. {
  10.         Moter_CAN_Init();
  11.         delay_init(168);
  12.         LED_Init();
  13.         can1_send_data[0]=100;
  14.         can1_send_data[1]=0;
  15.         while(1)
  16.         {
  17.                 GPIO_ResetBits(GPIOF,GPIO_Pin_14);
  18.                 CanSendMsg(CAN1,0x200,can1_send_data);
  19.                 delay_ms(500);
  20.                 GPIO_SetBits(GPIOF,GPIO_Pin_14);
  21.                 delay_ms(500);
  22.         }
  23. }
复制代码
这个是代码,感觉就是数据发不出去。。。。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2021-1-6
在线时间
3 小时
 楼主| 发表于 2021-1-6 22:18:10 | 显示全部楼层
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2021-1-6
在线时间
3 小时
 楼主| 发表于 2021-1-7 13:18:17 | 显示全部楼层
没大佬吗?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-3-1 05:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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