CC2640R2F BLE5.0 CC2640R2F SPI驱动实现

CC2640R2F BLE5.0 CC2640R2F软件架构 软件架构 开发模型 下图展示CC2640R2F支持的两种开发模型,本文讲解都集中在图一,也就是整个ble协议栈和应用都工作在一个CC2640R2F的单SOC解决方案。 单一设备:Controller、Host、Profile、应用程序都在CC2640R2F上实现,作为真正意义的单芯片解决方案。这种模型是使用CC2640R2F时最简单和最常见的。TI的大部分示例项目都使 阅读详情
公司主页 文档归类 淘宝

SPI驱动

这一节我们详细讲解TI CC13x0/CC26x0 SDK开发平台 基于TI-RTOS的SPI驱动实现,主要了解SPI驱动的分层实现、驱动接口,以及结合开发板板载SPIFlash调试通过驱动。

概述

SPI(Serial Perripheral Interface),串行外设接口,是Motorala公司推出的一种同步串行接口技术,它能够使MCU以全双工(数据能够同时进行双向传输)的同步串行方式与各种外围设备进行高速数据通信。它主要用在EEPROM、Flash、实时时钟(RTC)、数模转换器(ADC)、数字信号处理器(DSP)以及数字信号解码器之间,他只占用芯片的4根管脚来实现控制和数据传输,现在很多芯片上都集成了SPI技术。SPI有时也称为SSI(同步串行接口)。SPI的控制方式采用主-从模式(Master-Slave)。
SPI驱动程序能够驱动芯片与外围设备在SPI总线上进行数据的传输和接收。SPI驱动程序接口是典型的RTOS应用程序调用接口,它们被重定向到SPI_FxnTalble中的指针指定的特定驱动程序实现,增强了程序的移植性。

SPI驱动的分层实现

虽然我们在应用层直接调用几个驱动接口就可以在SPI总线上发送数据,但是在驱动程序内部从接口函数到底层硬件操作是通过了多层封装的。如图1所示是SPI驱动程序的分层实现图:

图1 SPI驱动程序的分层实现
由图1我们可以看到,应用程序开发者只需要直接调用中间件层的驱动接口(例如:SPI_init,SPI_open等等)就可以实现SPI的驱动功能,这里的中间件层就是我们程序中的SPI.c和SPI.h所在层。这一层规范统一了应用程序的调用接口,也就是说对于TI不同类型的芯片平台它们在这一层给出的接口都是一样的。应用层都是调用相同的接口来实现SPI功能,这样做的好处在于增强了程序的可移植性,不管你的平台怎么换,我的应用程序都是不变的,因为驱动的接口相同。

中间件层往下就是业务逻辑层,从业务逻辑层开始往下根据不同的芯片平台其接口封装实现就不尽相同了。这里我们以CC26XX芯片平台为例,业务逻辑层就位于SPICC26XXDMA.c和SPICC26XXDMA.h所在的层。这里采用DMA的数据传输方式,所以这一层主要在操控DMA以进行数据传输以及调用驱动库中的一些函数实现相应功能。需要注意的是这一层封装的驱动接口函数被全部放在一个函数指针结构体中,如List1所示,中间件层不直接调用这些驱动接口,而是通过一个配置文件(CC2640R2_LAUNCHXL.c)将装有驱动接口指针的结构体指针注册到SPI_config中,如List2所示,这样中间件层通过调用SPI_config中的结构体指针就可以指定使用业务逻辑层的驱动接口了。
List1:业务逻辑层驱动接口指针结构体

const SPI_FxnTable SPICC26XXDMA_fxnTable = {
    SPICC26XXDMA_close,
    SPICC26XXDMA_control,
    SPICC26XXDMA_init,
    SPICC26XXDMA_open,
    SPICC26XXDMA_transfer,
    SPICC26XXDMA_transferCancel
    };

List2:SPI_config中的驱动接口结构体指针注册

