Mplab PM3编程实战

前段时间接手一个遥控器项目,使用的Mircochip的PIC12LF1822芯片,经过一周左右的摸索终于完成编码工作,鉴于PIC12LF1822芯片不能进行在线调试,因此代码都是烧录到MCU后进行实测验证。经验证,编码算法、输出序列、休眠唤醒等功能一切OK,在这期间代码的烧录用的都是ICD2,烧录速度也是挺快的。由于这款产品要求每个产品要在软件中定义唯一的序列号,并存储在Flash中。这样一来每个产品的代码在序列号这一段存储空间会各不相同,这将不利于生产操作。如果在源码中直接修改序列号—编译—烧录,则那面出现意外导致产品质量问题,且不利于生产管理。

为此,我咨询了芯片代理商是否有相关的烧录工具,可喜的是他们推荐了一款可以自动修改序列号的PIC烧录工具Mplab PM3。此工具的SQTP功能即为能够自动产生按指定增量递增序列号,也可以产生随机序列号。同时还能指定序列号的存储位置是在程序空间还是在EEPROM空间,能够设置序列号在存放的地址,序列号所占字节数,以及总共需要产生多少个产品序列号。该功能位于Programmer菜单的Settings…选项下。一切设置妥当后即可点击“Generate”按钮将生产的序列号保存成“.num”文件,此文件在烧录代码时需要进行加载。

image

加载SQTP文件在Programmer菜单的Load SQTP file选项下,单击该选项可弹出打开文件对话框,选中已保存的“.num”文件并打开即可。

image

接下来是对PM3的一些设置,点击Programmer菜单下的Settings…选项弹出设置对话框。根据实际使用通讯接口选择通讯端口(RS232方式)或USB,对于Memory Ranges、Voltages、Configuration里面的设置使用默认即可。

image

接着需要选择需要烧录的器件型号,点击Configure菜单的Select Device…选项即可弹出器件选型对话框,选中要烧录的器件型号并确定。

image

最后需要导入HEX文件,点击File菜单下的Import…t选项,弹出打开文件对话框,选中HEX文件并打开即可。

image

完成以上步骤后,点击Programmer菜单下的Program选项即可完成烧录。

Incoming search terms:

  • pic
  • freescale mc9s08 UART
  • MC9S08DZ60 watchdog
  • MPLAB PM3 上海售后
  • pic sqtp 设置
  • PM3
  • sqtp pm3
  • UJA1065 Ӧ

PIC12LF1822休眠功耗

今天对PIC12LF1822休眠功耗测量时发现,休眠的功耗大概在7uA左右,远大于datasheet上所说的典型值30nA。按照说明指示休眠前关闭了watchdog,关闭了timer1的振荡器,关闭了固定参考电压,关闭了低电压检测。

SBOREN = 0;
FVREN = 0;
T1OSCEN = 0;
SWDTEN = 0;

然而功耗未见明显减小。苦闷中不断查阅datasheet后发现“SBOREN=0;”未必能够关闭低电压检测,该位是否起作用还与配置字有关。对BOREN可以配置为“Brown-out Reset controlled by the SBOREN bit in the BORCON register” ,这样低电压检测就可由SBOREN来控制。或者直接配置为“Brown-out Reset enabled while running and disabled in Sleep”,即低电压检测在MCU运行时时能在MCU休眠时禁止。

通过对配置字进行配置后,PIC12LF1822的休眠功耗做到40nA。

Incoming search terms:

  • codewarrior S12G
  • freescale MCU 解锁
  • PIC12LF1822
  • Start Segment Address Record

CAN总线上的帧在被一个节点接收后会消失么

昨天在百度贴吧看到一位网友问道“CAN总线上的帧在被一个节点接收后会消失么?”,由此引发了一些思考。

如果正常的数据收发,某一节点发送的数据帧被其它节点接收后,这里指的是成功接收,那么该帧数据将存入接收节点的接收缓冲器中,总线不再有数据。

如果发送的数据在接收方校验时出现错误,那么该数据帧的应答域应该是2位隐性位,那么发送方会判断出当前总线上无节点应答,在start或wakeup情况下,发送方会重发该数据帧,随着NOACK次数的增加总线会进入“error passive”,但是不会产生“bus off”。

无论哪种情况,总线上是不可能维持数据帧的,因为总线上任意时刻只可能有1位数据.

Incoming search terms:

  • can bus 节点

直流电机霍尔传感器失效分析

由于近期出现的几起电机霍尔传感器故障,造成电动座椅无法实现记忆和迎宾。因此在客户的召集下多方供应商进行一些技术上的探讨,通过与“联派”和“日电”两家电机厂商的交流得知,霍尔传感器的失效机理主要为三类:

  1. 静电放电造成传感器中的霍尔原件击穿。
  2. 异常电压造成传感器中的元件烧损。
  3. 反向电压击穿元件。

对于第一种失效机理,鉴于当期正处于干燥的冬季,极易产生静电,因此对静电的怀疑是理所当然。但是作为车用电子部件在放静电的处理应该是会做的相对比较好,而且两家公司所使用的霍尔传感器都是国际大厂制造相信在ESD试验上应该是会做很认真。所以我认为这种失效的可能性较低,当然也不是不可能。

对于第二种失效机理,由于霍尔传感器作为整车部件,工作在正常的电网环境中,电源电压波动在所难免,并且车上各类用电器频繁开闭,尤其是大功率用电器如空调、雨刮器的开启或关断瞬间,可能会产生瞬时高压。虽然这种电压的脉宽不会太宽,但也有造成元件烧损的可能。由于控制器并未给霍尔传感器采用单独稳压电源或稳压电路来做电源处理,因此我认可这种可能性较大。

对于第三种失效机理,根据二极管的单向导通性我们可以很好的理解,有时反向电压可以造成电路直接短路并烧损,因此我们完全同意并理解这种失效机理。但是针对这一起霍尔传感器故障通过查看线束可以发现线束上并未出现反接现象,并且通过更换电机后可以确认电源反接的可能是不存在的。

通过以上分析,本人觉得造成直流电机霍尔传感器失效的可能原因是电源电压异常。因此建议在霍尔传感器驱动电路中对电源电压做稳压处理。

Incoming search terms:

  • 霍尔元件失效分析
  • 霍尔传感器故障分析
  • 静电与霍尔
  • 霍尔传感器 失效
  • 霍尔元件失效
  • 霍尔元件 烧
  • HALL传感器 电机
  • 霍尔传感器故障
  • 电机霍尔传感器
  • ֱ

