KEAZ128中MSCAN的同步时钟初始化失败已解决

运行环境:

MSCAN初始化代码(采用24MHz总线时钟当时不行,于是直接采用了外部晶振时钟16MHz)

MSCAN初始化成功代码

void CAN_Init(uint_8 mode,uint_8 open_filter,uint_32 acc_id)
{
    uint_8 i;
		//对CAN_EN和CAN_STB置高,进入正常模式
	  gpio_init(CAN_EN, GPIO_OUTPUT, TURN_ON);
	  gpio_init(CAN_STB, GPIO_OUTPUT, TURN_ON);
		gpio_init(CONTROL, GPIO_OUTPUT, TURN_OFF);

    MSCAN_MemMapPtr p = (MSCAN_MemMapPtr) MSCAN_BASE_PTR;

	  //MSCAN模块时钟门控制;SIM_SCGC的MSCAN位=1:使能总线给MSCAN时钟;
    //SIM_SCGC的MSCAN位=0:禁止总线给MSCAN时钟
    SIM_SCGC |=(uint_32)(SIM_SCGC_MSCAN_MASK);
    //MSCAN的引脚复用选择CAN_TX为PTC7,CAN_RX为PTC6
    SIM_PINSEL1 &= (uint_32)~(uint_32)(SIM_PINSEL1_MSCANPS_MASK);

	  MSCAN->CANCTL0 |= MSCAN_CANCTL0_INITRQ_MASK;  //MSCAN初始化请求
	
		while(!(MSCAN->CANCTL1 & MSCAN_CANCTL1_INITAK_MASK)){;} //等待初始化模式确认
		MSCAN->CANCTL1 =0x80; //使能MSCAN 选择OSC时钟  

    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)			//i>=0 && 
                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;    // 采用晶振时钟(16MHz)作为模块时钟
    p->CANBTR0 |= MSCAN_CANBTR0_SJW(2);
    p->CANBTR1 &= ~MSCAN_CANBTR1_SAMP_MASK;     // 位时间采样次数为1
    // MSCAN传输波特率 = 模块时钟 / [(1 + TSEG1 + TSEG2) * 分频因子]
    //                = 16000K/[(1+4+11)*2]=500Kbps
		//500K   BRP=1   TSEG1=15   TSEG2=2
    p->CANBTR0 |= MSCAN_CANBTR0_BRP(1);        // 模块时钟2分频
    p->CANBTR1 |= MSCAN_CANBTR1_TSEG2(3);      // TSEG2:3+1=4 Tq
    p->CANBTR1 |= MSCAN_CANBTR1_TSEG1(10);     // TSEG1:10+1=11 Tq

    //配置工作模式
		if(mode == LOOP_MODE)
		{
		 MSCAN->CANCTL1 |= MSCAN_CANCTL1_LOOPB_MASK;
		}
		else
		{
		 MSCAN->CANCTL1 &= ~MSCAN_CANCTL1_LOOPB_MASK;
		}
    p->CANCTL1 &= ~MSCAN_CANCTL1_LISTEN_MASK;   // 禁止侦听模式,即开启正常模式

    //退出初始化模式
    p->CANCTL0 &= ~MSCAN_CANCTL0_INITRQ_MASK;   //退出初始化模式,进入正常模式
		
    //等待应答初始化模式
    while ((p->CANCTL1 & MSCAN_CANCTL1_INITAK_MASK) == 1);

    //等待总线通信时钟同步
    while ((p->CANCTL0 & MSCAN_CANCTL0_SYNCH_MASK) == 0);
		
		    //设置中断方式
    p->CANTIER = 0x00;                          //禁止发送中断
    p->CANRIER = 0x01;                          //开启接收满中断
    //设置嵌套向量中断控制寄存器值,使能CAN接收中断
    NVIC_Init(MSCAN_RX_IRQn,2);
		gpio_set(CONTROL,GPIO_HIGH);
}

初始化流程图

在这里插入图片描述

初始化失败分析

任何正在进行的传输或接收都将中止,与CAN总线的同步将丢失。该模块通过设置INITAK = 1来指示进入初始化模式。

初始化异常原因

导致我们初始化时钟域请求失败的原因可能有:
1.CAN芯片是否存在且正常供电(同网上要有外联CANH-CANL节点)
2.CAN芯片是否损坏
3.保证电源电压至少为CAN芯片最低工作电压

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Keaz128pack固件库是一个用于Keaz128微控制器的软件代码库,它包含了各种功能模块和驱动程序,可以帮助开发者轻松地实现各种应用,实现代码重用和快速开发。 Keaz128pack固件库的组成部分包括ADC(模数转换器)、比较器、CRC(循环冗余校验)、GPIO(通用输入输出)、I2C、SPI、UART、PWM(脉冲宽度调制)等多个模块。 除了这些功能模块,Keaz128pack固件库还提供了多个常用驱动程序,例如时钟控制、DMA(直接存储器访问)、闪存编程等等。这些驱动程序可以大大降低开发者的工作量,同时也可以提高代码的可重用性。 Keaz128pack固件库还提供了完整的实验文档和示例代码,方便开发者学习和参考。开发者可以根据自己的实际需求,选择需要的模块和驱动程序进行集成,并根据实验文档和示例代码进行开发和测试。 总之,Keaz128pack固件库是一个功能完备、易于使用、具有高可重用性的软件代码库,可以帮助开发者快速开发出各种应用,提高开发效率和代码质量。 ### 回答2: keaz128pack固件库是由NXP公司开发提供的一个基于Keil MDK的CMSIS-DAP调试器所支持的固件库。它是专门用于Keaz128版本的微控制器开发的,其Keaz128是一种低功耗、高精度、高可靠性的MCU,可用于许多不同的应用方案keaz128pack固件库包含了许多不同的代码库,例如驱动器和库例程,用于简化开发人员在开发Keaz128设备时的工作。这些库包括了许多常用的功能,例如串口通信、断处理、时钟管理、GPIO控制和ADC等功能。 使用keaz128pack固件库还可以方便地开发Keaz128设备的模块、驱动程序和应用程序。同时,这个固件库还提供了一些不同的开发工具,例如Eclipse、CodeWarrior、IAR Systems、Atollic TrueSTUDIO和Keil等。 总的来说,keaz128pack固件库是一个非常有用的工具,可以帮助开发人员更加轻松地开发基于Keaz128微控制器的应用程序,提高开发效率和开发质量。 ### 回答3: Keaz128pack固件库是一个为Keaz128微控制器提供支持的固件库。Keaz128微控制器是一种低功耗高性能的微处理芯片,被广泛应用于自动化、嵌入式系统、通讯控制等领域。Keaz128pack固件库提供了丰富的外设支持和功能,包括GPIO控制、UART通讯、SPI通讯、I2C通讯、ADC采集、PWM输出、定时器和断等。通过Keaz128pack固件库,用户可以快速轻松地开发出各种应用程序,并部署到Keaz128微控制器上。 Keaz128pack固件库提供了通用的API接口,允许用户在不同的编程环境下使用,如C语言、汇编语言等。同时,在Keaz128pack固件库的基础上,用户可以针对特定的应用领域进行二次开发和定制,实现更加高效的应用程序。 总之,Keaz128pack固件库是一款非常适合Keaz128微控制器的固件库,它提供了全面的功能和支持,可以帮助用户快速开发出各种应用程序,同时也为用户提供了一种方便的二次开发和定制的方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸟小世界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值