NXP 飞思卡尔 S12Z 系列单片机 SCI 设置(解决SCI已经设置完成,但却无法通信的问题)

Posted 15821216114sw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NXP 飞思卡尔 S12Z 系列单片机 SCI 设置(解决SCI已经设置完成,但却无法通信的问题)相关的知识,希望对你有一定的参考价值。

  近日在使用了飞思卡尔S12Z设置SCI后总是不出数据,明明按照前代单片机S12Z的方法设置好了,为什么又不能用了呢?

       下面是我简单对SCI1的设置,仅仅这样设置是出不来数据的:

1 SCI1BD = GLOBAL_BUS_CLOCK / SCI1_BAUD_RATE;
2 SCI1CR2 = SCI1CR2_RE_MASK + SCI1CR2_TE_MASK + SCI1CR2_RIE_MASK;

        在上面的设置中我仅仅设置了SCI1的设置,假设了S12Z与S12一样,不存在同一口多个功能复用的情况。可实际上确实,在S12Z系列单片机中大量存在复用引脚的情况,也就是说一个引脚除了原本基本的功能外,还复用了SCI,SPI等通讯口(这里要吐槽这个垃圾文档了,明明是可以在SCI的这一章里面提一下可能存在多功能复用同一个口的情况的)。不管怎么说后来还是在Port章中见到了这个S12Z引脚设置,先看看引脚复用功能的情况:

技术分享图片

       自文档中我们可以看到PS0 - PS3 都复用了其他的功能, 观察一下可以发现SCI1可以既在PS0, PS1 又可以在PS2和PS3口输出,如果要只在PS2, PS3使用SCI1功能怎么办呢?在PIM这节中对寄存器的解释中就找到了我们需要的寄存器:

技术分享图片

       MODRR0这个寄存器有详细的解释,但是需要注意的是,在Normal Mode情况下(也就是我们没有设置过运行模式的情况下),这个寄存器只能有一次写操作,这就意味着对它当中的多个功能模式进行修改时需要一次写入。由于某个引脚可能会复用多个功能,我们在设置完成后一定要保证只有一个功能可以独占此引脚,否则设置的结果同样可能出错。下面是上述MODRR0寄存器各bit的定义:

技术分享图片

  可以看到,如果我需要让PS2, PS3只使用SCI1功能。对SPI0RR,以及SCI1RR位均需要设置,而且只能一次性设置,那么在导入库函数的情况下可以这样:

1 MODRR0 |= MODRR0_SCI1RR_MASK +  MODRR0_SPI0RR_MASK;
2 SCI1BD = GLOBAL_BUS_CLOCK / SCI1_BAUD_RATE;
3 SCI1CR2 = SCI1CR2_RE_MASK + SCI1CR2_TE_MASK + SCI1CR2_RIE_MASK;

  若直接设置可以这样:

1 MODRR0 |= 0x18;
2 SCI1BD = GLOBAL_BUS_CLOCK / SCI1_BAUD_RATE;
3 SCI1CR2 = 0x2c;

      应当注意的是,S12Z开始类似于STM32在同一引脚上实现了多种功能的复用,在SCI0, LIN, CAN通讯的引脚设置中一定要多考虑到引脚复用功能的设置。

      注: 本系列文章均为原创,如有转载引用请标明来源

以上是关于NXP 飞思卡尔 S12Z 系列单片机 SCI 设置(解决SCI已经设置完成,但却无法通信的问题)的主要内容,如果未能解决你的问题,请参考以下文章

freescale飞思卡尔 HCS12 系列单片机bootloader详解

freescale飞思卡尔 HCS12 系列单片机bootloader详解

飞思卡尔K60最小系统板设计方案(包含原理图与PCB)

飞思卡尔MC9S12系列单片机地址影射以及分页问题

freescale飞思卡尔 HC9S12 系列单片机 Flash擦写详解之时钟设置

freescale飞思卡尔 HC9S12 系列单片机 Flash擦写详解之Flash控制器指令执行