OSS-ECAL(简称:ECAL)是指电子元件抽象化层的开源软件(Open Source Software for Electronic Components Abstraction Layer)的缩写。
背景
电子元件用程序由于电子元件的功能已预先确定规格,因此无需针对每种电子产品进行重新开发。此外,电子元件用软件属于电子产品中不具备竞争优势的非竞争领域,导致了不必要的开发成本。因此,嵌入式产品制造商对电子元件制造商提出提供电子元件用程序的需求日益增加。
1. 电子元件用程序的课题
1) 提供示例程序
电子元件制造商各社为销售促进目的投入大量成本、人力和时间开发样品程序。然而,嵌入式产品制造商虽可参考这些样品程序,但实际将其嵌入产品的案例并不多。

2) 非竞争领域的程序开发
电子元件制造商和嵌入式产品制造商各公司,在开发可共同使用的非竞争领域程序时,投入了大量成本、人力和时间。

3) 标准化进展缓慢的领域
电子元件用程序由于电子元件种类繁多,且与之配合的微控制器也种类繁多,因此标准化进程较为缓慢。此外,缺乏推动标准化的组织也是导致这一延迟的原因之一。

通过OSS-ECAL实现问题解决
OSS-ECAL可解决电子元件用程序所面临的以下问题。
解决方案
- 根据电子元件的种类,通过标准API促进标准化
- 考虑产品实施所需的可靠性和可维护性的设计
- 支持多种电子元件的组合配置
- 通过对HAL进行封装,实现对多种MCU的兼容性