S12G系列的定时器

最近Freescale的代理商一直像我们推荐S12G系列的MCU,这是Freescale最近推出的16位MCU其价格上可能会比其8位的MCU还要便宜,譬如S12G128的含税价估计在¥13~14,而我们以前用的S9S08DZ60的含税价至少也得¥14.5~15.5。因此考虑在后面的产品中尽量使用S12G系列的,而且16位的MCU一般会比8位的功耗小哦。

考虑到在应用中会用到定时器作为输入信号的脉宽捕捉,以及PWM输出,我们重点关注了一下S12G系列MCU的定时器。其datasheet中第二十章为定时器的相关描述,但是其中只看到一个定时器,该定时器是一个16bit free-running counter。可被8通道的输入捕捉或输出比较使用。另外在datasheet的第十章中所提到的实时中断也可作为一个定时器来使用,一般咱们可以拿来作为系统的计时器用。虽然PWM模块中也有定时器但是不可作为独立的定时器使用,而且S12G系列MCU中的PWM模块不再有任何中断。

由此可以看出S12G系列MCU中实际可用的定时器只有两个,因此在实际应用中可要认真分配定时器了。对于嵌入式操作系统的系统而言,由于系统需要占用一个定时器,那么给用户使用的也就只有一个定时器了,如何合理的分配和利用这定时器对嵌入式工程师来说是非常重要的。

由于8通道的输入捕捉公用一个定时器,那么我们在做多通道输入捕捉时该如何使用这个定时器呢,对于我这样的初级单片机工程师似乎是一个比较棘手的问题。貌似需要配合定时器溢出中断和输入中断一起来用了,这个问题留到日后在实际应用中解决吧,成功后再与各位网友分享。

Incoming search terms:

  • s12G
  • s12g128
  • S12g128定时器原理
  • 正弦波数据烧录文件
  • S12G输入捕捉
  • S12Gϵ
  • s12g128 datasheet
  • DTC在哪个标准中定义的
  • s12g 定时器
  • s12g 定时

诊断故障码定义

DTC是Diagnostic Trouble Code的缩写,中文意思是诊断故障码,它是汽车电子的专业术语。

DTC的设定一般是采用SAEJ2012标准,SAEJ2012中制定了标准的DTC。

DTC一般有四种,其表示方式一般采用五位(字符+数字)的方式,前面两位用来区分故障来自的控制系统,为系统代码。如B0-B3是用在车身控制系统,C0-C3是用在地盘控制系统,P0-P3是用在发动机控制系统,U0-U3是用在通讯故障。第三位是数字,表示SAE定义的故障范围代码,目前只统一了动力系统代码,最后两个数字是提供故障的信息。

DTC在内存中一般用2个字节来表示,具体分配如下。

wps_clip_image_4550

Incoming search terms:

  • DTC 故障码 定义
  • 故障码定义
  • 汽车诊断 dtc

HEX文件格式详解

Hex文件是可以烧录到MCU中,被MCU执行的一种文件格式。如果用记事本打开可发现,整个文件以行为单位,每行以冒号开头,内容全部为16进制码(以ASCII码形式显示)。Hex文件可以按照如下的方式进行拆分来分析其中的内容:

例如 “:1000080080318B1E0828092820280B1D0C280D2854”可以被看作“0×10 0×00 0×08 0×00 0×80 0×31 0x8B 0x1E 0×08 0×28 0×09 0×28 0×20 0×28 0x0B 0x1D 0x0C 0×28 0x0D 0×28 0×54”

第一个字节 0×10表示本行数据的长度;
第二、三字节 0×00 0×08表示本行数据的起始地址;
第四字节 0×00表示数据类型,数据类型有:0×00、0×01、0×02、0×03、0×04、0×05。
’00′ Data Rrecord:用来记录数据,HEX文件的大部分记录都是数据记录
’01′ End of File Record: 用来标识文件结束,放在文件的最后,标识HEX文件的结尾
’02′ Extended Segment Address Record: 用来标识扩展段地址的记录
’03′ Start Segment Address Record:开始段地址记录
’04′ Extended Linear Address Record: 用来标识扩展线性地址的记录
’05′ Start Linear Address Record:开始线性地址记录
然后是数据,最后一个字节 0×54为校验和。

校验和的算法为:计算0×54前所有16进制码的累加和(不计进位),检验和 = 0×100 – 累加和

在上面的后2种记录,都是用来提供地址信息的。每次碰到这2个记录的时候,都可以根据记录计算出一个“基”地址。对于后面的数据记录,计算地址的时候,都是以这些“基”地址为基础的。

HEX文件都是由记录(RECORD)组成的。在HEX文件里面,每一行代表一个记录。记录的基本格式为:

Record mark ‘:’

Length

Load offset

Record type

INFO or DATA

CHKSUM

1 byte

1 byte

2 bytes

1 byte

n bytes

1 byte

看个例子:

:020000040008F2
:10000400FF00A0E314209FE5001092E5011092E5A3
:00000001FF       

对上面的HEX文件进行分析:

第1条记录的长度为02,LOAD OFFSET为0000,RECTYPE为04,说明该记录为扩展段地址记录。数据为0008,校验和为F2。从这个记录的长度和数据,我们可以计算出一个基地址,这个地址为(0×0008 << 16)。后面的数据记录都以这个地址为基地址。

第2条记录的长度为10(16),LOAD OFFSET为0004,RECTYPE为00,说明该记录为数据记录。数据为FF00A0E314209FE5001092E5011092E5,共16个BYTE。这个记录的校验和为A3。此时的基地址为0X80000,加上OFFSET,这个记录里的16BYTE的数据的起始地址就是0×80000 + 0×0004 = 0×80004.

第3条记录的长度为00,LOAD OFFSET为0000,TYPE = 01,校验和为FF。说明这个是一个END OF FILE RECORD,标识文件的结尾。

在上面这个例子里,实际的数据只有16个BYTE:FF00A0E314209FE5001092E5011092E5,其起始地址为0×0004.

Incoming search terms:

  • hex
  • hex文件格式
  • hex文件
  • hex 文件格式
  • hex 文件
  • Start Linear Address Record
  • hex 文件 含义
  • hex文件 segment
  • HEX文件 Start Linear Address Record
  • 05 Start Linear Address Record

S19文件合并