const SPI_Config SPI_config[CC2640R2_LAUNCHXL_SPICOUNT] = {
    {
         .fxnTablePtr = &SPICC26XXDMA_fxnTable,
         .object      = &spiCC26XXDMAObjects[CC2640R2_LAUNCHXL_SPI0],
         .hwAttrs     = &spiCC26XXDMAHWAttrs[CC2640R2_LAUNCHXL_SPI0]
    },
    {
         .fxnTablePtr = &SPICC26XXDMA_fxnTable,
         .object      = &spiCC26XXDMAObjects[CC2640R2_LAUNCHXL_SPI1],
         .hwAttrs     = &spiCC26XXDMAHWAttrs[CC2640R2_LAUNCHXL_SPI1]
    },
};

业务逻辑层再往下就是驱动库层(driver library),业务逻辑层会直接调用这一层的接口函数来来进行相应逻辑操作的。驱动库层位于ssi.c和ssi.h所在的层,这一层就开始与硬件接触,进行相应寄存器操作来实现SPI驱动了。

SPI的驱动配置

在上文中我们已经提到SPI的配置数组SPI_config[],它位于相应芯片平台的配置文件中,这里我们以CC26XX芯片平台为例,其配置文件为CC2640R2_LAUNCHXL.c。如List3所示,是CC2640R2_LAUNCHXL.c中关于SPI的配置代码段。
List3:UART的配置代码段

/*
 *  =============================== SPI DMA ===============================
 */
#include <ti/drivers/SPI.h>
#include <ti/drivers/spi/SPICC26XXDMA.h>

SPICC26XXDMA_Object spiCC26XXDMAObjects[CC2640R2_LAUNCHXL_SPICOUNT];

const SPICC26XXDMA_HWAttrsV1 spiCC26XXDMAHWAttrs[CC2640R2_LAUNCHXL_SPICOUNT] = {
    {
        .baseAddr           = SSI0_BASE,
        .intNum             = INT_SSI0_COMB,
        .intPriority        = ~0,
        .swiPriority        = 0,
        .powerMngrId        = PowerCC26XX_PERIPH_SSI0,
        .defaultTxBufValue  = 0,
        .rxChannelBitMask   = 1<<UDMA_CHAN_SSI0_RX,
        .txChannelBitMask   = 1<<UDMA_CHAN_SSI0_TX,
        .mosiPin            = CC2640R2_LAUNCHXL_SPI0_MOSI,
        .misoPin            = CC2640R2_LAUNCHXL_SPI0_MISO,
        .clkPin             = CC2640R2_LAUNCHXL_SPI0_CLK,
        .csnPin             = CC2640R2_LAUNCHXL_SPI0_CSN
    },
};

const SPI_Config SPI_config[CC2640R2_LAUNCHXL_SPICOUNT] = {
    {
         .fxnTablePtr = &SPICC26XXDMA_fxnTable,
         .object      = &spiCC26XXDMAObjects[CC2640R2_LAUNCHXL_SPI0],
         .hwAttrs     = &spiCC26XXDMAHWAttrs[CC2640R2_LAUNCHXL_SPI0]
    },
};

const uint_least8_t SPI_count = CC2640R2_LAUNCHXL_SPICOUNT;

我们可以看到SPI_config[]数组中的元素有三个参数,分别是.fxnTablePtr,.object,.hwAttrs,下面我们分别来看一下这三个参数的意义。

  • .fxnTablePtr
    .fxnTablePtr里面放的就是我们驱动具体的实现函数,这些驱动函数就是来自业务逻辑层。我们看到这里它被赋值成SPICC26XXDMA_fxnTable的指针,这个结构体就是List1中所示的业务逻辑层的驱动函数列表,在这里进行赋值配置之后,中间层的接口函数就可以链接使用它们了。
  • .object
    .object是用来存放SPI的各种参数数据的,例如控制参数,传输参数等。
  • .hwAttrs
    .hwAttrs是用来存放SPI硬件配置参数的数组,如List3所示,这些硬件参数是需要我们在使用SPI之前需要配置好的。

SPI驱动接口

