CAN端口映射到PB如何设置初始化

2019-10-11 16:43发布

CAN通讯一直调试不成功 //请问下面初始化问题出在什么地方,主要是端口映射设置和时钟选择,CAN的时钟用那个? RCC->APB1ENR|=1<<25;//使能CAN时钟 CAN使用的是APB1的时钟(max:36M) RCC->APB2ENR|=0X00000001; //第1位是AFIO EN (时钟不知道用上一行还是这行)
谢谢!



//CAN端口映射到PB7,PB8上 PB8 :CAN Rx(Pin45)        B9:CAN Tx(Pin46) //芯片型号:STM32F10C8T6 u8 CAN_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode) { u16 i=0;   if(tsjw==0||tbs2==0||tbs1==0||brp==0)return 1; tsjw-=1;//先减去1.再用于设置 tbs2-=1; tbs1-=1; brp-=1;

RCC->APB2ENR|=1<<3;    //使能PORTB时钟 //RCC->APB2ENR|=1<<2;    //使能PORTA时钟 GPIOB->CRH&=0XFFFFFF00;//设置位先清0  //GPIOA->CRH&=0XFFF00FFF; // GPIOB->CRH|=0X000000B8;//PB8 RX(输入上拉),PB9  TX复用功能推挽输出//GPIOA->CRH|=0X000B8000;//PA11 RX,PA12 TX推挽输出          GPIOB->ODR|=3<<8;//端口位清0或设置 //GPIOA->ODR|=3<<11;
AFIO->MAPR&=0XFFFF9FFF; //第14位,13位是CAN-remap    10:CANRX映像到PB8,CANTX映像到PB9  00是映射到PA口 AFIO->MAPR|=0X00004000; // 10:CANRX映像到PB8  CANTX映像到PB9      RCC->APB1ENR|=1<<25;//使能CAN时钟 CAN使用的是APB1的时钟(max:36M) RCC->APB2ENR|=0X00000001; //第1位是AFIO EN (时钟不知道用上一行还是这行)
CAN->MCR=0x0000; //退出睡眠模式(同时设置所有位为0) CAN->MCR|=1<<0; //请求CAN进入初始化模式 while((CAN->MSR&1<<0)==0) { i++; if(i>100)return 2;//进入初始化模式失败 } CAN->MCR|=0<<7; //非时间触发通信模式 CAN->MCR|=0<<6; //软件自动离线管理 CAN->MCR|=0<<5; //睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位) CAN->MCR|=1<<4; //禁止报文自动传送 CAN->MCR|=0<<3; //报文不锁定,新的覆盖旧的 CAN->MCR|=0<<2; //优先级由报文标识符决定 CAN->BTR=0x00000000;//清除原来的设置. CAN->BTR|=mode<<30; //模式设置 0,普通模式;1,回环模式; CAN->BTR|=tsjw<<24; //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN->BTR|=tbs2<<20; //Tbs2=tbs2+1个时间单位 CAN->BTR|=tbs1<<16; //Tbs1=tbs1+1个时间单位 CAN->BTR|=brp<<0;   //分频系数(Fdiv)为brp+1 //波特率:Fpclk1/((Tbs1+Tbs2+1)*Fdiv) CAN->MCR&=~(1<<0); //请求CAN退出初始化模式 while((CAN->MSR&1<<0)==1) { i++; if(i>0XFFF0)return 3;//退出初始化模式失败 } //过滤器初始化 CAN->FMR|=1<<0; //过滤器组工作在初始化模式 CAN->FA1R&=~(1<<0); //过滤器0不激活 CAN->FS1R|=1<<0;  //过滤器位宽为32位. CAN->FM1R|=0<<0; //过滤器0工作在标识符屏蔽位模式 CAN->FFA1R|=0<<0; //过滤器0关联到FIFO0 CAN->sFilterRegister[0].FR1=0X00000000;//32位ID CAN->sFilterRegister[0].FR2=0X00000000;//32位MASK CAN->FA1R|=1<<0; //激活过滤器0 CAN->FMR&=0<<0; //过滤器组进入正常模式
#if CAN_RX0_INT_ENABLE   //使用中断接收 CAN->IER|=1<<1; //FIFO0消息挂号中断允许.      MY_NVIC_Init(1,0,USB_LP_CAN_RX0_IRQChannel,2);//组2 #endif return 0; }  
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。