如今在汽车电子软件开发中常常涉及到在线升级,这样的应用中必将会使用Bootloader,一般Bootloader会独立于应用程序,如此则会生成独立的二进制文件。而应用程序也是一个独立的模块,同样也会生成独立的二进制文件。对于Freescale系列MCU则其对应的二进制文件为S19文件。

由于一个嵌入式产品中同时需要烧录两份独立的S19文件该如何实施呢,比较容易实现的便是先将Bootloader烧录至MCU中,然后用在线升级工具,在汽车电子应用中通常为诊断仪。显然,对批量生产来说这是不易被接受的。这就要求将Bootloader和应用程序同时烧录至MCU中,接下来我将介绍如何将两个独立的S19文件合并至一个S19文件中,并通过一次烧录将两个模块都烧录至MCU中。

鉴于我前面做过的两个项目中使用的都是S9S08DZ60 MCU,我将以其中的一个实例作为介绍。

在我的一个电动座椅控制器项目中有一个基于CAN总线的Bootloader,我将其代码分配在0xD600~0xFFAF空间内,而应用程序代码分配在0×1900~0xD5FF空间内,考虑到中断向量入口地址是固定,因此在Bootloader中尽量不用中断,从而避免两个模块中断入口的重叠问题。

前面所述皆为铺垫,现在切入主题吧。首先来开应用程序的S19文件(只截取部分作为说明)

S0450000453A5C44465C5331355C434F44455C5331355F445343555F56322E585C5331355F
445343555F56322E325F3131313032365C62696E5C5331355F445343552E616273A9
S12319008B899EFE05F6AF019EFF05888A81A7FCC6198D4C95E701C6198C4CF732198E20B4
S12319201F898BF687E6024C9EE706E603EE018A4C20037FAF014BFB9E6B05F78A88AF0424

……

S1239A0020A47FB7203F213F22CD1DC88A80000E0100505050505050287FFF7FFF7FFF0119
S1059A20000040
S107FFC485238533D5
S107FFCA86D18BDC71
S107FFD08A488FDBED
S105FFDC884F48
S105FFE899E595
S107FFFC99C5198204
S9030000FC

这其中只包含S0,S1,S9三种类型的记录。根据S19文件格式详解中的介绍我们可以知道,S0只是包含一些对于MCU来说是无用的信息,标识记录的开始,S9也是与MCU代码无关的记录,标识记录的结束。S1才是我们真正需要烧录至MCU中的内容,因此我们需要注意这些记录,不要轻易的改变他们。

接下来看看Bootloader的S19文件(只截取部分作为说明)

S0420000453A5C44465C5331355C434F44455C426F6F746C6F616465725C533135426F6F744
C6F6164657228313131303131295C62696E5C50726F6A6563742E616273C3
S123D600451080943200FC655555260B3200FE6555552603CCD7D43217FE6555552703CC04
S123D620D7D4CDE424E60387E602879EAE898B9EFE07E6039EE711E6029EE7109EAE9EFF9F

……

S123EBA0E601FAE703A606E796CDEAD2CDDD22A70281C607EFC10130261BC607F0C101313F
S11DEBC02613C607F1C10132260BC607F2C101332603A601814F81A601811E
S105FFFED60027
S9030000FC

同样这个S19文件中也只包含S0,S1,S9三种类型的记录。首先咱们复制一份应用程序的S19文件,以防不测。

复制Bootloader中如下部分,并粘贴到应用程序的S19文件中,具体如下

S0450000453A5C44465C5331355C434F44455C5331355F445343555F56322E585C5331355F
445343555F56322E325F3131313032365C62696E5C5331355F445343552E616273A9
S12319008B899EFE05F6AF019EFF05888A81A7FCC6198D4C95E701C6198C4CF732198E20B4
S12319201F898BF687E6024C9EE706E603EE018A4C20037FAF014BFB9E6B05F78A88AF0424

……

S1239A0020A47FB7203F213F22CD1DC88A80000E0100505050505050287FFF7FFF7FFF0119
S1059A20000040

S123D600451080943200FC655555260B3200FE6555552603CCD7D43217FE6555552703CC04
S123D620D7D4CDE424E60387E602879EAE898B9EFE07E6039EE711E6029EE7109EAE9EFF9F

……

S123EBA0E601FAE703A606E796CDEAD2CDDD22A70281C607EFC10130261BC607F0C101313F
S11DEBC02613C607F1C10132260BC607F2C101332603A601814F81A601811E

S107FFC485238533D5
S107FFCA86D18BDC71
S107FFD08A488FDBED
S105FFDC884F48
S105FFE899E595
S107FFFC99C5198204
S9030000FC

接下来咱们考虑的重点就是复位向量的跳转地址问题了,显然两模块的复位向量是重叠,一般我们使用的是Bootloader的复位向量跳转地址,也就是说程序启动首先执行Bootloader的代码,然后在Bootloader中跳转至应用程序中。这样咱们还得对代码做如下修改。

S0450000453A5C44465C5331355C434F44455C5331355F445343555F56322E585C5331355F
445343555F56322E325F3131313032365C62696E5C5331355F445343552E616273A9
S12319008B899EFE05F6AF019EFF05888A81A7FCC6198D4C95E701C6198C4CF732198E20B4
S12319201F898BF687E6024C9EE706E603EE018A4C20037FAF014BFB9E6B05F78A88AF0424

……

S1239A0020A47FB7203F213F22CD1DC88A80000E0100505050505050287FFF7FFF7FFF0119
S1059A20000040

S123D600451080943200FC655555260B3200FE6555552603CCD7D43217FE6555552703CC04
S123D620D7D4CDE424E60387E602879EAE898B9EFE07E6039EE711E6029EE7109EAE9EFF9F

……

S123EBA0E601FAE703A606E796CDEAD2CDDD22A70281C607EFC10130261BC607F0C101313F
S11DEBC02613C607F1C10132260BC607F2C101332603A601814F81A601811E

S107FFC485238533D5
S107FFCA86D18BDC71
S107FFD08A488FDBED
S105FFDC884F48
S105FFE899E595
S107FFFC99C5D600C9
S9030000FC

主要红色部分,咱们已经修改了地址重叠的部分即1982->D600,同时咱们还得行尾的校验和蓝色部分进行修改04->C9。

至此我们的合并工作全部完成。

Incoming search terms:

  • S19
  • S19 文件
  • s19文件
  • S19 合并
  • 两个s19文件 合成一个
  • S19文件比较器
  • s19文件格式说明
  • s19文件格式
  • s19文件 软件
  • freescale 應用程式 s19

VS2010 MFC 静态调用dll

