#include
#include "sys.h"
#include "delay.h"
#include "CAN.h"
CAN_msg CAN_TxMsg; //发送邮箱
CAN_msg CAN_RxMsg; //接收邮箱
u8 CAN_TxRdy=0; //发送就绪标志
u8 CAN_RxRdy=0; //接收就绪标志
u8 CAN_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寄存器相关位 410 400
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
}