AD 公司提供基础no-OS 支持精密转换器的驱动程序嵌入式固件示例。no-OS基于设备配置、转换器数据采集、执行校准等,驱动程序负责no-OS 驱动程序的固件示例很容易将数据传输到主机进行显示、存储和进一步处理。
南皇电子专注于整合中国优质电子AD代理国内领先的现货资源,提供合理的行业价格、战略备货、快速交付控制AD芯片供应商,轻松满足您的需求AD芯片采购需求.(http://www.icbuyshop.com/)
1 no-OS介绍平台驱动程序
顾名思义,no-OS 通用(或无特定)操作系统采用驱动程序设计。这个名字也意味着这些驱动程序可以在没有任何可用的情况下使用OS 支持的裸机(BareMetal,也称裸金属主机) 系统上。no-OS 驱动程序旨在为精密转换器的数字接口访问提供高度API(Application Programming Interface,应用程序接口),。no-OS 使用这些设备的驱动程序API 接口访问、配置、读取存储器映射)及其内容的情况下,接口访问、配置、读取和写入数据。
no-OS 平台驱动程序层支持跨多个硬件/驱动程序 同样的软件平台复用no-OS 驱动程序, 可移植固件高度。使用平台驱动程序层no-OS 驱动程序被隔离,后者不需要知道平台的特定接口(如SPI(Serial Peripheral Interface,串行外设接口),I2C(Inter-Integrated Circuit,集成电路总线),GPIO低级细节(通用输入输出),因此no-OS 在多个平台上重用驱动程序,无需修改。
图2 no-OS驱动程序代码结构
图3 设备配置枚举、结构和API
精密转换器no-OS 驱动程序代码通常包含在两个以C 编程语言编写的源文件:adxxxx.c 和adxxxx.h,其中xxxx 代表设备名称(例如AD7606、AD7124等)。器件头文件(adxxxx.h) 这些公开访问接口可用于包含特定结构、枚举、寄存器地址和位置掩码的公共编程接口。器件源文件(adxxxx.c) 包含接口的实现,用于初始化和移除器件、读/ 编写器件寄存器,从器件读取数据,获取/ 设置设备特定参数等。
典型的no-OS围绕一组常见功能构建驱动程序。
1)具体寄存器地址、位置掩码宏、设备配置枚举、读/ 声明具体参数(如过采样、增益、基准电压等)的结构。
2)通过no-OS 驱动程序的设备初始化/ 符合初始化物理器件/ 初始化解除器件。
3)阅读使用器件寄存器/阅读 写函数访问器件存储器映射或寄存器详细信息,例如adxxxx_read_register() 或adxxxx_write_register()。
3 no-OS使用驱动程序代码
1)使用具体地址、位置掩码、参数配置枚举和结构
如前所述,adxxxx.h 头文件包含所有设备的特定枚举和结构声明,这些枚举和结构被传递到设备的特定函数或API 具体情况。
图3 中显示的adxxxx_config 该结构允许用户选择多路复用器通道并为其设置采样率。该结构的成员(afe_mux_channel 和oAD授权代理商versampling) 用户可以选择存在于同一文件中的数字常量,其中包含两个字段的所有可能值。
adxxxx.c 文件中定义的adxxxx_set_adc_config() 通过配置结构获构获得用户传递的配置/ 并进一步调用参数adxxxx_spi_reg_write() 通过数字接口函数(在上例中SPI)将数据写入ADXXXX_REG_CONFIG装置寄存器。
2)使用no-OS 驱动程序结构和初始化函数初始化器件
图4 声明设备初始化和驱动程序结构
除设备配置枚举和结构外,no-OS 驱动程序还提供以下两个结构:器件初始化结构和设备驱动程序结构。器件初始化结构允许用户在用户应用程序代码中定义器件特定的参数和配置。初始化结构包含其他器件特定的参数结构和枚举的成员。图5 显示了设备初始化结构的定义。
器件驱动程序结构通过器件初始函数adxxxx_init() 加载设备初始化参数。设备驱动程序结构在运行过程中(动态)从堆叠空间中分配内存。设备驱动程序结构和设备初始化结构中声明的参数几乎完全相同。设备驱动程序结构是设备初始化结构运行的版本。
说明典型的设备初始化函数和初始化过程。
第1 步骤:在应用程序中创建设备初始化结构的定义(或实例)(如struct adxxxx_init_params),在编译过程中义参数。
注:初始化结构中定义的参数因器件而异。
第2 步骤:在应用程序代码中创建设备驱动程序结构的指针实例(变量)。
用户应用程序需要创建设备驱动程序结构的单个指针实例。将此实例传递给所有no-OS 驱动程序API / 通过访问设备的特定参数,函数。通过应用程序代码中定义的指针实例指向堆中动态分配的内存no-OS 在驱动程序中定义的设备初始化函数(如adxxxx_init()完成。
第3 步骤:调用设备的初始化函数,以初始化设备和其他平台的特定外设。
no-OS 在驱动程序中定义adxxxx_init() 函数用adxxx_init_param用户特定参数初始化装置的结构传输。该初始化函数作为两个参数传递给装置驱动程序结构的指针实例和装置初始化结构的实例。用户可以多次调用程序代码adxxxx_init() 只需调用初始化函数,然后调用器件去除函数进行平衡。
3)通过器件寄存器读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读 函数访问存储器映射(寄存器内容)
用户可以通过no-OS 特定的驱动程序器件adxxx_read/write() 函数访问器件寄存器(如产品)ID、暂存区值、OSR 等),。
在大多数情况下,用户不会直接使用寄存器访问函数。通过这些寄存器访问函数(如adxxxx_spi_reg_read/write())来调用。如果可能,建议使用器件配置和状态API 访问器件存储器映射而不是直接存储器访问函数,因为它可以确保设备驱动程序结构与设备中的配置同步。
4 平台驱动程序
平台驱动程序是特定的包装平台API 硬件抽象层(HAL) 之一。它们由no-OS 调用器件驱动程序或用户应用程序代码,使后者能够独立于底层硬件和软件平台。平台驱动程序包装了平台特定的低级硬件功能,如SPI / I2C 初始化和读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/ 写、GPIO 初始化和读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/读/ 写、UART(Universal Asynchronous Receiver/Transmitter,通用异步收发传输器) 初始化和接收/ 发送、用户特定延迟、中断等。
图5 设备在用户应用程序中的初始结构定义
图7 SPI平台驱动程序代码结构
5 使用平台驱动程序
平台驱动程序代码通常包含C/C 在编程语言编写的三个源文件中。
1)spi.h:这是一个与平台无关的文件,包括SPI 本文件中定义的功能所需的设备结构和枚举。C 平台不依赖编程界面。
任何平台上的初始化和设备结构中声明的所有参数SPI接口是通用的。用于设备初始化结构void *extra 该参数允许用户传递额外的参数,这些参数可以在所使用的平台上特定。SPI 驱动程序结构和SPI 在初始化结构中声明的参数几乎完全相同。SPI 驱动程序结构是SPI 运行时版本的初始结构。
2)spi.cpp/.c:此文件包含spi.h 该函数用于初始化特定平台SPI 外设和阅读/ 写数据。广义的平台是指硬件微控制器(目标设备)和软件(如RTOS 或Mbed-OS)本文件依赖于平台,移植到其他平台时需要修改。
图9 详细说明了Mbed 平台的SPI 这些接口和设备的初始化/驱动程序结构始化/驱动程序结构SPI 和读/ 写数据。
图8 SPI驱动程序的结构
图9 SPI API或函数注:增加spi_init()和spi_write_and_read()代码是节略代码,为了明确起见而省略细节
图10 SPI额外的初始化和驱动程序结构
3)spi_extra.h:该文件包含在给定平台上的其他设备结构或枚举。它允许用户提供通用的应用程序代码spi.h 文件中未涉及的配置。SPI 引脚可能与平台不同,因此可以添加到这些平台的特定额外结构中。
6 移植平台驱动程序
平台驱动程序可以从一个平台(微控制器)移植到另一个平台;如果要移植,通常需要创建一个特定的平台.cpp/.c 和_extra.h 文件。平台驱动程序停留在微控制器单元供应商提供的特定硬件抽象层(HAL) 上层。
因此,为了将平台驱动程序从一个平台移植到另一个平台,并呼叫供应商HAL 中存在的函数或API 需要对平台驱动程序代码进行一些细微的更改。
图12 区分了基于Mbed 的SPI 平台驱动程序和ADuCM410 SPI平台驱动程序。ADno-OS 存储库和平台驱动程序GitHub 源代码链接可在AD 公司Wiki 和GitHub 在页面上找到。
图11 Mbed平台特定的SPI初始化实现
图12 平台驱动程序的差异
7 为no-OS贡献驱动程序
AD no-OS 驱动程序已经开源并托管GitHub 上面。驱动程序不仅支持精密转换器,还支持许多其他的转换器AD 产品,如加速度计、收发器、光电设备等。任何熟悉源代码的人都可以通过提交变更和创建提取请求来审查这些变更来贡献这些驱动程序。
有许多示例项目可用Linux 和/ 或Windows 在环境中运行。许多示例项目使用硬件描述性语言(HDL) 开发,以便在Xilinx、Intel 等待公司开发FPGA(FieldProgrammable Gate Array,由不同供应商开发的现场可编程门阵列和目标处理器。
(本文来源《AD/AD2022年3月,代理杂志
- 数据采集 - 数模转换器(DAC)
- 数据采集 - 数模转换器(DAC)
- 电源管理IC - 稳压器 - 特殊用途
- 线性器件 - 放大器 - 仪器、运算放大器、缓
- 数据采集 - 模数转换器(ADC)
- 电源管理IC - 热插拔控制器
- 数据采集 - 模数转换器(ADC)
- 线性器件 - 放大器 - 仪器、运算放大器、缓
- 射频开关
- 线性 - 放大器 - 特殊用途
- 评估板 - DC-DC 与 AC-DC(离线)SMPS
- 数据采集 - 数模转换器(DAC)