编程语言:C。请注意,对于用于 Mbed 和 Arduino 的 OSS-ECAL,扩展名已改为 .cpp,以便与 C++ 匹配。
术语的定义
下表给出了本出版物中使用的术语和编码名称的定义。
用语 | 内涵 |
---|---|
ABC | 电子元件型号 暂定名称 |
API | 应用界面 |
c(前缀) | 常量常数标签名称的前缀 |
COMMAND | 指挥部暂定名 |
e(前缀) | 枚举型enum 成员名称前缀 |
et(前缀) | 枚举型enum 标签名称前缀 |
etCMP | OSS-ECAL 通用电子元件代码枚举类型(enum)定义 |
etSTS | OSS-ECAL 通用状态码枚举型(enum)定义 |
gv(前缀) | 全局变量的标签名称前缀 |
HAL | Hardware Abstraction Layer, 在 AUTOSAR 中,MCAL |
HALNAME | HAL 的暂定名称 关于 HALNAME,请参阅 HAL 支持 |
i(前缀) | immediate 常量标签名称的前缀 |
o(前缀) | 命令 API 功能名称前缀 |
OSS-ECAL | Open Source Software for Electronic Components Abstraction Layer |
st(前缀) | 结构体struct标签名称的前缀 |
sv(前缀) | 静态变量标签名称的前缀 |
tbl(前缀) | 表格常量的标签名称前缀 |
Component | 电子零件 |
SW-Component | 软件组件 |
API
1. API 基本结构
API 是按电子元件型号和命令分列的命令 API 功能,如下所示。
etSTS oABC_COMMAND( stABC_I, stABC_O* )
函数名 | oABC_COMMAND | ABC 命令的 API 函数名称 |
返回类型 | etSTS | OSS-ECAL 标准状态类型 |
参数 IN 的类型 | stABC_I | 参数的输入类型 |
参数 OUT的类型 | stABC_O* | 参数的输出类型 |
2. 命令 API 函数示例
以 Microchip Technology EEPROM 24xx256 系列的字节写入命令 API 功能为例。
etSTS o24xx256_BYTE_WRITE( etCMP cmp, uint16 mem_adr, uint8 val )
过程概述
o24xx256_BYTE_WRITE 函数是一个 API 函数,用于将 val 的值写入 24xx256 系列(24AA256、24LC256、24FC256)的指定地址 mem_adr。 函数返回返回值 eSTS_EXE,直到完成写入的时间(i24xx256_WRITE_TIME [ms])过去。
返回类型 | etSTS | OSS-ECAL状态码 eSTS_FIN eSTS_EXE eSTS_ERR_PARAMETER eSTS_ERR_I2C_OBJECT eSTS_ERR_OTHERS_RUN eSTS_ERR_HAL_OTHERS_RUN eSTS_ERR_HAL_I2C | 正常终止 执行期间 参数错误(超出内存地址范围) I2C对象选择错误 其他组件正在执行程序 其他应用程序正在运行 HAL HAL I2C错误 |
参数 IN 的类型 | etCMP cmp | 通用电子元件代码 | e24xx256 20007U |
uint16 mem_adr | 内存地址 | 范围0x0000 to 0x7fff | |
uint8 val | 要写入的数据 | 范围0x00 to 0xff |
备注
i24xx256_WRITE_TIME [ms] 已用测量值是通过调用此函数的Thread周期计算得出的,因此应将线程周期设置为 THREAD_OSS_ECAL_PERIOD [ms]。 使用此函数时,请使用 o24xx256_WP_DIS 函数在使用前解除写保护。
参考
24xx256 系列可使用以下其他命令 API 功能。
etSTS o24xx256_PAGE_WRITE( etCMP cmp, uint16 mem_adr, uint16 len, uint8* buf )
o24xx256_PAGE_WRITE 函数是一个 API 函数,用于从 24xx256 系列(24AA256、24LC256、24FC256)的指定地址 mem_adr 依次写入 buf[0] 至 buf[len-1] 的值。 函数返回返回值 eSTS_EXE,直到完成写入的时间(i24xx256_WRITE_TIME [ms])已过。
etSTS o24xx256_CURRENT_READ( etCMP cmp, uint8* rlt )
o24xx256_CURRENT_READ 函数是一个 API 函数,用于从 24xx256 系列(24AA256、24LC256、24FC256)的最后一个读或写地址 + 1 中读取 1 个字节的值并将其存储到 rlt 中。
etSTS o24xx256_RANDOM_READ( etCMP cmp, uint16 mem_adr, uint8* rlt )
o24xx256_RANDOM_READ 函数是一个 API 函数,用于从 24xx256 系列(24AA256、24LC256、24FC256)的指定地址 mem_adr 中读取一个字节的值并将其存储到 rlt 中。
etSTS o24xx256_SEQ_READ( etCMP cmp, uint16 mem_adr, uint16 len, uint8* buf )
o24xx256_SEQ_READ 函数是一个 API 函数,用于从 24xx256 系列(24AA256、24LC256、24FC256)的指定地址 mem_adr 依次读取 len 的数据,并将其从 buf[0] 保存到 buf[len-1]。
etSTS o24xx256_WP_EN( etCMP cmp )
o24xx256_WP_EN 函数是一个 API 函数,用于输出 24xx256 系列(24AA256、24LC256、24FC256)的写保护启用(写禁用)=“Hi”。
etSTS o24xx256_WP_DIS( etCMP cmp )
o24xx256_WP_DIS 函数是一个 API 函数,用于输出 24xx256 系列(24AA256、24LC256、24FC256)的写保护禁用(写使能)=“Low”。
HAL 支持
OSS-ECAL 的 HAL 支持如下(逐步扩展)。
请查看各电子元件的 OSS-ECAL 页面,了解 HAL 支持情况。 请注意,即使使用相同的 HAL,不同的版本、MCU 和开发环境也可能无法以相同的方式运行。
Manufacturer | SDK/IDE Tool | HAL Name | Ver | HALNAME | Support |
---|---|---|---|---|---|
Arduino | Arduino IDE | Arduino | 1.8.6 | ARDUINO | X |
Arm | Keil MDK v6 | Mbed OS | 6.17.0 | MBED | X |
Debian | – | GNU/Linux | 10.3 | Linux | – |
Infineon | ModusToolbox | mtb-hal-cat1 | 2.4.3 | ModusToolbox | X |
NXP | MCUXpresso SDK | SDK_2.x_EVKB-IMXRT1050 | 2.16 | iMXRT1051B1052B | X |
Renesas | Synergy Software Package | HAL | 2.6.0 | SSP | – |
STMicroelectronics | STM32Cube | STM32CubeF4 | V1.28.1 | STM32F4 | X |
1. 开发环境
开发过程中的 MCU 和开发环境如下。
HAL Name | Manufacturer | Board | MCU | IDE |
---|---|---|---|---|
ARDUINO | Arduino | 1.Mega 2560 Rev3 2.Arduino Pro Mini 3.3V | ATmega2560 ATmega328P | Arduino IDE 2.3.3 |
MBED | STMicroelectronics | STM32 Nucleo-64 boards | STM32F401RETx | Arm Keil Studio Cloud |
Linux | BeagleBoard | BeagleBone Black | TI AM335x | – |
ModusToolbox | Infineon | CY8CPROTO-063-BLE PSoC 6 BLE Prototyping Kit | CYBLE-416045-02 | ModusToolbox |
iMXRT1051B1052B | NXP | IMXRT1050-EVKB | i.MX RT1050 | MCUXpresso IDE |
SSP | Renesas | S7G2 SK | R7FS7G27H3A01CFC | e² studio for Renesas Synergy |
STM32F4 | STMicroelectronics | STM32 Nucleo-64 boards | STM32F401RETx | STM32CubeIDE |
文件配置
有关 OSS-ECAL 的文件结构,请参阅下面的示例。 文件结构因 HAL 而异,请查看各组件的 OSS-ECAL 页面。
例如:24xx256 文件夹结构
Folder | File | Summary |
---|---|---|
24xx256_IMXRT1050_010000/sample | sample.c | Sample application program |
sample.h | Sample application header | |
24xx256_IMXRT1050_010000 | o24xx256.c | OSS-ECAL program for 24xx256 |
o24xx256.h | OSS-ECAL header for 24xx256 | |
oss_ecal.h | OSS-ECAL common header | |
user_setting.c | User configured constants and tables | |
user_setting.h | User configuration Header | |
readme.md | Readme | |
OSS-ECAL Terms of Use.txt | OSS-ECAL Terms of Use |

