cc26xxspi.c文件:

#include "cc26xxspi.h"
#include "ti/sysbios/knl/Clock.h"
#include <ti/drivers/SPI.h>
#include <ti/drivers/spi/SPICC26XXDMA.h>
#include "sdi_task.h"
#include "icall.h"
#include <string.h>

static void spi_callback_fun(SPI_Handle handle,SPI_Transaction *transaction);

//配置GPIO模式
PIN_Config SPI_CSN[2] = 
{
  CC2640R2_LAUNCHXL_SPI0_CSN | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MIN,
  PIN_TERMINATE
};

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             = PIN_UNASSIGNED
    },
    {
        .baseAddr           = SSI1_BASE,
        .intNum             = INT_SSI1_COMB,
        .intPriority        = ~0,
        .swiPriority        = 0,
        .powerMngrId        = PowerCC26XX_PERIPH_SSI1,
        .defaultTxBufValue  = 0,
        .rxChannelBitMask   = 1<<UDMA_CHAN_SSI1_RX,
        .txChannelBitMask   = 1<<UDMA_CHAN_SSI1_TX,
        .mosiPin            = CC2640R2_LAUNCHXL_SPI1_MOSI,
        .misoPin            = CC2640R2_LAUNCHXL_SPI1_MISO,
        .clkPin             = CC2640R2_LAUNCHXL_SPI1_CLK,
        .csnPin             = CC2640R2_LAUNCHXL_SPI1_CSN
    }
};

const SPI_Config cc26xxSPI_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]
    },
};

//SPI 句柄及参数
static SPI_Handle cc2640_SPI_Handle;
static SPI_Params cc2640_SPI_Params;
static SPI_Transaction transaction;
//SPI 片选端口
PIN_State spi_csn_state;
PIN_Handle spi_csn_handle;

//SPI初始化函数
void cc2640xxSPI_Init(void)
{
  SPI_Params_init(&cc2640_SPI_Params);
  cc2640_SPI_Params.transferMode = SPI_MODE_BLOCKING; //配置SPI阻塞模式
  cc2640_SPI_Params.transferTimeout = SPI_WAIT_FOREVER; //永远等待
  cc2640_SPI_Params.transferCallbackFxn = NULL; //回调函数指针
  cc2640_SPI_Params.mode = SPI_MASTER; //主机模式
  cc2640_SPI_Params.bitRate = 2e6; //2MHZ
  cc2640_SPI_Params.dataSize = 8; //8bit模式
  cc2640_SPI_Params.frameFormat = SPI_POL0_PHA0; //时钟为低电平,第一个时钟沿采样
  
  spi_csn_handle = PIN_open(&spi_csn_state,SPI_CSN); 
  
  cc26xxSPI_config[CC2640R2_LAUNCHXL_SPI0].fxnTablePtr->initFxn((SPI_Handle)&cc26xxSPI_config[CC2640R2_LAUNCHXL_SPI0]);
  cc2640_SPI_Handle = cc26xxSPI_config[CC2640R2_LAUNCHXL_SPI0].fxnTablePtr->openFxn((SPI_Handle)&cc26xxSPI_config[CC2640R2_LAUNCHXL_SPI0],&cc2640_SPI_Params);

}

//SPI传输回调函数
static void spi_callback_fun(SPI_Handle handle,SPI_Transaction *transaction) 
{
    for(;;);
}

//设置SPI片选信号
void spi_csn_set(PIN_Id pin_x,bool pin_state) 
{
  if (pin_state == CC2640R2_SPI_CS_OFF)
  {
    PIN_setOutputValue(spi_csn_handle,pin_x,1);
  }
  else if (pin_state == CC2640R2_SPI_CS_ON)
  {
    PIN_setOutputValue(spi_csn_handle,pin_x,0);
  }
}

//SPI 写函数
void spi_read_write_data(uint8_t *write_data,uint8_t *read_data,uint8_t len)
{
  transaction.count = len;                     //写入的数据长度
  transaction.arg = NULL;
  transaction.txBuf = write_data;              //发送缓冲区
  transaction.rxBuf = read_data;               //接收缓冲区
  cc26xxSPI_config[CC2640R2_LAUNCHXL_SPI0].fxnTablePtr->transferFxn(cc2640_SPI_Handle,&transaction); //启动SPI传输
}

cc26xxspi.h文件:

#ifndef __CC26XXSPI_H
#define __CC26XXSPI_H 
#include "board.h"
#include "ti/sysbios/knl/Task.h"

extern PIN_State spi_csn_state;
extern PIN_Handle spi_csn_handle;
/* SPI */
#define CC2640R2_SPI_CS_ON           0
#define CC2640R2_SPI_CS_OFF          1

/*SPI CS*/
#define SPI_CS_HIGH                  spi_csn_set(IOID_11,CC2640R2_SPI_CS_OFF)
#define SPI_CS_LOW                   spi_csn_set(IOID_11,CC2640R2_SPI_CS_ON)

/* SPI Board */
#define CC2640R2_LAUNCHXL_SPI0_MISO             IOID_8          /* RF1.20 */
#define CC2640R2_LAUNCHXL_SPI0_MOSI             IOID_9          /* RF1.18 */
#define CC2640R2_LAUNCHXL_SPI0_CLK              IOID_10         /* RF1.16 */
#define CC2640R2_LAUNCHXL_SPI0_CSN              IOID_11          /* SPI CS */
#define CC2640R2_LAUNCHXL_SPI1_MISO             PIN_UNASSIGNED
#define CC2640R2_LAUNCHXL_SPI1_MOSI             PIN_UNASSIGNED
#define CC2640R2_LAUNCHXL_SPI1_CLK              PIN_UNASSIGNED
#define CC2640R2_LAUNCHXL_SPI1_CSN              PIN_UNASSIGNED