首先在 项目->属性->链接->输入->附加依赖项 中加入需要调用的 xxx.lib。

然后将相应的xxx.h添加到项目中,在需要调用dll函数的文件中#include xxx.h

以后就可以直接调用dll中的函数了。

今天使用该方法调用 Freedesign 的CANApplication.dll中的函数,N次链接失败,最后发现是.lib文件的问题。

因为使用该方法调用 ZLGCAN 的ControlCAN.dll中的函数,一切正常。

Incoming search terms:

  • VS2010
  • VS2010 MFC
  • vs2010 mfc dll
  • vs2010 dll
  • VS2010引用DLL
  • vs2010 引用dll
  • λ
  • vs2010 静态调用dll
  • ControlCAN dll
  • vs2010 调用DLL

UAJ106x SBC 头文件

使用UJA1065过程中,需要对寄存器进行各种操作,你是否为配置各种参数,各种模式而计算每个寄存的值,以及寄存器的地址呢?起码我在使用过程中曾经深受其苦,如果对资料不熟悉,或是象我这样对E文不熟使用这款芯片应该不是那么快就能上手吧?这里给出一份NXP的UJA106x官方头文件,我想在编程时应该是一个很不错的帮助吧,这份头文件适用于“UJA1061”,“UJA1065”,“UJA1066”,“UJA1069”。代码如下,希望能过对需要的朋友有所帮助。

/*****************************************************************************/
/* (C) NXP B.V. 2008.                                                        */
/*                                                                           */
/* All rights are reserved. NXP Semiconductors reserves the right to make    */
/* changes without notice at any time. NXP Semiconductors makes no warranty, */
/* expressed, implied or statutory, including but not limited to any implied */
/* warranty of merchantibility or fitness for any particular purpose, or     */
/* that the use will not infringe any third party patent, copyright or       */
/* trademark. NXP Semiconductors must not be liable for any loss or damage   */
/* arising from its use.                                                     */
/*****************************************************************************/
/* Automotive Innovation Center Hamburg                                      */
/*                                                                           */
/* FILENAME:      UJA106x.h                                                  */
/*                                                                           */
/* VERSION:       1.1                                                        */
/*                                                                           */
/* DESCRIPTION:   Header File for System Basis Chips                         */
/*                UJA1061 / N1E-samples (FT-CAN/LIN SBC)                     */
/*                UJA1065 / N1D-samples (HS-CAN/LIN SBC)                     */
/*                UJA1066 / N1A-samples (HS-CAN SBC)                         */
/*                UJA1069 / N1B-samples (LIN SBC)                            */
/*                                                                           */
/* DOCUMENT REF:  Data Sheet UJA1061                                         */
/*                Data Sheet UJA1065                                         */
/*                                                                           */
/* REVISION HISTORY:                                                         */
/* Version    Author          Date        Remarks                            */
/* 0.9  beta  Andr?Ix        17/02/05    Supports UJA1061-N1D; UJA1065-N1C;  */
/*                                                 UJA1066-N1A; UJA1069-N1A  */
/*                                                                           */
/* 0.91 beta  Andr?Ix        16/09/05    Supports UJA1061-N1E; UJA1065-N1D;  */
/*                                                 UJA1066-N1A; UJA1069-N1B  */
/* 1.0        M. Wagner       15/12/05    CAN On-line Listen Mode inserted   */
/*                                        1066 settings corrected            */
/* 1.1       J. Habermann    19/08/08    Adapt company name                 */
/*****************************************************************************/

/*****************************************************************************/
/* Defines                                                                   */
/*****************************************************************************/
/* Example of how to include this header file in a program:                  */
/* (e.g. for a UJA1069-N1B SBC derivative)                                   */
/*                                                                           */
/* #define SBC_TYPE_UJA1069                                                  */
/* #define SBC_VERSION_N1B                                                   */
/*                                                                           */
/* #include “UJA106x.h”                                                      */
/*****************************************************************************/

#ifndef UJA106X_H
#define UJA106X_H

#ifdef SBC_TYPE_UJA1061
#ifdef SBC_TYPE_SELECTED
#error “more than one SBC type selected”
#else
#define SBC_TYPE_SELECTED
#endif
#ifdef SBC_VERSION_N1E
#ifdef SBC_VERSION_SELECTED
#error “more than one SBC version selected”
#else
#define SBC_ID      0×0281
#define SBC_VERSION_SELECTED
#endif
#endif
#define SBC_TYPE_CAN_AVAILABLE
#define SBC_TYPE_CAN_LOWSPEED
#define SBC_TYPE_LIN_AVAILABLE
#endif

#ifdef SBC_TYPE_UJA1065
#ifdef SBC_TYPE_SELECTED
#error “more than one SBC type selected”
#else
#define SBC_TYPE_SELECTED
#endif
#ifdef SBC_VERSION_N1D
#ifdef SBC_VERSION_SELECTED
#error “more than one SBC version selected”
#else
#define SBC_ID      0×0205
#define SBC_VERSION_SELECTED
#endif
#endif
#define SBC_TYPE_CAN_AVAILABLE
#define SBC_TYPE_CAN_HIGHSPEED
#define SBC_TYPE_LIN_AVAILABLE
#endif

#ifdef SBC_TYPE_UJA1066
#ifdef SBC_TYPE_SELECTED
#error “more than one SBC type selected”
#else
#define SBC_TYPE_SELECTED
#endif
#ifdef SBC_VERSION_N1A
#define SBC_TYPE_UJA1066_N1A
#ifdef SBC_VERSION_SELECTED
#error “more than one SBC version selected”
#else
#define SBC_ID      0×0086
#define SBC_VERSION_SELECTED
#endif
#endif
#define SBC_TYPE_CAN_AVAILABLE
#define SBC_TYPE_CAN_LOWSPEED
#endif

#ifdef SBC_TYPE_UJA1069
#ifdef SBC_TYPE_SELECTED
#error “more than one SBC type selected”
#else
#define SBC_TYPE_SELECTED
#endif
#ifdef SBC_VERSION_N1B
#ifdef SBC_VERSION_SELECTED
#error “more than one SBC version selected”
#else
#define SBC_ID      0×0109
#define SBC_VERSION_SELECTED
#endif
#endif
#define SBC_TYPE_LIN_AVAILABLE
#endif

// check sbc type and version definition
#ifndef SBC_TYPE_SELECTED
#error “SBC: no SBC type selected”
#else
#ifndef SBC_VERSION_SELECTED
#error “SBC: the selected derivative is not supported”
#endif
#endif
/*****************************************************************************/
/* General definitions                                                       */
/*****************************************************************************/

