CC2640R2F SPI驱动代码
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驱动代码相关推荐
- linux SPI驱动代码追踪
一.Linux SPI 框架概述 linux系统下的spi驱动程序从逻辑上可以分为3个部分: SPI Core:SPI Core 是 Linux 内核用来维护和管理 spi 的核心部分,SPI Cor ...
- STM32的SPI驱动代码
https://wenku.baidu.com/view/4758081b10a6f524ccbf85b0.html
- 转载:Linux kernel SPI驱动解释
From: http://www.cnblogs.com/liugf05/archive/2012/12/03/2800457.html 下面有两个大的模块: 一个是SPI总线驱动的分析 ...
- S3C2440 SPI驱动框架
S3C2440 SPI驱动代码详细解读: https://www.linuxidc.com/Linux/2012-08/68402p4.htm 一.platform device and board_ ...
- 关于精英版stm32从模板工程移植RTT Spi驱动打开后编译不过的处理办法
移植成功后天健SPI驱动代码,出现编译不过,编译器提示 SPI_HandleTypeDef 类型未定义 解决办法是: 打开下图中文件中的宏定义即可
- FPGA实现的SPI协议(一)----SPI驱动
写在前面 SPI协议系列文章: FPGA实现的SPI协议(一)----SPI驱动 FPGA实现的SPI协议(二)----基于SPI接口的FLASH芯片M25P16的使用 1.什么是SPI协议 SPI( ...
- Linux SPI驱动框架(2)——控制器驱动层
SPI控制器驱动层 上节中,讲了SPI核心层的东西,这一部分,以全志平台SPI控制器驱动为例,对SPI控制器驱动进行说明. SPI控制器驱动,即SPI硬件控制器对应的驱动,核心部分需要实现硬件SP ...
- linux SPI驱动开发
一,linux内核设备驱动分三类 1,字符设备驱动:按字节来访问设备,字符驱动负责驱动字符设备,这样的驱动通常实现open,close,read,write系统调用. 特点:操作的硬件,按照字节流形式 ...
- MTK SPI驱动开发
MTK SPI驱动开发 1.由于SPI驱动 MTK封装的比较好,所以比较好处理. 唯一需要注意的是spi使用的全局Buffer必须要放在内存地址为"NONCACHEDZI"的区域直 ...
最新文章
- 计算机设备板块超跌,半导体全线拉升,沪指强势突破3600点,午后A股会再次冲高回落吗...
- 参数估计Bayesian方法的困惑点
- 李开复:天才将占领创业领域
- SAP HANA Express 版本的注册和安装
- unity 是厘米还是米_身高差45厘米! 这对重庆小情侣拍短视频晒幸福火了
- Spark(Hive)对字符串数值的排序
- DOTween 数字变化
- 【Git】git add
- 用html计算长方形的面积公式,【长方形正方形的面积计算公式】《长方形、正方形的面积计算》优秀教学反思...
- 壹度同城新零售系统v4.1.23 社交电商 同城商城
- 2022年,在NLP中还有没有比较新的研究方向?
- Cesium for Unreal 数据加载 场景漫游 粒子效果 视频监控 VR预览
- js设计模式--代理模式
- 在c语言中本征函数说明,西北工业大学 量子力学历年考题某年的吧
- 苹果Mac合上屏幕怎样才能不休眠?
- python爬取看雪论坛的所有主题帖的回复消息
- Java代码审计前置知识——Spring框架AOP和IoC
- ffmpeg 为取经而来_清华,那个穿越百年而来的白衣少年
- c语言编程交互式计算器,C语言程序设计交互式函数计算器设计报告.docx
- ROS基础教程-官网翻译版
热门文章
- Android Navigation 使用总结
- rk3588 rkaiq_3A_server 无法解析json文件记录
- Linux系统怎么安装鲁大师,windows电脑下怎么安装苹果系统?
- 编程改变世界_v20201007
- C++priority_queue模拟实现与仿函数讲解
- thinkpad E520 在XP下ACHI驱动安装
- 成都小哥在蔚一名车汇改装奔驰C200柏林之声分享
- 51单片机入门 第一篇:LED灯
- 迅雷亮相1024程序员节,区块链创新技术破解监管和隐私保护两难困境
- 找不到认证服务器 是否网卡选择错误,锐捷上网认证常见问题