/*!
 *  @def    CC2640R2_LAUNCHXL_SPIName
 *  @brief  Enum of SPI names
 */
typedef enum CC2640R2_LAUNCHXL_SPIName {
    CC2640R2_LAUNCHXL_SPI0 = 0,
    CC2640R2_LAUNCHXL_SPI1,

CC2640R2_LAUNCHXL_SPICOUNT
} CC2640R2_LAUNCHXL_SPIName;

void cc2640xxSPI_Init(void);
void spi_csn_set(PIN_Id pin_x,bool pin_state);
void spi_read_write_data(uint8_t *write_data,uint8_t *read_data,uint8_t len);
#endif

主函数测试代码:

逻辑分析仪截图

NRF24L01写入写地址命令:

NRF24L01写入地址:

NRF24L01读取地址:

本次测试采用NRF24L01作为SPI从机设备,写入NRF24L01地址,再从地址寄存器读出地址进行校验,结果写入地址与读出地址一致SPI通信成功。

CC2640R2F SPI驱动代码相关推荐

  1. linux SPI驱动代码追踪

    一.Linux SPI 框架概述 linux系统下的spi驱动程序从逻辑上可以分为3个部分: SPI Core:SPI Core 是 Linux 内核用来维护和管理 spi 的核心部分,SPI Cor ...

  2. STM32的SPI驱动代码

    https://wenku.baidu.com/view/4758081b10a6f524ccbf85b0.html

  3. 转载:Linux kernel SPI驱动解释

    From: http://www.cnblogs.com/liugf05/archive/2012/12/03/2800457.html 下面有两个大的模块: 一个是SPI总线驱动的分析        ...

  4. S3C2440 SPI驱动框架

    S3C2440 SPI驱动代码详细解读: https://www.linuxidc.com/Linux/2012-08/68402p4.htm 一.platform device and board_ ...

  5. 关于精英版stm32从模板工程移植RTT Spi驱动打开后编译不过的处理办法

    移植成功后天健SPI驱动代码,出现编译不过,编译器提示 SPI_HandleTypeDef 类型未定义 解决办法是: 打开下图中文件中的宏定义即可

  6. FPGA实现的SPI协议(一)----SPI驱动

    写在前面 SPI协议系列文章: FPGA实现的SPI协议(一)----SPI驱动 FPGA实现的SPI协议(二)----基于SPI接口的FLASH芯片M25P16的使用 1.什么是SPI协议 SPI( ...

  7. Linux SPI驱动框架(2)——控制器驱动层

    SPI控制器驱动层   上节中,讲了SPI核心层的东西,这一部分,以全志平台SPI控制器驱动为例,对SPI控制器驱动进行说明. SPI控制器驱动,即SPI硬件控制器对应的驱动,核心部分需要实现硬件SP ...

  8. linux SPI驱动开发

    一,linux内核设备驱动分三类 1,字符设备驱动:按字节来访问设备,字符驱动负责驱动字符设备,这样的驱动通常实现open,close,read,write系统调用. 特点:操作的硬件,按照字节流形式 ...

  9. MTK SPI驱动开发

    MTK SPI驱动开发 1.由于SPI驱动 MTK封装的比较好,所以比较好处理. 唯一需要注意的是spi使用的全局Buffer必须要放在内存地址为"NONCACHEDZI"的区域直 ...

最新文章

  1. 计算机设备板块超跌,半导体全线拉升,沪指强势突破3600点,午后A股会再次冲高回落吗...
  2. 参数估计Bayesian方法的困惑点
  3. 李开复:天才将占领创业领域
  4. SAP HANA Express 版本的注册和安装
  5. unity 是厘米还是米_身高差45厘米! 这对重庆小情侣拍短视频晒幸福火了
  6. Spark(Hive)对字符串数值的排序
  7. DOTween 数字变化
  8. 【Git】git add
  9. 用html计算长方形的面积公式,【长方形正方形的面积计算公式】《长方形、正方形的面积计算》优秀教学反思...
  10. 壹度同城新零售系统v4.1.23 社交电商 同城商城
  11. 2022年,在NLP中还有没有比较新的研究方向?
  12. Cesium for Unreal 数据加载 场景漫游 粒子效果 视频监控 VR预览
  13. js设计模式--代理模式
  14. 在c语言中本征函数说明,西北工业大学 量子力学历年考题某年的吧
  15. 苹果Mac合上屏幕怎样才能不休眠?
  16. python爬取看雪论坛的所有主题帖的回复消息
  17. Java代码审计前置知识——Spring框架AOP和IoC
  18. ffmpeg 为取经而来_清华,那个穿越百年而来的白衣少年
  19. c语言编程交互式计算器,C语言程序设计交互式函数计算器设计报告.docx
  20. ROS基础教程-官网翻译版

热门文章

  1. Android Navigation 使用总结
  2. rk3588 rkaiq_3A_server 无法解析json文件记录
  3. Linux系统怎么安装鲁大师,windows电脑下怎么安装苹果系统?
  4. 编程改变世界_v20201007
  5. C++priority_queue模拟实现与仿函数讲解
  6. thinkpad E520 在XP下ACHI驱动安装
  7. 成都小哥在蔚一名车汇改装奔驰C200柏林之声分享
  8. 51单片机入门 第一篇:LED灯
  9. 迅雷亮相1024程序员节,区块链创新技术破解监管和隐私保护两难困境
  10. 找不到认证服务器 是否网卡选择错误,锐捷上网认证常见问题