// General Masks
#define SBC_ADDR_MASK        0xC000   // Mask for SBC address

// RO (Read Only)
#define SBC_RO_OFF           0×0000   // Read/Write access
#define SBC_RO_ON            0×1000   // Read only access
/*****************************************************************************/
/* Definitions for Mode Register                                             */
/*****************************************************************************/

// ADDR (Address)
#define SBC_ADDR_MOD_REG     0×0000   // Mode Register access

// Mode Register Masks
#define SBC_OM_MASK          0×0038   // Mask for Operating Mode
#define SBC_NWP_MASK         0x0FC0   // Mask for Nominal Watchdog Period

/*—————————————————————————*/

// EN (Enable)
#define SBC_EN_LOW           0×0000   // EN-pin low
#define SBC_EN_HIGH          0×0002   // EN-pin high

// SDM (Software Development Mode)
#define SBC_SDM_OFF          0×0000   // No Software Development Mode
#define SBC_SDM_ON           0×0004   // Software Development Mode active

// OM (Operating Mode)
#define SBC_OM_NOR           0×0008   // Normal Mode Mode
#define SBC_OM_STA           0×0010   // Standby Mode
#define SBC_OM_SLE           0×0020   // Sleep Mode
#define SBC_OM_INI_NOR       0×0028   // Initialising Normal Mode
#define SBC_OM_FLA           0×0038   // Flash Programming Mode
#define SBC_OM_INI_FLA       0×0018   // Initialising Flash Mode
#define SBC_OM_EXI_FLA       0×0030   // Exit Flash Mode

// NWP (Nominal Watchdog Period)
#define SBC_NWP_0            0×0240   // Nominal Watchdog Period 0
#define SBC_NWP_1            0×0300   // Nominal Watchdog Period 1
#define SBC_NWP_2            0×0480   // Nominal Watchdog Period 2
#define SBC_NWP_3            0×0500   // Nominal Watchdog Period 3
#define SBC_NWP_4            0x06C0   // Nominal Watchdog Period 4
#define SBC_NWP_5            0×0900   // Nominal Watchdog Period 5
#define SBC_NWP_6            0x0B40   // Nominal Watchdog Period 6
#define SBC_NWP_7            0x0CC0   // Nominal Watchdog Period 7
#define SBC_NWP_8            0x0D40   // Nominal Watchdog Period 8
#define SBC_NWP_9            0x0D80   // Nominal Watchdog Period 9
/*****************************************************************************/
/* Definitions for System Status Register                                    */
/*****************************************************************************/

// ADDR (Address)
#define SBC_ADDR_STA_REG     0×0000   // System Status Register access

// RRS (Read Register Select)
#define SBC_RRS_STA_REG      0×0000   // read System Status Register

// System Status Register Masks
#define SBC_RSS_MASK         0x0F00   // Mask for Reset Source Status

/*—————————————————————————*/

// PWON (Power-On Reset Status)
#define SBC_PWONS_RST        0×0000   // Power on Reset
#define SBC_PWONS_NRST       0×0001   // No Power on Reset

// ENS  (Enable Status)
#define SBC_ENS_LOW          0×0000   // EN-pin low
#define SBC_ENS_HIGH         0×0002   // EN-pin high

// SDMS (Software Development Mode Status)
#define SBC_SDMS_OFF         0×0000   // No Software Development Mode
#define SBC_SDMS_ON          0×0004   // Software Development Mode active

// TWS (Temperature Warning Status)
#define SBC_TWS_OK           0×0000   // Temperature below the limit
#define SBC_TWS_ERR          0×0008   // Temperatue exceeds the limit

// LW (Level Wake Status)
#ifdef SBC_TYPE_UJA1066_N1A
#define SBC_LW_LOW        0×0000   // Wake Low Level
#define SBC_LW_HIGH       0×0010   // Wake High Level
#endif

// WLS (Wake Level Status)
#ifndef SBC_TYPE_UJA1066_N1A
#define SBC_WLS_LOW       0×0000   // Wake Low Level
#define SBC_WLS_HIGH      0×0010   // Wake High Level
#endif

// EWS (Edge Wake Status)
#define SBC_EWS_NO_EDG       0×0000   // No level change at WAKE
#define SBC_EWS_EDG          0×0020   // Level change at WAKE

// LWS (LIN Wake Status)
#ifdef SBC_TYPE_LIN_AVAILABLE
#define SBC_LWS_LOW       0×0000   // No Wake event On LIN
#define SBC_LWS_HIGH      0×0040   // Wake event On LIN
#endif

// CWS (CAN Wake Status)
#ifdef SBC_TYPE_CAN_AVAILABLE
#define SBC_CWS_LOW       0×0000   // No Wake event On CAN
#define SBC_CWS_HIGH      0×0080   // Wake event On CAN
#endif

// RSS (Reset Source Status)
#define SBC_RSS_POW_ON       0×0000   // Power-on reset
#define SBC_RSS_CYC_WAK      0×0100   // Cyclic wake-up out of sleep
#define SBC_RSS_LOW_V1       0×0200   // Low V1 supply
#define SBC_RSS_INC_V1       0×0300   // V1 current increased
#define SBC_RSS_SHO_V3       0×0400   // V3 shortcut
#define SBC_RSS_FLA_LEF      0×0500   // Flash Mode successfully left
#define SBC_RSS_FLA          0×0600   // SBC ready to enter Flash Mode
#ifdef SBC_TYPE_CAN_AVAILABLE
#define SBC_RSS_CAN       0×0700   // Wake-up via CAN
#endif
#ifdef SBC_TYPE_LIN_AVAILABLE
#define SBC_RSS_LIN       0×0800   // Wake-up via LIN
#endif
#define SBC_RSS_WAK          0×0900   // Wake-up via WAKE
#define SBC_RSS_FAI_SAF      0x0A00   // Wake-up out of Fail Safe
#define SBC_RSS_WD_LAT       0x0B00   // WD triggered too late
#define SBC_RSS_WD_INI       0x0C00   // WD not initialised in time
#define SBC_RSS_WD_EAR       0x0D00   // WD triggered too early
#define SBC_RSS_ILL_MOD      0x0E00   // Illegal Mode Register Code
#define SBC_RSS_INT_LAT      0x0F00   // Interrupt not served in time
/*****************************************************************************/
/* Definitions for System Diagnosis Register                                 */
/*****************************************************************************/