在SPI的中间件文件SPI.c和SPI.h中,我们看到一共给出了7个接口函数,下面我们分别看一下每个接口函数的功能,形参,返回值以及注意事项。

  1. void SPI_init(void)
CC2640R2F BLE5.0 CC2640R2F硬件架构 硬件架构 概述 TI低功耗蓝牙软件开发套件(ble-stack SDK)是开发单模低功耗蓝牙应用的完整软件平台。该SDK基于完整的片上系统(SoC)低功耗蓝牙解决方案SimpleLink CC2640R2F。CC2640R2F结合了2.4GHz RF收发器,128KB系统可编程存储器,20KB SRAM以及丰富的外设。它有一个ARM® Cortex®-M3 系列的处理器用来处理应用程序和蓝 阅读详情

相关推荐

CC2640R2F BLE5.0 CC2640R2F 传感器控制器(Sensor Controller)

Sensor Controller 不熟悉CC13x0/CC26x0 的硬件架构的对SC可能会比较难理解,如下图所示的硬件框架图,Sensor Contrller 是独立系统CPU 的一个控制器,主要负责一些外设控制、ADC采样、SPI通信等。在系统CPU休眠的时候,SC能够独立工作,这样的设计极大降低了系统CPU唤醒频率,从而减少功耗。 SC作为独立的、功耗优化的16位控制器,拥有独立的

leconiot的博客 3165

从CC2640R2F迁移到CC2640R2L:硬件设计、射频调试与认证实战指南

在物联网设备开发中,无线微控制器(MCU)的硬件迁移是常见的工程挑战,涉及核心芯片更换、外围电路调整与系统性能优化。其原理在于,即便引脚兼容,不同芯片版本在外设集成、功耗及射频性能上可能存在关键差异,直接影响产品的稳定性与合规性。掌握硬件迁移技术,对于降低BOM成本、确保产品迭代的平滑性具有重要价值,尤其适用于消费电子、智能家居及工业传感等对功耗和无线连接可靠性要求严苛的场景。本文聚焦TI SimpleLink平台CC2640R2F至CC2640R2L的迁移实战,深入解析**传感器控制器引擎(SCE)移除*

weixin_34101229的博客 356

深入解析TI CC2640R2F三核架构与低功耗蓝牙5.1开发实战

在物联网设备开发中,低功耗蓝牙(BLE)技术是实现设备间高效、节能无线通信的核心。其工作原理基于一种主从式、事件驱动的协议,通过在特定频段进行短距离、间歇性的数据交换,以极低的功耗维持连接。这项技术的核心价值在于,它能够在提供可靠无线连接的同时,将设备的平均功耗降至微安甚至纳安级别,这对于依赖电池长期工作的传感器、可穿戴设备至关重要。其典型应用场景包括智能家居、健康医疗、资产追踪等。本文以德州仪器的CC2640R2F无线MCU为例,深入剖析其实现超低功耗的秘诀——独特的“三核”架构。该架构通过Arm Cor

weixin_33919950的博客 309

基于STM32、HAL库的CC2640R2FRGZR无线收发器驱动程序设计

