void can1_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* GPIOA */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE);
/* CAN1 时钟*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
/* Configure CAN pin: RX */ // PA11
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Configure CAN pin: TX */ // PA12
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// GPIO_InitTypeDef GPIO_InitStructure;
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
// RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
//
// GPIO_PinRemapConfig(GPIO_Remap1_CAN1 , ENABLE); //端口复用为CAN1
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //PB8:CAN-RX
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //输入上拉
// GPIO_Init(GPIOB, &GPIO_InitStructure);
//
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PB9:CAN-TX
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用模式
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/****************************************************************************
* 名 称:TestStatus CAN_Interrupt(void)
* 功 能:中断模式下的CAN收发
* 入口参数:无
* 出口参数:无
* 说 明:
* 调用方法:无
****************************************************************************/
void can1_Interrupt(void)
{
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
// CanTxMsg TxMessage;
/* CAN寄存器初始化 */
CAN_DeInit(CAN1);
CAN_StructInit(&CAN_InitStructure);
/* CAN单元初始化 */
CAN_InitStructure.CAN_TTCM = ENABLE; //MCR-TTCM 时间触发通信模式使能
CAN_InitStructure.CAN_ABOM = ENABLE; //MCR-ABOM 自动离线管理
CAN_InitStructure.CAN_AWUM = ENABLE; //MCR-AWUM 自动唤醒模式
CAN_InitStructure.CAN_NART = DISABLE; //MCR-NART 禁止报文自动重传 0-自动重传 1-报文只传一次
CAN_InitStructure.CAN_RFLM = ENABLE; //MCR-RFLM 接收FIFO 锁定模式 0-溢出时新报文会覆盖原有报文 1-溢出时,新报文丢弃
CAN_InitStructure.CAN_TXFP = ENABLE; //MCR-TXFP 发送FIFO优先级 0-优先级取决于报文标示符 1-优先级取决于发送请求的顺序
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; //CAN_Mode_LoopBack 环回模式 CAN_Mode_Normal
/*波特率*////9600
// CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; //BTR-SJW 重新同步跳跃宽度 1个时间单元
// CAN_InitStructure.CAN_BS1 = CAN_BS1_1tq; //BTR-TS1 时间段1 占用了2个时间单元
// CAN_InitStructure.CAN_BS2 = CAN_BS2_2tq; //BTR-TS1 时间段2 占用了3个时间单元
// CAN_InitStructure.CAN_Prescaler = 945;
///*波特率*/9.4 k
CAN_InitStructure.CAN_SJW = CAN_SJW_4tq; //BTR-SJW 重新同步跳跃宽度 1个时间单元
CAN_InitStructure.CAN_BS1 = CAN_BS1_6tq; //BTR-TS1 时间段1 占用了2个时间单元
CAN_InitStructure.CAN_BS2 = CAN_BS2_4tq; //BTR-TS1 时间段2 占用了3个时间单元
CAN_InitStructure.CAN_Prescaler = 358;
/////////// 350 < CAN_Prescaler < 372
// CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; //BTR-SJW 重新同步跳跃宽度 1个时间单元
// CAN_InitStructure.CAN_BS1 = CAN_BS1_5tq; //BTR-TS1 时间段1 占用了2个时间单元
// CAN_InitStructure.CAN_BS2 = CAN_BS2_2tq; //BTR-TS1 时间段2 占用了3个时间单元
// CAN_InitStructure.CAN_Prescaler = 487;
CAN_Init(CAN1, &CAN_InitStructure);
/* CAN过滤器初始化 */
CAN_FilterInitStructure.CAN_FilterNumber=13; //
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //FM1R 过滤器组0的工作模式。
//0: 过滤器组x的2个32位寄存器工作在标识符屏蔽位模式;
//1: 过滤器组x的2个32位寄存器工作在标识符列表模式。
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //FS1R 过滤器组0(13~0)的位宽。
//0:过滤器位宽为2个16位; 1:过滤器位宽为单个32位。
// /* 使能报文标示符过滤器按照标示符的内容进行比对过滤,扩展ID不是如下的就抛弃掉,是的话,会存入FIFO0。 */
// CAN_FilterInitStructure.CAN_FilterIdHigh=(((u32)0x1234<<3)&0xFFFF0000)>>16; //要过滤的ID高位
// CAN_FilterInitStructure.CAN_FilterIdLow=(((u32)0x1234<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF;//要过滤的ID低位
// CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xffff;
// CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xffff;
CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
/* 全为0,忽略了报文标识符判别 */
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0; //FFAx : 过滤器位宽设置 报文在通过了某过滤器的过滤后,
//将被存放到其关联的FIFO中。 0:过滤器被关联到FIFO0; 1:过滤器被关联到FIFO1。
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //FACTx : 过滤器激活 软件对某位设置1来激活相应的过滤器。只有对FACTx位清0,
//或对CAN_FMR寄存器的FINIT位设置1后,才能修改相应的过滤器寄存器
//x(CAN_FxR[0:1])。 0:过滤器被禁用; 1:过滤器被激活。
CAN_FilterInit(&CAN_FilterInitStructure);
/* CAN FIFO0 接收中断使能 */
CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
}
|