// ADDR (Address)
#define SBC_ADDR_DIA_REG     0×0000   // System Diagnosis Register access

// RRS (Read Register Select)
#define SBC_RRS_DIA_REG      0×2000   // read Diagnosis Register

// System Diagnosis Register Masks
#ifdef SBC_TYPE_CAN_AVAILABLE
#define SBC_CANMD_MASK    0×0003   // Mask for CAN Mode Diagnosis
#define SBC_CANFD_MASK    0×0780   // Mask for CAN Failure Diagnosis
#endif
#ifdef SBC_TYPE_LIN_AVAILABLE
#define SBC_LINFD_MASK    0×0060   // Mask for LIN Failure Diagnosis
#endif

/*—————————————————————————*/

// CANMD (CAN Mode Diagnosis)
#ifdef SBC_TYPE_CAN_AVAILABLE
#define SBC_CANMD_OFF_LIN 0×0000   // Off-Line Mode or V2 is not active
#define SBC_CANMD_SEL_SLE 0×0001   // Selective Sleep Mode
#define SBC_CANMD_ON_LIN_LIS       0×0001   // On-line Listen mode
#define SBC_CANMD_ON_LIN  0×0002   // On-Line Mode
#define SBC_CANMD_ACT     0×0003   // Active Mode
#endif

// V1D (V1 Diagnosis)
#define SBC_V1D_ERR          0×0000   // V1 too low
#define SBC_V1D_OK           0×0004   // V1 is ok

// V2D (V2 Diagnosis)
#ifdef SBC_TYPE_CAN_AVAILABLE
#define SBC_V2D_ERR       0×0000   // V2 disabled due to shortcut
#define SBC_V2D_OK        0×0008   // V2 is ok
#endif

// V3D (V3 Diagnosis)
#define SBC_V3D_ERR          0×0000   // V3 disabled due to shortcut
#define SBC_V3D_OK           0×0010   // V3 is ok

// LINFD (LIN Failure Diagnosis)
#ifdef SBC_TYPE_LIN_AVAILABLE
#define SBC_LINFD_OK      0×0000   // No failure
#define SBC_LINFD_BAT     0×0020   // LIN shorted to VBAT (recessive)
#define SBC_LINFD_GND     0×0040   // LIN shorted to GND (dominant)
#define SBC_LINFD_TXD_DOM 0×0060   // TXD_L clamped dominant
#endif

//CANFD (CAN Failure Diagnosis)
#ifdef SBC_TYPE_CAN_AVAILABLE
#ifdef SBC_TYPE_CAN_LOWSPEED
#define SBC_CANFD_OK         0×0000   // No failure
#define SBC_CANFD_CANH_INT   0×0080   // CANH wire is interrupted
#define SBC_CANFD_CANL_INT   0×0100   // CANL wire is interrupted
#define SBC_CANFD_CANH_BAT   0×0180   // CANH is shorted to VBAT
#define SBC_CANFD_CANH_VCC   0×0200   // CANH is shorted to VCC
#define SBC_CANFD_CANL_GND   0×0280   // CANL is shorted to GND
#define SBC_CANFD_CANH_GND   0×0300   // CANH is shorted to GND
#define SBC_CANFD_CANL_BAT   0×0380   // CANL is shorted to VBAT
#define SBC_CANFD_CANL_VCC   0×0400   // CANL is shorted to VCC
#define SBC_CANFD_CANH_CANL  0×0480   // CANH is shorted to CANL
#define SBC_CANFD_BUS_REC    0×0580   // Bus is clamped recessive
#define SBC_CANFD_BUS_DOM    0×0600   // Bus is clamped dominant
#define SBC_CANFD_RXD_REC    0×0680   // CAN RXD is clamped recessive
#define SBC_CANFD_RXD_DOM    0×0700   // CAN RXD is clamped dominant
#define SBC_CANFD_TXD_DOM    0×0780   // CAN TXD is clamped dominant
#endif
#ifdef SBC_TYPE_CAN_HIGHSPEED
#define SBC_CANFD_CANH_HV    0×0200 // CANH is shorted to VCC or VBAT
#define SBC_CANFD_CANL_GND   0×0280 // CANL is shorted to GND
#define SBC_CANFD_CANH_GND   0×0300       // CANH is shorted to GND
#define SBC_CANFD_CANL_LV    0×0400 // CANL is shorted to VCC or VBAT
#define SBC_CANFD_CANH_CANL  0×0480 // CANL is shorted to CANH
#define SBC_CANFD_BUS_DOM    0×0600 // Bus is clamped dominant
#define SBC_CANFD_RXD_REC    0×0680 // CAN RXD is clamped recessive
#define SBC_CANFD_RXD_DOM    0×0700 // CAN RXD is clamped dominant
#define SBC_CANFD_TXD_DOM    0×0780 // CAN TXD is clamped dominant
#endif
#endif

// GSD (Ground Shift Diagnosis)
#ifdef SBC_TYPE_CAN_AVAILABLE
#define SBC_GSD_OK        0×0000   // Ground shift level ok
#define SBC_GSD_ERR       0×0800   // Ground shift level error
#endif

/*****************************************************************************/
/* Definitions for Interrupt Enable Register                                 */
/*****************************************************************************/

// ADDR (Address)
#define SBC_ADDR_INT_ENA_REG 0×4000   // Interrupt Enable Register access

// RRS (Read Register Select)
#define SBC_RRS_INT_ENA_REG  0×0000   // read Int. Enable Feedback Register

/*—————————————————————————*/

// LINIE (LIN Interrupt Enable)
#ifdef SBC_TYPE_LIN_AVAILABLE
#define SBC_LINIE_OFF     0×0000   // No LIN interrupt
#define SBC_LINIE_ON      0×0001   // LIN bus wake-up interupt
#endif

// CANIE (CAN Interrupt Enable)
#ifdef SBC_TYPE_CAN_AVAILABLE
#define SBC_CANIE_OFF     0×0000   // No CAN interrupt
#define SBC_CANIE_ON      0×0002   // CAN bus wake-up interupt
#endif

// WDRIE (Watchdog Restart Interrupt Enable)
#ifndef SBC_TYPE_UJA1066_N1A
#define SBC_WDRIE_OFF     0×0000   // No watchdog restart
#define SBC_WDRIE_ON      0×0004   // Watchdog restart during watchdog OFF
#endif

// WIE (Wake Interrupt Enable)
#define SBC_WIE_OFF          0×0000   // No WAKE interrupt
#define SBC_WIE_ON           0×0008   // WAKE wake-up interupt