内置方法
要在产品程序中加入命令 API 功能,请按照以下步骤操作。
- 获取 OSS-ECAL 文件
- 配置 MCU 和产品程序信息
- 为产品程序添加命令 API 功能
- 在产品程序开发环境中添加 OSS-ECAL 文件

1. 获取 OSS-ECAL 文件
请从英文版 OSS-ECAL 网站 (https://oss-ecal.com/) 的组件页面咨询下载事宜。 OSS-ECAL 文件(zip 格式)将作为电子邮件附件发送到您指定的电子邮件地址。
请解压缩发送的文件,并从要使用的 HAL 文件夹中删除样本文件夹。 请将样本文件夹中的文件用作参考代码,以便纳入您的应用程序。
2. 配置 MCU 和产品程序信息
本节以将一个 EEPROM 24xx256 系列连接到 MCU(NXP i.MX RT1050)为例,说明如何嵌入 OSS-ECAL。 将蓝色代码部分与 MCU 或产品程序匹配。
下面显示的 MCU 设置是在 NXP MCUXpresso SDK 中配置的标签名称和电路设置。

1) 设置命令 API 功能周期
设置 user_setting.h 中命令 API 函数的调用周期。
在本例中,周期为 50 毫秒。
<pre class="nohighlight">
// Immediate definitions
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#define THREAD_OSS_ECAL_PERIOD 50U // Thread period time[ms]
2) 设备地址设置
24xx256 系列的 A0、A1 和 A2 引脚电平应在 user_setting.h 中设置,如以下代码所示。
在本例中,A0 pin=Low(b0=0),A1 pin=Low(b1=0),A2 pin=Low(b2=0)。
// Device address Code bit2:A2, bit1:A1, bit0:A0
#define M24xx256 0b00000000
// I2C components address
#define I2C_ADR_24xx256 (( 0b00001010 << 3 ) | ( 0x07 & M24xx256 ))
3) 设置发送/接收缓冲区的数量
发送/接收缓冲区的数量应在 user_setting.h 中设置,如下所示。 24xx256 系列的发送/接收缓冲区最大为 64 字节。
在本例中,发送缓冲区的数量为 64 Byte,接收缓冲区的数量为 64 Byte。
// TX and RX buffer size(bytes) for 24xx256
// CAUTION : Set the minimum value among the following
// - Number of send/receive buffers used by the application
// - Number of send/receive buffers used by HAL
// - Number of 24xx256 send/receive Max 64 bytes
#define TX_N_24xx256 64U
#define RX_N_24xx256 64U
4) 用于写保护的 MCU 引脚设置
连接到 24xx256 系列写保护引脚的 MCU GPIO 引脚应在 user_setting.h 中设置,如以下代码所示。
在本例中,写保护引脚连接到 BOARD_INITPINS_M24xx256_WP_PORT 上的 BOARD_INITPINS_M24xx256_WP_PIN 上。
// OSS-ECAL GPIO hard wiring
#define CMP_GPIO_NUM 1U // OSS-ECAL GPIO components number
#define GPIO_24xx256_WP BOARD_INITPINS_M24xx256_WP_PORT
#define PIN_24xx256_WP BOARD_INITPINS_M24xx256_WP_PIN
5) I2C 通信设置
与 24xx256 系列通信的 I2C 应在 user_setting.h 中设置,如以下代码所示。
在本例中,连接了 I2C 通信 LPI2C1_PERIPHERAL,波特率设置为 400 kHz。
此外,假定有一个组件使用 OSS-ECAL 进行 I2C 通信。
// OSS-ECAL I2C components hard wiring
#define CMP_I2C_NUM 1U
#define I2C_HZ 400000 // MCU I2C frequency
#define I2C_24xx256 LPI2C1_PERIPHERAL // LPI2C peripheral base address
6) 设置 I2C 通信重试次数
I2C 通信重试次数应在 user_setting.h 中设置,如以下代码所示。
在本例中,I2C 通信错误被设置为重试三次。
// I2C settings
#define I2C_RETRY 3U // Retry times
7) 设备地址和 I2C 的表格设置
如下代码所示,在 user_setting.c 中将设备地址设置为 2),将 I2C 设置为 5)。
// HAL I2C object table for components
const stI2C_MCUX_OBJ tblI2C[ CMP_I2C_NUM ] =
{
{ e24xx256, I2C_ADR_24xx256, I2C_24xx256 }
};
8) 用于写保护的 MCU 引脚表设置
在 user_setting.c 中设置写保护的 GPIO,设置值为 4),如以下代码所示。
// HAL GPIO object table for components
const stGPIO_MCUX_OBJ tblGPIO[ CMP_GPIO_NUM ] =
{
{ e24xx256, GPIO_24xx256_WP, PIN_24xx256_WP }
};
3. 为产品程序添加命令 API 功能
请参阅 sample.c,将命令 API 函数添加到产品程序中。
4. 在产品程序开发环境中添加 OSS-ECAL 文件
请将 OSS-ECAL 文件添加到您的产品程序开发环境中。
5. 其他纳入方式
如何在用户程序中整合多个 OSS-ECAL(相同的 MCU 功能)
如何在用户程序中整合多个 OSS-ECAL(不同 MCU 功能)
注意事项
请按照 OSS-ECAL 使用条款使用 OSS-ECAL。 此外,电子产品的验证由产品制造商负责。