中级会员
 
- 积分
- 440
- 金钱
- 440
- 注册时间
- 2012-3-6
- 在线时间
- 5 小时
|

楼主 |
发表于 2014-8-26 10:46:29
|
显示全部楼层
以下是CAN的初始化配置.
void CAN_Configuration(u8 iBaud, u32 *pFilterId, u32 *pFilterMaskId, u8 iFilterNum)
{
u8 i;
CAN_InitTypeDef *CAN_InitStructure;
CAN_FilterInitTypeDef *CAN_FilterInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
//错误数累计
/*************************************分配空间**************************************/
CAN_InitStructure = (CAN_InitTypeDef*)mymalloc(SRAMIN,sizeof(CAN_InitTypeDef)); //分配空间
CAN_FilterInitStructure = (CAN_FilterInitTypeDef*)mymalloc(SRAMIN,sizeof(CAN_FilterInitTypeDef)); //分配空间
/**********************************************************************************/
RCC_APB1PeriphClockCmd( RCC_APB1Periph_CAN1 , // 使能CAN时钟
ENABLE);
/***************IO口输入输出方式配置**************/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; // CAN RX引脚配置
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
//CAN TX
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; // CAN TX引脚配置
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);
/***********************中断配置*****************/
NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; // 使能CAN RX0 中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = USB_HP_CAN1_TX_IRQn; // 使能CAN TX 中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = CAN1_SCE_IRQn; // 使能CAN 错误中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//CAN寄存器配置, 0-DISABLE;1-ENABLE
CAN_DeInit(CAN1); /* CAN 寄存器初始化 */
CAN_StructInit(CAN_InitStructure);
CAN_InitStructure->CAN_TTCM = DISABLE; /* 时间触发通信模式 */
// 0:禁止时间出发通信模式
// 1:允许时间出发通信模式
CAN_InitStructure->CAN_ABOM = ENABLE; /* 自动离线管理 */
// 0:软件对CAN_MCR寄存器的INRQ为置'1'随后清'0',一旦硬件检测到128次11位连续隐性位,自动退出离线状态
// 1:一旦硬件检测到128次11位连续隐性位,自动退出离线状态
CAN_InitStructure->CAN_AWUM = ENABLE; /* 自动唤醒模式 */
// 0:睡眠模式通过清除CAN_MCR寄存器的SLEEP位,由软件唤醒
// 1:睡眠模式通过检测CAN报文,由硬件自动唤醒,唤醒同时,硬件自动对CAN_MSR寄存器的SLEEP和SLAK位清'0'
CAN_InitStructure->CAN_NART = DISABLE; /* 是否禁止报文自动重传 */
// 0:按照CAN标准,CAN硬件在发送报文失败时会一直自动重传直到发送成功
// 1:CAN报文只被发送1次,不管发送的结果如何
CAN_InitStructure->CAN_RFLM = ENABLE; /* 接收FIFO锁定模式 */
// 0:在接收溢出时FIFO未被锁定,当接收FIFO的报文未被读出,下一个收到的报文会覆盖原有的报文
// 1:在接收溢出时FIFO被锁定,当接收FIFO的报文未被读出,下一个收到的报文会被丢弃
CAN_InitStructure->CAN_TXFP = ENABLE; /* 发送FIFO优先级 */
// 0:优先级由报文的标识符来决定
// 1:优先级由发送请求的顺序来决定
CAN_InitStructure->CAN_Mode = CAN_Mode_Normal; /* 操作模式 */
// CAN_Mode_Normal:标准模式
// CAN_Mode_LoopBack:环回模式
// CAN_Mode_Silent:静默模式
// CAN_Mode_Silent_LoopBack:静默环回模式
CAN_InitStructure->CAN_SJW = CAN_SJW_1tq; /* 重新同步跳跃宽度 */
// CAN_SJW_1tq
// CAN_SJW_2tq
// CAN_SJW_3tq
// CAN_SJW_4tq
switch (iBaud)
{
case CAN_BAUD_5K: /* BAUD = 5kbps */
CAN_InitStructure->CAN_BS1 = CAN_BS1_8tq; /* 时间段1 */
// TS1[3:0],定义时间段1占用了多少个时间单元
CAN_InitStructure->CAN_BS2 = CAN_BS2_7tq; /* 时间段2 */
// TS2[2:0],定义时间段2占用了多少个时间单元
CAN_InitStructure->CAN_Prescaler = 450; /* 波特率预分频 F/(BS1+BS2+1)/PRE */
break;
case CAN_BAUD_10K: /* BAUD = 10kbps */
CAN_InitStructure->CAN_BS1 = CAN_BS1_8tq;
CAN_InitStructure->CAN_BS2 = CAN_BS2_7tq;
CAN_InitStructure->CAN_Prescaler = 225;
break;
case CAN_BAUD_20K: /* BAUD = 20kbps */
CAN_InitStructure->CAN_BS1 = CAN_BS1_6tq;
CAN_InitStructure->CAN_BS2 = CAN_BS2_5tq;
CAN_InitStructure->CAN_Prescaler = 150;
break;
case CAN_BAUD_25K: /* BAUD = 25kbps */
CAN_InitStructure->CAN_BS1 = CAN_BS1_8tq;
CAN_InitStructure->CAN_BS2 = CAN_BS2_7tq;
CAN_InitStructure->CAN_Prescaler = 90;
break;
case CAN_BAUD_30K: /* BAUD = 30kbps */
CAN_InitStructure->CAN_BS1 = CAN_BS1_8tq;
CAN_InitStructure->CAN_BS2 = CAN_BS2_7tq;
CAN_InitStructure->CAN_Prescaler = 75;
break;
case CAN_BAUD_40K: /* BAUD = 40kbps */
CAN_InitStructure->CAN_BS1 = CAN_BS1_6tq;
CAN_InitStructure->CAN_BS2 = CAN_BS2_5tq;
CAN_InitStructure->CAN_Prescaler = 75;
break;
case CAN_BAUD_50K: /* BAUD = 50kbps */
CAN_InitStructure->CAN_BS1 = CAN_BS1_8tq;
CAN_InitStructure->CAN_BS2 = CAN_BS2_7tq;
CAN_InitStructure->CAN_Prescaler = 45;
break;
case CAN_BAUD_60K: /* BAUD = 60kbps */
CAN_InitStructure->CAN_BS1 = CAN_BS1_6tq;
CAN_InitStructure->CAN_BS2 = CAN_BS2_5tq;
CAN_InitStructure->CAN_Prescaler = 50;
break;
case CAN_BAUD_80K: /* BAUD = 80kbps */
CAN_InitStructure->CAN_BS1 = CAN_BS1_5tq;
CAN_InitStructure->CAN_BS2 = CAN_BS2_4tq;
CAN_InitStructure->CAN_Prescaler = 45;
break;
case CAN_BAUD_90K: /* BAUD = 90kbps */
CAN_InitStructure->CAN_BS1 = CAN_BS1_5tq;
CAN_InitStructure->CAN_BS2 = CAN_BS2_4tq;
CAN_InitStructure->CAN_Prescaler = 40;
break;
case CAN_BAUD_100K: /* BAUD = 100kbps */
CAN_InitStructure->CAN_BS1 = CAN_BS1_6tq;
CAN_InitStructure->CAN_BS2 = CAN_BS2_5tq;
CAN_InitStructure->CAN_Prescaler = 30;
break;
case CAN_BAUD_200K: /* BAUD = 200kbps */
CAN_InitStructure->CAN_BS1 = CAN_BS1_6tq;
CAN_InitStructure->CAN_BS2 = CAN_BS2_5tq;
CAN_InitStructure->CAN_Prescaler = 15;
break;
case CAN_BAUD_300K: /* BAUD = 300kbps */
CAN_InitStructure->CAN_BS1 = CAN_BS1_6tq;
CAN_InitStructure->CAN_BS2 = CAN_BS2_5tq;
CAN_InitStructure->CAN_Prescaler = 10;
break;
case CAN_BAUD_400K: /* BAUD = 400kbps */
CAN_InitStructure->CAN_BS1 = CAN_BS1_5tq;
CAN_InitStructure->CAN_BS2 = CAN_BS2_4tq;
CAN_InitStructure->CAN_Prescaler = 9;
break;
case CAN_BAUD_500K: /* BAUD = 500kbps */
CAN_InitStructure->CAN_BS1 = CAN_BS1_4tq;
CAN_InitStructure->CAN_BS2 = CAN_BS2_3tq;
CAN_InitStructure->CAN_Prescaler = 9;
break;
case CAN_BAUD_600K: /* BAUD = 600kbps */
CAN_InitStructure->CAN_BS1 = CAN_BS1_6tq;
CAN_InitStructure->CAN_BS2 = CAN_BS2_5tq;
CAN_InitStructure->CAN_Prescaler = 5;
break;
case CAN_BAUD_800K: /* BAUD = 800kbps */
CAN_InitStructure->CAN_BS1 = CAN_BS1_4tq;
CAN_InitStructure->CAN_BS2 = CAN_BS2_4tq;
CAN_InitStructure->CAN_Prescaler = 5;
break;
case CAN_BAUD_900K: /* BAUD = 900kbps */
CAN_InitStructure->CAN_BS1 = CAN_BS1_5tq;
CAN_InitStructure->CAN_BS2 = CAN_BS2_4tq;
CAN_InitStructure->CAN_Prescaler = 4;
break;
case CAN_BAUD_1000K: /* BAUD = 1000kbps */
CAN_InitStructure->CAN_BS1 = CAN_BS1_6tq;
CAN_InitStructure->CAN_BS2 = CAN_BS2_5tq;
CAN_InitStructure->CAN_Prescaler = 3;
break;
default: /* BAUD = 50kbps */
CAN_InitStructure->CAN_BS1 = CAN_BS1_8tq;
CAN_InitStructure->CAN_BS2 = CAN_BS2_7tq;
CAN_InitStructure->CAN_Prescaler = 45;
break;
}
CAN_Init(CAN1,CAN_InitStructure);
//CAN filter init
for (i = 0; i < iFilterNum; i++)
{
CAN_FilterInitStructure->CAN_FilterNumber = i; /* 选择过滤器组(0~13) */
CAN_FilterInitStructure->CAN_FilterMode = CAN_FilterMode_IdMask;/* 过滤器模式 */
// CAN_FilterMode_IdMask:屏蔽位模式
// CAN_FilterMode_IdList:标识符模式
CAN_FilterInitStructure->CAN_FilterScale = CAN_FilterScale_32bit;
// CAN_FilterScale_16bit:2个16位过滤器
// CAN_FilterScale_32bit:1个32位过滤器
CAN_FilterInitStructure->CAN_FilterIdHigh = (u16)(pFilterId >> 16);
CAN_FilterInitStructure->CAN_FilterIdLow = (u16)(pFilterId);
CAN_FilterInitStructure->CAN_FilterMaskIdHigh = (u16)(pFilterMaskId >> 16);
CAN_FilterInitStructure->CAN_FilterMaskIdLow = (u16)pFilterMaskId;
CAN_FilterInitStructure->CAN_FilterFIFOAssignment= CAN_FIFO0;
CAN_FilterInitStructure->CAN_FilterActivation = ENABLE; /* 过滤器激活 */
CAN_FilterInit(CAN_FilterInitStructure);
}
// CAN_Transmit((CanTxMsg *)&gsCanTxBuf); //激活发送空中断
CAN_CancelTransmit(CAN1,0);
CAN_CancelTransmit(CAN1,1);
CAN_CancelTransmit(CAN1,2);
CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE);
CAN_ITConfig(CAN1,CAN_IT_ERR, ENABLE);
CAN_ITConfig(CAN1,CAN_IT_LEC, ENABLE);
CAN_ITConfig(CAN1,CAN_IT_EWG, ENABLE);
CAN_ITConfig(CAN1,CAN_IT_EPV, ENABLE);
CAN_ITConfig(CAN1,CAN_IT_BOF, ENABLE);
CAN_FIFOInit(gsCanRxFifo);
CAN_FIFOInit(gsCanTxFifo);
myfree(SRAMIN,CAN_InitStructure);
myfree(SRAMIN,CAN_FilterInitStructure);
} |
|