CAN的Loopback模式例程的设置及程序分析
该例程提供一个关于用CAN的Loopback模式进行交互设置的描述.
貌似官方这个例子是stm324xG_EVAL板的,当用于stm32f407discovery板卡的时候
不能直接烧写使用.
例程说明在175Kbps运用查询模式传输和接收一组数据,接收到数据后进行检查通过led指示状态
以下程序已经更改用于discovery板卡.
LED1接PF6,LED2接PF7,LED3接PF8脚,
设置以上三个管脚为输出,上拉,fast模式
开启CAN1的master,设置CAN1的相关管脚为AFPP,上拉,fast模式
PA11 ------> CAN1_RX
PA12 ------> CAN1_TX
GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
GPIO_InitStruct.Alternate = GPIO_AF9_CAN1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
不开任何中断.......................
CAN设置如下图
貌似官方这个例子是stm324xG_EVAL板的,当用于stm32f407discovery板卡的时候
不能直接烧写使用.
例程说明在175Kbps运用查询模式传输和接收一组数据,接收到数据后进行检查通过led指示状态
以下程序已经更改用于discovery板卡.
LED1接PF6,LED2接PF7,LED3接PF8脚,
设置以上三个管脚为输出,上拉,fast模式
开启CAN1的master,设置CAN1的相关管脚为AFPP,上拉,fast模式
PA11 ------> CAN1_RX
PA12 ------> CAN1_TX
GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
GPIO_InitStruct.Alternate = GPIO_AF9_CAN1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
不开任何中断.......................
CAN设置如下图
7 个回复
admin
赞同来自:
然后打开生成的代码.
打开can.c文件
在USER CODE BEGIN 1 和USER CODE END 1之间添加下列代码:
admin
赞同来自:
HAL_StatusTypeDef CAN_Polling(void);
打开main.c文件
在main()函数修改为如下代码
其中的变量addtime为定义的一个uint16_t,此值在滴答时钟Callback函数中自加即可.
admin
赞同来自:
否则通信失败则led2常亮其他不亮.
本程序运行正常!
admin
赞同来自:
用到的时候可以这样
如果发送,不修改发送数据长度,那么
hcan1.pTxMsg->Data = 0xCA;//第一字节数据
hcan1.pTxMsg->Data = 0xFE;//第二字节数据
HAL_CAN_Transmit(&hcan1, 10);
建议你可以封装为一个函数.....
接收的话用中断接收..HAL_CAN_Receive_IT(&hcan1, CAN_FIFO0) ;
开启接收中断
HAL_NVIC_SetPriority(CANx_RX_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(CANx_RX_IRQn);
然后调用can_callback
假如设置StdId == 0x321
好了,can差不多就这样了.
思考:如果好几个can设备连接了.我怎么控制其他的那些做不同的动作呢?
呵呵,提示跟辨识符有关,看到上面的这个中断你应该知道了吧
admin
赞同来自: tinyuns
**不是本文中的程序啊。。。。。
只是注释下,且看且研究。。。**
CAN_DeInit(CAN1); //将外设CAN的全部寄存器重设为缺省值
CAN_StructInit(&CAN_InitStructure);//把CAN_InitStruct中的每一个参数按缺省值填入
/ CAN cell init /
CAN_InitStructure.CAN_TTCM=DISABLE;//没有使能时间触发模式
CAN_InitStructure.CAN_ABOM=DISABLE;//没有使能自动离线管理
CAN_InitStructure.CAN_AWUM=DISABLE;//没有使能自动唤醒模式
CAN_InitStructure.CAN_NART=DISABLE;//没有使能非自动重传模式
CAN_InitStructure.CAN_RFLM=DISABLE;//没有使能接收FIFO锁定模式
CAN_InitStructure.CAN_TXFP=DISABLE;//没有使能发送FIFO优先级
CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;//CAN设置为正常模式
CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; //重新同步跳跃宽度1个时间单位
CAN_InitStructure.CAN_BS1=CAN_BS1_3tq; //时间段1为3个时间单位
CAN_InitStructure.CAN_BS2=CAN_BS2_2tq; //时间段2为2个时间单位
CAN_InitStructure.CAN_Prescaler=60; //时间单位长度为60
CAN_Init(CAN1,&CAN_InitStructure);
//波特率为:72M/2/60(1+3+2)=0.1 即100K
/ CAN filter init /
CAN_FilterInitStructure.CAN_FilterNumber=1;//指定过滤器为1
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//指定过滤器为标识符屏蔽位模式
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;//过滤器位宽为32位
CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;// 过滤器标识符的高16位值
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;// 过滤器标识符的低16位值
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//过滤器屏蔽标识符的高16位值
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;// 过滤器屏蔽标识符的低16位值
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;// 设定了指向过滤器的FIFO为0
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;// 使能过滤器
CAN_FilterInit(&CAN_FilterInitStructure);// 按上面的参数初始化过滤器
/ CAN FIFO0 message pending interrupt enable /
CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE); //使能FIFO0消息挂号中断
GskFlD
赞同来自: tinyuns
虎扑最大的吊
赞同来自:
写的非常好