在线时间0 小时
UID3763575
注册时间2021-7-22
NXP金币0
该用户从未签到
新手上路

- 积分
- 14
- 最后登录
- 2021-7-22
|
如图片所示,程序明明已经初始化,并对MSCAN相关寄存器配置了,但是在仿真RUN的时候,在keil system view上看到的寄存器确实0,相当于全部没写入。各位大神帮忙解解惑。初始化程序如下:
void CAN_Init(uint_8_t mode,uint_8_t open_filter,uint_8_t acc_id)
{
uint_8_t i;
MSCAN_MemMapPtr p = (MSCAN_MemMapPtr) MSCAN_BASE_PTR;
SIM_PINSEL1 |= (SIM_PINSEL1_MSCANPS_MASK); //MSCAN的引脚复用选择CAN_TX为PTE7,CAN_RX为PTH2
SIM_SCGC |=(SIM_SCGC_MSCAN_MASK); //MSCAN模块时钟门控制;SIM_SCGC的MSCAN位=1:使能总线给MSCAN时钟;
p->CANCTL1 |= MSCAN_CANCTL1_CANE_MASK; //MSCAN12模块使能 0X80
p->CANCTL0 |= MSCAN_CANCTL0_INITRQ_MASK;//请求进入初始化模式 0X1U 初始化模式请求
while ((p->CANCTL1 & MSCAN_CANCTL1_INITAK_MASK)== 0); //等待应答进入初始化模式
if(open_filter) //开启接收过滤器,只接收标示符为acc_id的帧
{
p->CANIDAC &= ~MSCAN_CANIDAC_IDAM_MASK; // 使用2个32位接收过滤器
// 第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[i] = 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; // 采用总线时钟(24MHz)作为模块时钟
p->CANBTR0 |= MSCAN_CANBTR0_SJW(0);
p->CANBTR1 |= MSCAN_CANBTR1_SAMP_MASK; // 位时间采样次数为3
// MSCAN传输波特率 = 模块时钟 / [(1 + TSEG1 + TSEG2) * 分频因子]
// = 24000K/[(1+16+7)*2]=500Kbps
p->CANBTR0 |= MSCAN_CANBTR0_BRP(1); // 模块时钟2分频
p->CANBTR1 |= MSCAN_CANBTR1_TSEG2(6); // TSEG2:6+1=7 Tq
p->CANBTR1 |= MSCAN_CANBTR1_TSEG1(15); // TSEG1:15+1=16 Tq
//配置工作模式
if(LOOP_MODE == mode)
p->CANCTL1 |= MSCAN_CANCTL1_LOOPB_MASK; // 开启回环模式
p->CANCTL1 &= ~MSCAN_CANCTL1_LISTEN_MASK; // 禁止侦听模式,即开启正常模式
// p->CANCTL1 |=0XC1;
//退出初始化模式
p->CANCTL0 &= ~MSCAN_CANCTL0_INITRQ_MASK; //退出初始化模式,进入正常模式
//设置中断方式
p->CANTIER = 0x00; //禁止发送中断
p->CANRIER = 0x01; //开启接收满中断
//设置嵌套向量中断控制寄存器值,使能CAN接收中断
NVIC_EnableIRQ(MSCAN_RX_IRQn);
//NVIC_ISER |=NVIC_ISER_SETENA30_MASK;
//等待应答初始化模式
while ((p->CANCTL1 & MSCAN_CANCTL1_INITAK_MASK) == 1);
//等待总线通信时钟同步
while ((p->CANCTL0 & MSCAN_CANCTL0_SYNCH_MASK) == 0);
//MSCAN->CANRIER = 0x01;
// NVIC_Init(MSCAN_RX_IRQn,0); //允许接受中断
}
|
-
|