// LINFIE (LIN Failure Interrupt Enable)
#ifdef SBC_TYPE_LIN_AVAILABLE
#define SBC_LINFIE_OFF    0×0000   // No LIN failure interrupt
#define SBC_LINFIE_ON     0×0010   // LIN failure status change interrupt
#endif

// CANFIE (CAN Failure Interrupt Enable)
#ifdef SBC_TYPE_CAN_AVAILABLE
#define SBC_CANFIE_OFF    0×0000   // No CAN failure interrupt
#define SBC_CANFIE_ON     0×0020   // CAN failure status change interrupt
#endif

// VFIE (Voltage Failure Interrupt Enable)
#define SBC_VFIE_OFF         0×0000   // No voltage failure interrupt
#define SBC_VFIE_ON          0×0040   // Voltage failure interrupt

// BATFIE (BAT Failure Interrupt Enable)
#define SBC_BATFIE_OFF       0×0000   // No BAT failure interrupt
#define SBC_BATFIE_ON        0×0080   // BAT failure interrupt

// SPIFIE (SPI Failure Interrupt Enable)
#define SBC_SPIFIE_OFF       0×0000   // No SPI failure interrupt
#define SBC_SPIFIE_ON        0×0100   // Wrong number of clock cycles at
// SPI (!=16) interrupt

// GSFIE (Ground Shift Failure Interrupt Enable)
#ifdef SBC_TYPE_CAN_AVAILABLE
#define SBC_GSFIE_OFF     0×0000   // No GND shift interrupt
#define SBC_GSFIE_ON      0×0200   // GND shift limit exceeded or dropped
#endif                                // below interrupt

// OTIE (Over Temperature Interrupt Enable)
#define SBC_OTIE_OFF         0×0000   // No over temperature interrupt
#define SBC_OTIE_ON          0×0400   // Temperature limit exceeded or dropped
// below interrupt

// WTIE (Watchdog Timeout Interrupt Enable)
#define SBC_WTIE_OFF         0×0000   // No interrupt
#define SBC_WTIE_ON          0×0800   // Watchdog overflow occured during
// Standby interrupt
/*****************************************************************************/
/* Definitions for Interrupt Register                                        */
/*****************************************************************************/

// ADDR (Address)
#define SBC_ADDR_INT_REG     0×4000   // Interrupt Register access

// RRS (Read Register Select)
#define SBC_RRS_INT_REG      0×2000   // read Interrupt Register

/*—————————————————————————*/

// LINI (LIN Interrupt)
#ifdef SBC_TYPE_LIN_AVAILABLE
#define SBC_LINI          0×0001   // LIN bus wake-up interupt
#endif

// CANI (CAN Interrupt)
#ifdef SBC_TYPE_CAN_AVAILABLE
#define SBC_CANI          0×0002   // CAN bus wake-up interupt
#endif

// WDRI (Watchdog Restart Interrupt)
#ifndef SBC_TYPE_UJA1066_N1A
#define SBC_WDRI          0×0004   // Watchdog restart interrupt
#endif

// WI (Wake Interrupt)
#define SBC_WI               0×0008   // Edge at WAKE detected

// LINFI (LIN Failure Interrupt)
#ifdef SBC_TYPE_LIN_AVAILABLE
#define SBC_LINFI         0×0010   // LIN failure status change
#endif

// CANFI (CAN Failure Interrupt)
#ifdef SBC_TYPE_CAN_AVAILABLE
#define SBC_CANFI         0×0020   // CAN failure status change
#endif

// VFI (Voltage Failure Interrupt)
#define SBC_VFI              0×0040   // Short at voltage Vx detected

// BATFI (BAT Failure Interrupt)
#define SBC_BATFI            0×0080   // Falling edge at SENSE detected

// SPIFI (SPI Failure Interrupt)
#define SBC_SPIFI            0×0100   // Wrong number of clock cycles at
// SPI (!=16)

// GSI (Ground Shift Interrupt)
#ifdef SBC_TYPE_CAN_AVAILABLE
#define SBC_GSI          0×0200    // GND shift limit passed
#endif

// OTI (Over Temperature Interrupt)
#define SBC_OTI              0×0400   // Temperature limit passed

// WTI (Watchdog Timeout Interrupt)
#define SBC_WTI              0×0800   // Watchdog overflow occured during
// Standby
/*****************************************************************************/
/* Definitions for System Configuration Register                             */
/*****************************************************************************/

// ADDR (Address)
#define SBC_ADDR_CON_REG     0×8000   // System Configuration Register access

// RRS (Read Register Select)
#define SBC_RRS_CON_REG      0×0000   // read System Config. Feedback Register

// System Configuration Register Masks
#define SBC_V3C_MASK         0x00C0   // Mask for V3 Configuration

/*—————————————————————————*/

// IC (INH Control)
#ifdef SBC_TYPE_UJA1066_N1A
#define SBC_IC_OFF        0×0000   // INH  Mode -> INH = “float”
#define SBC_IC_ON         0×0001   // INH  Mode -> INH = “HIGH”
#endif

#ifndef SBC_TYPE_UJA1066_N1A
// ILC (INH/LIMP Control)
#define SBC_ILC_LOW       0×0000   // INH / LIMP Control -> Low (Limp Home)
#define SBC_ILC_HIG       0×0001   // INH / LIMP Control -> High (Inhibit)

// ILEN (INH/LIMP Enable)
#define SBC_ILEN_OFF      0×0000   // INH / LIMP disabled
#define SBC_ILEN_ON       0×0002   // INH / LIMP enabled
#endif

// WSC (WAKE Sample Control)
#define SBC_WSC_CON          0×0000   // WAKE Mode -> Continously sample
#define SBC_WSC_CYC          0×0004   // WAKE Mode -> Cyclic sample

// WEN (WAKE Enable)
#define SBC_WEN_OFF          0×0000   // Wake-up via Wake PIN Disabled
#define SBC_WEN_ON           0×0008   // Wake-up via Wake PIN Enabled

// V1CMC (V1 Current Monitor Control) // Behaviour at watchdog off:
#define SBC_V1CMC_WD         0×0000   // V1 current activates watchdog
#define SBC_V1CMC_RES        0×0010   // V1 current activates reset

// V1RTHC (V1 Reset Threshold Control)
#ifdef SBC_TYPE_UJA1066_N1A
#define SBC_V1RTHC_NOR    0×0000   // Normal V1 under-volt. thresh.
#define SBC_V1RTHC_LOW    0×0020   // Low    V1 under-volt. thresh.
#endif

