来自奋斗开发板的例程,看有没有用,STM32F103
/****************************************************************************
* 名 称:TestStatus CAN_Interrupt(void)
* 功 能:中断模式下的CAN收发
* 入口参数:无
* 出口参数:无
* 说 明:
* 调用方法:无
****************************************************************************/
TestStatus CAN_Interrupt(void)
{
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
CanTxMsg TxMessage;
//CanRxMsg RxMessage;
//uint8_t TransmitMailbox = 0;
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);
/* CAN寄存器初始化 */
CAN_DeInit(CAN1);
CAN_StructInit(&CAN_InitStructure);
/* CAN单元初始化 */
CAN_InitStructure.CAN_TTCM=DISABLE; //MCR-TTCM 时间触发通信模式使能
CAN_InitStructure.CAN_ABOM=DISABLE; //MCR-ABOM 自动离线管理
CAN_InitStructure.CAN_AWUM=DISABLE; //MCR-AWUM 自动唤醒模式
//CAN_InitStructure.CAN_NART=ENABLE; //MCR-NART 禁止报文自动重传 0-自动重传 1-报文只传一次
CAN_InitStructure.CAN_NART=DISABLE; //MCR-NART 禁止报文自动重传 0-自动重传 1-报文只传一次
CAN_InitStructure.CAN_RFLM=DISABLE; //MCR-RFLM 接收FIFO 锁定模式 0-溢出时新报文会覆盖原有报文 1-溢出时,新报文丢弃
CAN_InitStructure.CAN_TXFP = ENABLE;
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
//CAN_InitStructure.CAN_TXFP=DISABLE; //MCR-TXFP 发送FIFO优先级 0-优先级取决于报文标示符 1-优先级取决于发送请求的顺序
//CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack; //BTR-SILM/LBKM CAN环回模式
CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; //BTR-SJW 重新同步跳跃宽度 1个时间单元
CAN_InitStructure.CAN_BS1=CAN_BS1_2tq; //BTR-TS1 时间段1 占用了2个时间单元
CAN_InitStructure.CAN_BS2=CAN_BS2_3tq; //BTR-TS1 时间段2 占用了3个时间单元
#if CAN_BAUDRATE == 1000 /* 1MBps */
CAN_InitStructure.CAN_Prescaler =6; //BTR-BRP 波特率分频器 定义了时间单元的时间长度 36/(1+2+3)/6=1Mbps
#elif CAN_BAUDRATE == 500 /* 500KBps */
CAN_InitStructure.CAN_Prescaler =12;
#elif CAN_BAUDRATE == 250 /* 250KBps */
CAN_InitStructure.CAN_Prescaler =24;
#elif CAN_BAUDRATE == 125 /* 125KBps */
CAN_InitStructure.CAN_Prescaler =48;
#elif CAN_BAUDRATE == 100 /* 100KBps */
CAN_InitStructure.CAN_Prescaler =60;
#elif CAN_BAUDRATE == 50 /* 50KBps */
CAN_InitStructure.CAN_Prescaler =120;
#elif CAN_BAUDRATE == 20 /* 20KBps */
CAN_InitStructure.CAN_Prescaler =300;
#elif CAN_BAUDRATE == 10 /* 10KBps */
CAN_InitStructure.CAN_Prescaler =600;
#endif
//CAN_InitStructure.CAN_TXFP=DISABLE;
//CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;
// CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
// CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;
// CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;
//CAN_InitStructure.CAN_Prescaler=1;
CAN_Init(CAN1, &CAN_InitStructure);
/* CAN过滤器初始化 */
CAN_FilterInitStructure.CAN_FilterNumber=0; //
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);
/* 发送一帧报文 */
TxMessage.StdId=0x00;
TxMessage.ExtId=0x1234;
TxMessage.IDE=CAN_ID_EXT;
TxMessage.RTR=CAN_RTR_DATA;
TxMessage.DLC=2; // 帧长度
TxMessage.Data[0]=0xDE;
TxMessage.Data[1]=0xCA;
CAN_Transmit(CAN1, &TxMessage);
/* 等待接收成功标志置位 */
ret = 0xFF;
while(ret == 0xFF);
/* 接收中断禁止*/
CAN_ITConfig(CAN1, CAN_IT_FMP0, DISABLE);
return (TestStatus)ret;
} |