if (HAL_UART_Receive(&huart2, &rx_data[idx], 1, 5) == HAL_OK) { // 每次接收1字节,短时等待。// 释放RST(拉高)HAL_GPIO_WritePin(CC2640_RST_PORT, CC2640_RST_PIN, GPIO_PIN_RESET);// 检查是否收到结束符(通常是\r\n),这里简单检查\n。

corlin6688的博客 285

CC2640R2F+ADS1299实现1kHz八通道EEG实时BLE传输

EEG信号采集是生物医学传感的核心环节,涉及高精度ADC驱动、低延迟数据搬运与资源受限嵌入式系统上的无线传输。其原理依赖于医疗级模拟前端(如ADS1299)的寄存器级配置、UDMA零拷贝机制保障采样连续性,以及BLE GATT服务对实时波形流的语义化建模。技术价值在于突破MCU资源瓶颈,在Cortex-M3平台实现24位/8通道/1kHz原始EEG稳定上传,兼顾信噪比、功耗与协议兼容性。典型应用于便携式脑电监测、神经反馈设备及BME教学原型开发。本文聚焦CC2640R2F与ADS1299协同优化,覆盖驱动配

weixin_28278377的博客 199

51单片机驱动SX1262(LLCC68)LoRa驱动

包含了STC8H1K08和有人射频模块WH-LR36-L的原理图,射频模块及射频芯片相关文档,驱动源代码(可直接编译使用),其中SX1262_send()和SX1262_Receive分别是发送、接收函数。

DSSAT模型实战:从基础配置到气候情景模拟

本文详细介绍了DSSAT模型在农业模拟中的应用,从基础配置到气候情景模拟的全流程实战指南。通过土壤-植物-大气连续体的动态关系建模,DSSAT能精准预测作物产量,误差率低至8%。文章涵盖气象数据处理、土壤参数配置、管理措施调控等核心技巧,并提供了Python脚本和可视化方法,助力农业科研与决策。

weixin_29264201的博客 1010

[LVGL]:MACOS下使用LVGL模拟器

[LVGL]:MACOS下使用LVGL模拟器

LINKKEEE的博客 2456

华为防火墙USG6600全流量日志配置指南:从流量监控到NAT日志的完整方案

本文详细介绍了华为USG6600防火墙全流量日志配置方案,涵盖流量监控、NAT日志及安全事件溯源等核心功能。通过精细化配置和性能优化技巧,帮助企业构建高效、合规的日志体系,提升网络安全运维效率。文章特别强调了日志采样与字段过滤的实用方法,适用于高流量环境下的资源优化。

gin88的博客 347

【软件使用】Calibre部分提参的实战技巧与常见问题解析

本文详细解析了Calibre部分提参(Partial PEX)的实战技巧,重点介绍了如何利用HCELL与XCELL文件高效排除已知模块,实现精准的寄生参数提取,从而快速定位后仿真中的时序与信号完整性问题。文章涵盖了从图形界面到命令行的完整操作流程,并提供了常见问题(如时钟失真、模块“消失”)的深度Debug指南与最佳实践,助力芯片设计工程师提升验证效率。

yhn456789的博客 1026

MFC使用Websocket通讯介绍和实例(附完整源码)

踩坑点,下载了好几个boost版本编译,经常出问题,后来搜索了好久资料才发现如下评论:WebSocket++0.8.2 has been tested through Boost 1.72。WebSocketpp依赖于boost,因此在使用WebSocketpp前需要编译Boost;所以我们直接下载Boost 1.72的windows版的进行安装,安装完成还需要编译;WebSocketpp也叫WebSocket++;服务编译好之后,使用。

weixin_42530684的博客 1170

基于AMD AU15P FPGA的SLVS-EC桥PCIe设计方案分享

各位FPGAer周末愉快,今天熊猫君分享一个基于AMD AU15P FPGA的SLVS-EC桥PCIe设计方案。

haoxingheng的专栏 1445

STM32 IIC电量计LTC2944

LTC2944是一款电池电量计,设计用于端电压为3.6V至60V的多节电池。它测量电池充电和放电、电池电压、电流和自身温度。精密模拟库仑计数器通过电池正极端子与负载或充电器之间的检测电阻器对电流进行积分。电池电压、电池电流和硅温度由内部ADC测量。

baidu_34971492的博客 3160

淘宝母婴用品数据挖掘及可视化分析研究

1. 背景介绍 在当今的电子商务时代,母婴用品市场已经成为了各大电商平台的一片蓝海。淘宝作为中国最大的电子商务平台,其上的母婴用品交易数据自然引人关注。理解这些数据,可以帮助商家更好地制定营销策略,也可以帮助消费者更好地选择产品。因此,本文将对淘宝母婴用品的数据进行深入的挖掘和分析。 1.1 电子商务的

AI天才研究院 1253

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: CC2640R2F BLE5.0 编译第一个工程(simple_peripheral)
下一篇: CC2640R2F BLE5.0 CC2640R2F增加一个具有通知属性的characteristic
leconiot
博客等级 码龄9年 252粉丝 52原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值