新手上路
- 积分
- 30
- 金钱
- 30
- 注册时间
- 2021-1-7
- 在线时间
- 7 小时
|

楼主 |
发表于 2021-1-7 22:06:13
|
显示全部楼层
代码用的是hal库void filter1_init(void)
{
INT16U StdIdArray[1] ={0x055}; //定义一组标准CAN ID,可更改
INT16U mask,tmp,num,i;//屏蔽码计算
CAN_FilterTypeDef filter1;
mask =0x000; //下面开始计算屏蔽码
num =sizeof(StdIdArray)/sizeof(StdIdArray[0]);
for(i =0; i<num; i++) //屏蔽码位StdIdArray[]数组中所有成员的同或结果
{
tmp =StdIdArray[i] ^ (~StdIdArray[0]); //所有数组成员与第0个成员进行同或操作
mask &=tmp;
}
filter1.FilterBank=0;//过滤器编号
filter1.FilterMode=CAN_FILTERMODE_IDMASK;//掩码模式
filter1.FilterScale=CAN_FILTERSCALE_32BIT;
filter1.FilterIdHigh=(StdIdArray[0]<<5); //验证码,可默认0x0000
filter1.FilterIdLow=0x0000;
filter1.FilterMaskIdHigh=(mask<<5); //屏蔽码,可默认0x0000最大
filter1.FilterMaskIdLow=0x0000;
filter1.FilterFIFOAssignment=CAN_FILTER_FIFO0;//FIFO0
filter1.FilterActivation=ENABLE;
if(HAL_CAN_ConfigFilter(&hcan,&filter1)!=HAL_OK)
{
Error_Handler();
}
HAL_CAN_ActivateNotification(&hcan,CAN_IT_RX_FIFO0_MSG_PENDING);//使能中断
}
void can_start(void)
{
MX_CAN_Init();//CAN参数初始化
filter1_init();//滤波器初始化
}
/* CAN init function */
void MX_CAN_Init(void)
{
//250Kbps 24000/(()*)
//500Kbps
//125Kbps
hcan.Instance = CAN;
hcan.Init.Prescaler = 6;
hcan.Init.Mode = CAN_MODE_LOOPBACK;
hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;
hcan.Init.TimeSeg2 = CAN_BS2_7TQ;
hcan.Init.TimeSeg1 = CAN_BS1_8TQ;
hcan.Init.TimeTriggeredMode = DISABLE;
hcan.Init.AutoBusOff = DISABLE;
hcan.Init.AutoWakeUp = DISABLE;
hcan.Init.AutoRetransmission = DISABLE;
hcan.Init.ReceiveFifoLocked = DISABLE;
hcan.Init.TransmitFifoPriority = DISABLE;
if (HAL_CAN_Init(&hcan) != HAL_OK)
{
Error_Handler();
}
HAL_CAN_Start(&hcan);//启动CAN
HAL_CAN_ActivateNotification(&hcan,CAN_IT_RX_FIFO0_MSG_PENDING);//使能中断
}
void HAL_CAN_MspInit(CAN_HandleTypeDef* canHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(canHandle->Instance==CAN)
{
/* USER CODE BEGIN CAN_MspInit 0 */
/* USER CODE END CAN_MspInit 0 */
/* CAN clock enable */
__HAL_RCC_CAN1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**CAN GPIO Configuration
PA11 ------> CAN_RX
PA12 ------> CAN_TX
*/
GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF4_CAN;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* CAN interrupt Init */
HAL_NVIC_SetPriority(CEC_CAN_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(CEC_CAN_IRQn);
}
}
void USER_CAN_Send()
{
HAL_Delay(100);
// HAL_CAN_ActivateNotification(&hcan, CAN_IT_TX_MAILBOX_EMPTY);//开启发送中断
//test数据发送
TxHeader.StdId = 0x055; //标准格式,包含3位优先级,2位固定码均为0,(R和DP),8位报文代码
// TxHeader.ExtId= 0x080155AA; //扩展码其中八位,高:目标地址;低:源地址
TxHeader.RTR = CAN_RTR_DATA;
TxHeader.IDE = CAN_ID_STD;
TxHeader.DLC = 8;//发送字节数
// TxHeader.TransmitGlobalTime = DISABLE;
TxData[0] = 0x01;
TxData[1] = 0x52;
TxData[2] = 0x55;
TxData[3] = 0x55;
TxData[4] = 0x44;
TxData[5] = 0xAA;
TxData[6] = 0xAA;
TxData[7] = 0xAA;
HAL_Delay(100);
if (HAL_CAN_AddTxMessage(&hcan, &TxHeader, TxData, &TxMailbox) != HAL_OK)
{
/* Transmission request Error */
Error_Handler();
}
HAL_Delay(100);
TxData[0]++;
}
|
|