在线时间4 小时
UID3514017
注册时间2018-10-18
NXP金币0
该用户从未签到
新手上路

- 积分
- 39
- 最后登录
- 2021-3-8
|
void BSP_CAN_Init(uint_8 mode,uint_8 open_filter,uint_32 acc_id)
{
uint_8 i;
MSCAN_MemMapPtr p = (MSCAN_MemMapPtr) MSCAN_BASE_PTR;
//MSCAN的引脚复用选择CAN_TX为PTE7,CAN_RX为PTH2
SIM_PINSEL1 |= (uint_32)(SIM_PINSEL1_MSCANPS_MASK);
//MSCAN模块时钟门控制;SIM_SCGC的MSCAN位=1:使能总线给MSCAN时钟;
//SIM_SCGC的MSCAN位=0:禁止总线给MSCAN时钟
SIM_SCGC |=(uint_32)(SIM_SCGC_MSCAN_MASK);
//MSCAN12模块使能
p->CANCTL1 |= MSCAN_CANCTL1_CANE_MASK;
//请求进入初始化模式
p->CANCTL0 |= MSCAN_CANCTL0_INITRQ_MASK;
//等待应答进入初始化模式
while ((p->CANCTL1 & MSCAN_CANCTL1_INITAK_MASK)== 0);
if(open_filter) //开启接收过滤器,只接收标示符为acc_id的帧
{
// 使用2个32位接收过滤器
p->CANIDAC &= ~MSCAN_CANIDAC_IDAM_MASK;
// 第1个32位滤波器
// 设置接受寄存器的值
p->CANIDAR_BANK_1[0]=acc_id>>3;
p->CANIDAR_BANK_1[1]=acc_id<<5;
p->CANIDAR_BANK_1[2]=0xFF;
p->CANIDAR_BANK_1[3]=0xFF;
// 设置屏蔽寄存器的值
p->CANIDMR_BANK_1[0]=0x00;
p->CANIDMR_BANK_1[1]=0x1F;
p->CANIDMR_BANK_1[2]=0xFF;
p->CANIDMR_BANK_1[3]=0xFF;
// 第2个32位滤波器
// 设置接受寄存器的值
p->CANIDAR_BANK_2[0]=acc_id>>3;
p->CANIDAR_BANK_2[1]=acc_id<<5;
p->CANIDAR_BANK_2[2]=0xFF;
p->CANIDAR_BANK_2[3]=0xFF;
// 设置屏蔽寄存器的值
p->CANIDMR_BANK_2[0]=0x00;
p->CANIDMR_BANK_2[1]=0x1F;
p->CANIDMR_BANK_2[2]=0xFF;
p->CANIDMR_BANK_2[3]=0xFF;
}
else//关闭过滤器
{
for (i = 0; i < 16; i++)
{
if( i <=3)
p->CANIDAR_BANK_1 = 0xFF;
else if(i>=4 && i <=7)
p->CANIDMR_BANK_1[i-4] = 0xFF;
else if(i>=8 && i <=11)
p->CANIDAR_BANK_2[i-8] = 0xFF;
else
p->CANIDMR_BANK_2[i-12]= 0xFF;
}
}
//配置时钟
p->CANCTL1 |= MSCAN_CANCTL1_CLKSRC_MASK; // 采用总线时钟(20MHz)作为模块时钟
p->CANBTR0 |= MSCAN_CANBTR0_SJW(0);
p->CANBTR1 |= MSCAN_CANBTR1_SAMP_MASK; // 位时间采样次数为3
// MSCAN传输波特率 = 模块时钟 / [(1 + TSEG1 + TSEG2) * 分频因子]
// = 20000K/[(1+12+7)*4]=250Kbps
p->CANBTR0 |= MSCAN_CANBTR0_BRP(3); // 模块时钟4分频
p->CANBTR1 |= MSCAN_CANBTR1_TSEG2(6); // TSEG2:6+1=7 Tq
p->CANBTR1 |= MSCAN_CANBTR1_TSEG1(11); // TSEG1:11+1=12 Tq
//配置工作模式
if(LOOP_MODE == mode)
p->CANCTL1 |= MSCAN_CANCTL1_LOOPB_MASK; // 开启回环模式
p->CANCTL1 &= ~MSCAN_CANCTL1_LISTEN_MASK; // 禁止侦听模式,即开启正常模式
//退出初始化模式
p->CANCTL0 &= ~MSCAN_CANCTL0_INITRQ_MASK; //退出初始化模式,进入正常模式
//设置中断方式
p->CANTIER = 0x00; //禁止发送中断
p->CANRIER = 0x01; //开启接收满中断
//设置嵌套向量中断控制寄存器值,使能CAN接收中断
NVIC_EnableIRQ(MSCAN_RX_IRQn);
//等待应答初始化模式
while ((p->CANCTL1 & MSCAN_CANCTL1_INITAK_MASK) == 1);
//等待总线通信时钟同步
while ((p->CANCTL0 & MSCAN_CANCTL0_SYNCH_MASK) == 0);
程序卡死在这里,使用例程情况一样,请问大家有遇到这种情况的吗?
如果排查的话需要从哪个方面入手,万分感谢。
}
|
|