#include#include "sys.h"
#include "delay.h"
#include "CAN.h"
CAN_msgCAN_TxMsg;//发送邮箱
CAN_msgCAN_RxMsg;//接收邮箱
u8 CAN_TxRdy=0;//发送就绪标志
u8 CAN_RxRdy=0;//接收就绪标志
u8CAN_TDTxR_DLC;//数据长度,最高为1111
/////////////////CAN设置/////////////////////////////////////
void CAN_setup(void)
{
u8 brp=20;//获取主时钟频率APB1ENR时钟频率为36M
RCC->APB1ENR|=1<<25;//RCC_APB1ENR_CANEN; //开启CAN使能时钟
RCC->APB2ENR|=1<<0;//RCC_APB2ENR_AFIOEN; //开启辅助时钟
AFIO->MAPR&=0XFFFF9FFF;//清除复用重映射配置寄存器13,14位,
AFIO->MAPR|=0X00004000;//配置为10;IO口重映射至PB8.PB9
RCC->APB2ENR|=1<<3;//RCC_APB2ENR_IOPBEN;//开启IO口B时钟
GPIOB->CRH&=~(0X0F<<0);//清除PB8状态寄存器~(1111<<0)
GPIOB->CRH|=(0X08<<0);//设定pb8上下拉输入1000
GPIOB->CRH&=~(0XF<<4);//清空pb9状态寄存器
GPIOB->CRH|=(0X0B<<4);//设定PB9推挽输出
MY_NVIC_Init(1,1,USB_HP_CAN_TX_IRQChannel,2);//发送中断使能
MY_NVIC_Init(1,1,USB_LP_CAN_RX0_IRQChannel,2);//接收中断使能
CAN->MCR|=1<<4;//置NART位为1,禁止自动重传403
CAN->MCR|=1<<0;//置INRQ位为1,请求初始化403 (CAN_MCR_NART|CAN_MCR_INRQ);//初始化模式,禁止重传
CAN->IER|=1<<0;//发送邮箱空中断允许409
CAN->IER|=1<<1;//FIFO0消息挂号中断允许409 (CAN_IER_FMPIE0|CAN_IER_TMEIE);
//brp=(brp/18)/500000;//波特率设置500Kb/s,计算波特率分频器值
CAN->BTR&=~(((0X03)<<24)|((0x07)<<20)|((0x0f)<<16)|(0x1ff)); //清空BTR寄存器相关位 410400
CAN->BTR|=(((1&0X03)<<24)|((7&0X07)<<20)|((8&0X0F)<<16)|(brp-1));//设置BTR寄存器410 400
}
//////////////从初始化模式进入正常工作模式/////////////////////////////////////////////
void CAN_start(void)
{
CAN->MCR&=0xfffffffe;
while(CAN->MSR&(0x01));
CAN->MCR&=0xfffffffd;//清零INRQ位,进入正常模式
//while(~(CAN->MSR&0x01));//等待硬件对INAK位清零,确认退出初始化
}
//////////////设置工作模式///////////////////////////////////////////
void CAN_testmode(void)
{
CAN->BTR&=0x3fffffff;//清空BTR 的SILM LBKM位410
CAN->BTR|=0XC0000000;//设置BTR 的LBKM位为高,环回模式410
}
///////////////检测发送邮箱为空////////////////////////////////////////////////