8-bit Knowledge Base

    Publish
     
      • How to configure the CAN module to prevent unnecessary message’s interrupt

        yucheng | 01/22/2017 | 09:57 PM

        Question

        Is it possible to configure the CAN module to prevent receiving unnecessary message’s interrupt?

        Answer

        The Bosch CAN module supports both 11-bit (standard) and 29-bit (extended) message identifiers. The UMask bit determines whether any of the mask bits (Msk28-0, MXtd, and MDir) are used for acceptance filtering, and the corresponding bit of Mask Registers should be set for 11-bit (standard) or 29-bit (extended) message identifiers. The MXtd and MDir bits indicate whether the Xtd and Dir bit are used for acceptance filtering.

        However, after configuring the acceptance filtering, the CAN controller may receive some unmatched message’s interrupt if the SIE bit (Status Change Interrupt Enable) is enabled.

        The SIE bit is used to disable/enable status change interrupt, if this bit be enabled, an interrupt will be generated when a message transfer is successfully completed or a CAN bus error is detected.

        Status interrupts may be caused by:

        1. Transmission from the CAN modules (TxOK is set) is successful.
        2. Reception of a message on the CAN bus is successful independent of the result of acceptance filtering. IntId register indicate the number of matched message object which caused the interrupt, for the unmatched message, the IntId will be 0x0.
        3. An error on the CAN bus is detected 

        Enable the SIE will cause the interrupt whenever a message be acknowledged in the CAN bus, and if the IE be set, the interrupt will line to the CPU.

        If don’t need to monitor the CAN bus activity closely, this bit will not be recommended to set. And the CAN module will only generate the interrupt after receiving the message matched acceptance filtering.

         

        SIE_interrupt.png

      • 在BL51或LX51中使用常量来设定flash lock字节值

        yucheng | 01/13/2017 | 03:10 AM

        问题

        是否可以在编译代码时指定8051 MCU lock 字节的值 ?

        答案

         

        可以,在使用Keil C51工具链时,可以很容易的通过BL51或LX51来实现

        首先,需要在代码中的某个位置初始化lock 字节的设定。譬如,可以创建一个新的文件,并命名为”lockbyte.c”,然后在其中加入如下的代码,

         

        #include <si_toolchain.h> 
        const uint8_t code lockbyte = 0x00;

        这段代码将会在flash中占用一个byte,且其初始值为0,但此时并未指定其具体地址。为了将这个字节放置在flash的lock字节位置,需要使用到链接器。

        关于lock字节的地址,请查阅相应MCU的参考手册。例如EFM8BB1F8的lock 字节在flash的0x1FFF位置。

         

        如果使用Simplicity Studio,链接器的指令可以在如下位置修改,Project -> Properties -> C/C++ Build -> Settings-> Keil 8051 Linker > Miscellaneous。然后在[Additional Flags]中添加链接器指令。

        如果使用LX51,请在[Additional Flags]中添加如下命令:

         

        SEGMENTS (?CO?LOCKBYTE(C: 0x1FFF))

         如果使用LX51,同时该MCU有code banking, 则需要指定code bank以及地址。例如,使用如下命令将LOCKBYTE放置在bank3 0x1FFFF位置。

         

        SEGMENTS (?CO?LOCKBYTE(B3:0x1FFFF)) OVERLAY (* ! ?CO?LOCKBYTE)

         如果REMOVEUNUNUSED有被使能,那么需要使用OVERLAY命令以保证其不会处理该lock字节,否则链接器会将LOCKBYTE从代码段移除掉。REMOVEUNUNUSED设定在如下位置:

         

        removeable.png

         

        如果使用BL51,相应的命令如下

         

        CODE (?CO?LOCKBYTE(0x1FFF))

         编译完成之后,查看.m51文件或.hex文件,即可以确定是否有将常量放置在指定的lock字节(0x1FFF)位置,同时其初始值是否正确。

         

        map_file.png

         

        link_file.png

      • SPI最大传输速率

        yucheng | 01/13/2017 | 03:09 AM

        问题

        SPI作为master或slave时可以达到的最大传输速率是多少 ?

        答案

        SPI最大传输速率受以下几个条件影响:

        1. SPI的最大时钟频率
        2. CPU处理SPI数据的能力
        3. 输出端驱动能力(PCB所允许的最大信号传输速率)

         

        SPI的最大时钟频率

        一般情况下,SPI模块的最大时钟频率为系统时钟频率的1/2。虽然SPI的传输速率主要受限于CPU处理SPI数据的能力,但在同另一个非常高速率的SPI设备通讯时,SPI的最大时钟频率将有可能制约其传输速率。

         

        CPU处理SPI数据的能力

        通常情况下,考虑到系统中CPU有可能需要处理其他任务,以及对所接收SPI数据的具体运算处理方法,CPU处理SPI数据的能力将影响到整体的传输速率。

        例如,系统在收到SPI数据后只是作简单的累加。如果当前SPI模块的时钟频率是1/2系统时钟频率,接收每一个SPI byte将需要16个系统时钟周期。那么在下一笔SPI数据接收到之前CPU有足够的时间来处理当前数据,此时SPI的最大传输速率即为系统时钟的1/2。

        接下来考虑另外一种情形,假设CPU有50%的时间用于处理其他任务,同时对所接收到的每byte SPI数据,需要100个系统时钟周期来作运算处理。每接收1 byte SPI数据,CPU需要100个时钟周期来作处理,同时需要100个时钟周期来处理其他任务,因此总共需要消耗200个系统时钟周期。用公式表达如下:

        200 *Tsysclk = 8 * Tspiclk;

        spiclk = sysclk/25;

        因此,在这个例子中,我们可以看出SPI的最大传输速率由CPU处理SPI数据的能力所决定。

         

        输出端驱动能力

        最后要考虑的因素是输出节点的驱动力。PCB上的微量电容和器件引脚的输出阻抗相结合,将会形成一个低通滤波器,限制设备间信号的传输速度。通常该滤波器的截止频率可以近似为:

        Fmax = 1 /(2 × π × Rdrive * Ctrace);

        其中Rdrive是所驱动的最大阻抗值,Ctrace表示输出节点所驱动的所有微量电容的总和。

        在固定阻抗条件下,电路的微量电容将成为制约SPI传输速率的因素。系统中如果设备间的距离非常短(Ctrace较小值),那么CPU的处理能力或SPI的时钟频率将是主要限制因素。如果系统中总线上有多个SPI设备,同时设备间的连线很长(Ctrace较大值),那么输出驱动能力将制约SPI的传输速率。