新手入门
- 积分
- 15
- 金钱
- 15
- 注册时间
- 2021-1-6
- 在线时间
- 3 小时
|
1金钱
新人小白一枚,最近在调试电机,使用到了电调,通过can总线向电调发送消息来控制电机,但是发送了数据,电机没有反应。。。有没有大神帮忙看下- void CAN1_Init()
- {
- //声明GPIO、NVIC、CAN、CAN筛选器的结构体
- GPIO_InitTypeDef gpio;
- NVIC_InitTypeDef nvic;
- CAN_InitTypeDef can;
- CAN_FilterInitTypeDef can_filter;
- //打开can1时钟
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1,ENABLE);
- //打开GPIOD的时钟
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
- //定义can1使用到的引脚
- gpio.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;
- gpio.GPIO_Mode=GPIO_Mode_AF;//设定引脚为复用模式
- gpio.GPIO_Speed=GPIO_Speed_100MHz;//端口输出速度为100MHz
- GPIO_Init(GPIOD,&gpio);//初始化PD0,PD1
- GPIO_PinAFConfig(GPIOD,GPIO_PinSource0,GPIO_AF_CAN1);//PD0复用为can1
- GPIO_PinAFConfig(GPIOD,GPIO_PinSource1,GPIO_AF_CAN1);//PD1复用为can1
-
- //设置中断
- nvic.NVIC_IRQChannel=CAN1_RX0_IRQn;//选择CAN1_RX0中断.如果是来自FIFO0的接收中断,则用CAN1_RX0_IRQn中断来处理。如果是来自FIFO1的接收中断,则用CAN1_RX1_IRQn中断来处理
- nvic.NVIC_IRQChannelPreemptionPriority=5;//设置抢占优先级为5
- nvic.NVIC_IRQChannelSubPriority=0;//设置响应优先级为0
- nvic.NVIC_IRQChannelCmd=ENABLE;//使能CAN1_RX0中断通道
- NVIC_Init(&nvic);//初始化中断
- nvic.NVIC_IRQChannel=CAN1_TX_IRQn;//选择CAN1_TX中断
- nvic.NVIC_IRQChannelPreemptionPriority=5;//设置抢占优先级为5
- nvic.NVIC_IRQChannelSubPriority=0;//设置响应优先级为0
- nvic.NVIC_IRQChannelCmd=ENABLE;//使能CAN1_TX中断通道
- NVIC_Init(&nvic);//初始化中断
-
- CAN_DeInit(CAN1);//将CAN1恢复默认状态
- CAN_StructInit(&can);//用默认值填满can初始化结构体中每一个成员
- can.CAN_TTCM=DISABLE;//禁止时间触发通信模式
- can.CAN_ABOM=DISABLE;//软件自动离线管理
- can.CAN_AWUM=DISABLE;//睡眠模式通过软件唤醒
- can.CAN_NART=DISABLE;//报文自动播送
- can.CAN_RFLM=DISABLE;//报文不锁定,新的覆盖旧的
- can.CAN_TXFP=ENABLE;//优先级由报文标识符决定
- can.CAN_Mode=CAN_Mode_Normal;//设置模式为普通模式
- can.CAN_SJW=CAN_SJW_1tq;//设置同步跳跃时间单元为1
- can.CAN_BS1=CAN_BS1_6tq;//设置时段1为6
- can.CAN_BS2=CAN_BS2_8tq;//设置时段2为8
- can.CAN_Prescaler=3;//设置分频系数为3 波特率=45/((1+8+6)*3)=1
- CAN_Init(CAN1,&can);//初始化can1
- //配置筛选器
- can_filter.CAN_FilterNumber=0; //筛选器0
- can_filter.CAN_FilterMode=CAN_FilterMode_IdMask;//标识符屏蔽模式
- can_filter.CAN_FilterScale=CAN_FilterScale_32bit; //32位标识符
- can_filter.CAN_FilterIdHigh=0x0000;//32位id
- can_filter.CAN_FilterIdLow=0x0000;
- can_filter.CAN_FilterMaskIdHigh=0x0000;//32位MASK
- can_filter.CAN_FilterMaskIdLow=0x0000;
- can_filter.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;
- can_filter.CAN_FilterActivation=ENABLE;//激活筛选器
- CAN_FilterInit(&can_filter);//初始化筛选器
- CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//允许CAN1接受中断
- }
- static void CAN2_Init()
- {
- //结构体声明
- GPIO_InitTypeDef gpio;
- NVIC_InitTypeDef nvic;
- CAN_InitTypeDef can;
- CAN_FilterInitTypeDef can_filter;
- //时钟配置
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
- //引脚配置
- gpio.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13;
- gpio.GPIO_Mode = GPIO_Mode_AF;
- gpio.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &gpio);
- GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_CAN2);
- GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_CAN2);
- //中断设置
- nvic.NVIC_IRQChannel = CAN2_RX0_IRQn;
- nvic.NVIC_IRQChannelPreemptionPriority = 4; //抢占优先级为4
- nvic.NVIC_IRQChannelSubPriority = 2;//响应优先级为2
- nvic.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&nvic);
- nvic.NVIC_IRQChannel = CAN2_TX_IRQn;
- nvic.NVIC_IRQChannelPreemptionPriority = 6; //抢占优先级为6
- nvic.NVIC_IRQChannelSubPriority = 2;//响应优先级为2
- nvic.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&nvic);
- //can配置
- CAN_DeInit(CAN2);
- CAN_StructInit(&can);
- can.CAN_TTCM = DISABLE;
- can.CAN_ABOM = DISABLE;
- can.CAN_AWUM = DISABLE;
- can.CAN_NART = DISABLE;
- can.CAN_RFLM = DISABLE;
- can.CAN_TXFP = ENABLE;
- can.CAN_Mode = CAN_Mode_Normal;
- can.CAN_SJW = CAN_SJW_1tq;
- can.CAN_BS1 = CAN_BS1_8tq;
- can.CAN_BS2 = CAN_BS2_6tq;
- can.CAN_Prescaler = 3; //CAN BaudRate 45/(1+6+8)/3=1Mbps
- CAN_Init(CAN2, &can);
- //筛选器配置
- can_filter.CAN_FilterNumber=14;
- can_filter.CAN_FilterMode=CAN_FilterMode_IdMask;
- can_filter.CAN_FilterScale=CAN_FilterScale_32bit;
- can_filter.CAN_FilterIdHigh=0x0000;
- can_filter.CAN_FilterIdLow=0x0000;
- can_filter.CAN_FilterMaskIdHigh=0x0000;
- can_filter.CAN_FilterMaskIdLow=0x0000;
- can_filter.CAN_FilterFIFOAssignment=0;
- can_filter.CAN_FilterActivation=ENABLE;
- CAN_FilterInit(&can_filter);
-
- CAN_ITConfig(CAN2,CAN_IT_FMP0,ENABLE);
- CAN_ITConfig(CAN2,CAN_IT_TME,ENABLE);
- }
- void Moter_CAN_Init(void)
- {
- CAN1_Init();
- // CAN2_Init();
- }
- //发送数据
- void CanSendMsg(CAN_TypeDef* CANx,uint32_t SendID,int16_t* message)
- {
- int i=0;
- u8 mbox;
- CanTxMsg tx_message;
- tx_message.StdId=SendID;
- tx_message.IDE=CAN_Id_Standard;//标准id
- tx_message.RTR=CAN_RTR_DATA;//数据帧
- tx_message.DLC=0x08;
- tx_message.Data[0]=(uint8_t)(message[0]>>8);
- tx_message.Data[1]=(uint8_t)(message[0]);
- tx_message.Data[2]=(uint8_t)(message[1]>>8);
- tx_message.Data[3]=(uint8_t)(message[1]);
- tx_message.Data[4]=(uint8_t)(message[2]>>8);
- tx_message.Data[5]=(uint8_t)(message[2]);
- tx_message.Data[6]=(uint8_t)(message[3]>>8);
- tx_message.Data[7]=(uint8_t)(message[3]);
- mbox=CAN_Transmit(CANx,&tx_message);
- while(CAN_TransmitStatus(CANx,mbox)==CAN_TxStatus_Failed&&i++<0xffff);
- }
复制代码- #include "stm32f4xx.h"
- #include "delay.h"
- #include "can.h"
- #include "pid.h"
- #include "usart.h"
- #include "led.h"
- int16_t can1_send_data[8];
- int main()
- {
- Moter_CAN_Init();
- delay_init(168);
- LED_Init();
- can1_send_data[0]=100;
- can1_send_data[1]=0;
- while(1)
- {
- GPIO_ResetBits(GPIOF,GPIO_Pin_14);
- CanSendMsg(CAN1,0x200,can1_send_data);
- delay_ms(500);
- GPIO_SetBits(GPIOF,GPIO_Pin_14);
- delay_ms(500);
- }
- }
复制代码 这个是代码,感觉就是数据发不出去。。。。
|
|