初级会员

- 积分
- 166
- 金钱
- 166
- 注册时间
- 2013-12-1
- 在线时间
- 88 小时
|
50金钱
本帖最后由 ssis909 于 2021-6-29 23:14 编辑
我在原子哥的CAN实验例程上修改的,正点原子哥使用的是CAN1,我改成CAN2,结果在 if(HAL_CAN_Init(&CAN_Handler) != HAL_OK) ;这里就返回失败了,我已经把CAN1和CAN2的时钟都打开了.这是初始化函数:
CAN_HandleTypeDef CAN_Handler; //CAN句柄
CanTxMsgTypeDef TxMessage; //发送消息
CanRxMsgTypeDef RxMessage; //接收消息
CAN_FilterConfTypeDef CAN_FilerConf;
CAN_Handler.Instance = CAN2;
CAN_Handler.pTxMsg = &TxMessage; //发送消息
CAN_Handler.pRxMsg = &RxMessage; //接收消息
CAN_Handler.Init.Prescaler = brp; //分频系数(Fdiv)为brp+1
CAN_Handler.Init.Mode = mode; //模式设置
CAN_Handler.Init.SJW = tsjw; //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1TQ~CAN_SJW_4TQ
CAN_Handler.Init.BS1 = tbs1; //tbs1范围CAN_BS1_1TQ~CAN_BS1_16TQ
CAN_Handler.Init.BS2 = tbs2; //tbs2范围CAN_BS2_1TQ~CAN_BS2_8TQ
CAN_Handler.Init.TTCM = DISABLE; //非时间触发通信模式
CAN_Handler.Init.ABOM = DISABLE; //软件自动离线管理
CAN_Handler.Init.AWUM = DISABLE; //睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)
CAN_Handler.Init.NART = ENABLE; //禁止报文自动传送
CAN_Handler.Init.RFLM = DISABLE; //报文不锁定,新的覆盖旧的
CAN_Handler.Init.TXFP = DISABLE; //优先级由报文标识符决定
if(HAL_CAN_Init(&CAN_Handler) != HAL_OK) //CAN2在这里返回了,表明失败
{
return 1; //初始化
}
void HAL_CAN_MspInit(CAN_HandleTypeDef* hcan)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_CAN1_CLK_ENABLE();
__HAL_RCC_CAN2_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_Initure.Pin = GPIO_PIN_12 | GPIO_PIN_13;
GPIO_Initure.Mode = GPIO_MODE_AF_PP; //推挽复用
GPIO_Initure.Pull = GPIO_PULLUP; //上拉
GPIO_Initure.Speed = GPIO_SPEED_FAST; //快速
GPIO_Initure.Alternate= GPIO_AF9_CAN2; //复用为CAN2
HAL_GPIO_Init(GPIOB,&GPIO_Initure); //初始化
}
有木有谁在F767用HAL库驱动CAN成功的?非常感谢!
|
|