// V3C (V3 Control)
#define SBC_V3C_OFF          0×0000   // V3 off
#define SBC_V3C_ON           0×0040   // V3 on
#define SBC_V3C_CYC_16MS     0×0080   // V3 Cyclic Mode (16ms period)
#define SBC_V3C_CYC_32MS     0x00C0   // V3 Cyclic Mode (32ms period)

// RLC (Reset Length Control)
#define SBC_RLC_1MS          0×0000   // Reset length is 1ms
#define SBC_RLC_20MS         0×0100   // Reset length is 20 ms

// GSTH (Ground Shift Threshold Control)
#ifdef SBC_TYPE_CAN_AVAILABLE
#define SBC_GSTHC_LOW        0×0000   // 0.75V absolute ground shift threshold
#define SBC_GSTHC_HIG        0×0200   // 1.5V absolute ground shift threshold
#endif

/*****************************************************************************/
/* Definitions for Physical Layer Control Register                           */
/*****************************************************************************/

// ADDR (Address)
#define SBC_ADDR_PHY_REG     0xC000   // Physical Layer Control
// Register access
// RRS (Read Register Select)
#define SBC_RRS_PHY_REG      0×0000   // read Physical Layer Control
// Feedback Register

/*—————————————————————————*/

#ifdef SBC_TYPE_LIN_AVAILABLE
// LTC (LIN Transmitter Control)
#define SBC_LTC_ON           0×0000   // LIN transmitter is enabled
#define SBC_LTC_OFF          0×0001   // LIN transmitter is disabled

// LWEN (LIN Wake-up Enable)
#define SBC_LWEN_OFF         0×0000   // LIN Wake-up Disabled
#define SBC_LWEN_ON          0×0002   // LIN Wake-up Enabled

// LDC (LIN Driver Control)
#define SBC_LDC_NOR          0×0000   // LIN driver conform LIN 2.0 standard
#define SBC_LDC_ENH          0×0004   // Enhanced LIN driver capability

// LSC (LIN Slope Control)
#define SBC_LSC_20K          0×0000   // 20.0 kbit/s
#define SBC_LSC_10K          0×0008   // 10.0 kbit/s

// LMC (LIN Mode Control)
#define SBC_LMC_OFF          0×0000   // LIN Off-line Mode
#define SBC_LMC_ACT          0×0010   // LIN Active Mode
#endif

#ifdef SBC_TYPE_CAN_AVAILABLE
// CSC (CAN Split Control)
#ifdef SBC_TYPE_CAN_HIGHSPEED
#define SBC_CSC_ON        0×0000   // Split term. On
#define SBC_CSC_OFF       0×0020   // Split term. Off
#endif

// CMC (CAN Mode Control)
#define SBC_CMC_AUT          0×0000   // CAN Auto Mode
#define SBC_CMC_ACT          0×0040   // CAN Active Mode

// CRC (CAN Receiver Control)
#define SBC_CRC_NOR          0×0000   // No internal feedback (normal)
#define SBC_CRC_TEST         0×0080   // TXD_C forwarded to RXD_C (test)

// CTC (CAN Transmitter Control)
#define SBC_CTC_ON           0×0000   // CAN transmitter is enabled
#define SBC_CTC_OFF          0×0100   // CAN transmitter is disabled

// COTC (CAN Offline Time Control)
#define SBC_COTC_64MS        0×0000   // 64ms  Off-Line time
#define SBC_COTC_256MS       0×0200   // 256ms Off-Line time

// CPNC (CAN Partial Networking Control)
#define SBC_CPNC_OFF         0×0000   // CAN Partial Networking off
#define SBC_CPNC_ON          0×0400   // CAN Partial Networking on

// V2C (V2 Control)
#ifndef SBC_TYPE_UJA1066_N1A
#define SBC_V2C_OFF       0×0000   // V2 is off in Off-Line Mode
#define SBC_V2C_ON        0×0800   // V2 active in Off-Line Mode
#endif
#endif

/*****************************************************************************/
/* Definitions for Special Mode Register                                     */
/*****************************************************************************/

// ADDR (Address)
#define SBC_ADDR_SPE_REG     0×4000   // Special Mode Register access

/*—————————————————————————*/

// V1RTHC (V1 Reset Threshold Control)
#ifndef SBC_TYPE_UJA1066_N1A
#define SBC_V1RTHC_0_9    0×0000   // 0.9 x V1 under-volt. thresh.
#define SBC_V1RTHC_0_8    0×0008   // 0.8 x V1 under-volt. thresh.
#define SBC_V1RTHC_0_7    0×0010   // 0.7 x V1 under-volt. thresh.
#endif

// WDPRE (Watchdog Prescaler)
#define SBC_WDPRE_1          0×0000   // Scalefactor = 1
#define SBC_WDPRE_15         0×0020   // Scalefactor = 1.5
#define SBC_WDPRE_25         0×0040   // Scalefactor = 2.5
#define SBC_WDPRE_35      0×0060   // Scalefactor = 3.5

// ERREM (Error-pin Emulation Mode)
#ifdef SBC_TYPE_CAN_AVAILABLE
#define SBC_ERREM_OFF     0×0000   // EN-pin behaves with EN functionality
#define SBC_ERREM_ON      0×0100   // EN-pin signals CAN failures active LOW
#endif

// ISDM (Init Software Development Mode)
#define SBC_ISDM_OFF         0×0000   // Normal Watchdog & Interrupt
#define SBC_ISDM_ON          0×0200   // No WD Reset, no interrupt monitoring

/*****************************************************************************/
/* Definitions for General Purpose Register 0                                */
/*****************************************************************************/

// ADDR (Address)
#define SBC_ADDR_GP0_REG     0×8000   // General Purpose Register 0 access

// RRS (Read Register Select)
#define SBC_RRS_GP0_REG      0×2000   // read General Purpose 0 Feedback
// Register

/*****************************************************************************/
/* Definitions for General Purpose Register 1                                */
/*****************************************************************************/

// ADDR (Address)
#define SBC_ADDR_GP1_REG     0xC000   // General Purpose Register 1 access

// RRS (Read Register Select)
#define SBC_RRS_GP1_REG      0×2000   // read General Purpose 1 Feedback
// Register

/*****************************************************************************/
#endif                                // UJA106X_H

Incoming search terms:

  • uja1061 illegal mode register code