1.低功耗问题
使用结束后,必须将spi反初始化,设置为输入悬空,不然会有大概500uA的漏电。
2.SPI读取的问题
在实际使用中,SPI总线可能不止挂载一个SPI器件,所以要控制不同的SPI的CS引脚,这就需要对SDK的源码进行修改,以下是SDK的源码;

/*** @brief      This function serves to read a bulk of data from the SPI slave*             device specified by the CS pin* @param[in]  Cmd - pointer to the command bytes needed written into the*             slave device first before the reading operation of actual data* @param[in]  CmdLen - length in byte of the command bytes* @param[out] Data - pointer to the buffer that will cache the reading out data* @param[in]  DataLen - length in byte of the data need to read* @param[in]  CSPin - the CS pin specifing the slave device* @return     none*/
void spi_read(unsigned char *Cmd, int CmdLen, unsigned char *Data, int DataLen, GPIO_PinTypeDef CSPin)
{int i = 0;unsigned char temp = 0;gpio_write(CSPin,0); //CS level is lowreg_spi_ctrl &= ~FLD_SPI_DATA_OUT_DIS; 0x09- bit2 enables spi data output/***write cmd***/for (i = 0; i < CmdLen; i++) {reg_spi_data = Cmd[i];while(reg_spi_ctrl& FLD_SPI_BUSY );//wait writing finished}reg_spi_ctrl |=FLD_SPI_DATA_OUT_DIS;/***when the read_bit was set 1,you can read 0x800008 to take eight clock cycle***/reg_spi_ctrl |= FLD_SPI_RD; //enable read,0x09-bit3 : 0 for read ,1 for writetemp = reg_spi_data;  //first byte isn't useful data,only take 8 clock cyclewhile(reg_spi_ctrl &FLD_SPI_BUSY ); //wait reading finished/***read data***/for (i = 0; i < DataLen; i++) {Data[i] = reg_spi_data; //take 8 clock cycleswhile(reg_spi_ctrl & FLD_SPI_BUSY ); //wait reading finished}//pull up CSgpio_write(CSPin,1);//CS level is high
}

如果使用在SPI FLASH上,我们需要一次读取大量的数据,分为多次读取数据,每次256个字节,中间为了传输效率更快,就不在拉高拉低CS引脚,这时就会发现数据错误,问题出现在这句代码: temp = reg_spi_data; ,在SDK上有解释说,在设置SPI标志位,需要8个时钟周期导致第一个数据无效,但是我们使用场景中一直处于读状态中,这里就会丢失一个数据。
解决办法:在接口上增加一个标志,是否为第一次读写。
以下就是修改完的代码,去掉CS的引脚的控制和增加是否第一次读写的标志物。

在void spi_read_no_cs(const unsigned char ReadFlag,const unsigned char *Cmd, int CmdLen, unsigned char *Data, int DataLen)
{int i = 0;unsigned char temp = 0;reg_spi_ctrl &= ~FLD_SPI_DATA_OUT_DIS; 0x09- bit2 enables spi data output/***write cmd***/for (i = 0; i < CmdLen; i++) {reg_spi_data = Cmd[i];while(reg_spi_ctrl& FLD_SPI_BUSY );//wait writing finished}reg_spi_ctrl |=FLD_SPI_DATA_OUT_DIS;/***when the read_bit was set 1,you can read 0x800008 to take eight clock cycle***/reg_spi_ctrl |= FLD_SPI_RD; //enable read,0x09-bit3 : 0 for read ,1 for writeif(ReadFlag == 0){temp = reg_spi_data; //first byte isn't useful data,only take 8 clock cyclewhile(reg_spi_ctrl &FLD_SPI_BUSY ); //wait reading finished}/***read data***/for (i = 0; i < DataLen; i++) {Data[i] = reg_spi_data; //take 8 clock cycleswhile(reg_spi_ctrl & FLD_SPI_BUSY ); //wait reading finished}//pull up CS
}

泰凌微8258 SPI使用遇到的坑相关推荐

  1. 泰凌微8258入门教程——导读

    基于泰凌微TLSR8258 Bluetooth® SIG Mesh 的入门系列教程 本专栏第一阶段的博文撰写在2021年9月份全部完成,主要包括 环境篇,开发套件购买+开发环境搭建+开发内容介绍 Me ...

  2. 泰凌微8258入门教程 基础篇⑬——群组(订阅)增删流程

    文章目录 一.演示 二.源码分析 三.流程图梳理 3.1 添加群组(订阅) 3.2 删除群组(订阅) 四.增删群组日志 4.1 添加群组(Living Room) 4.2 添加群组(Kitchen) ...

  3. 泰凌微8258入门指导1-环境搭建

    泰凌微8258入门指导1-环境搭建 第一步:准备工作 (1)下载对应SDK包 (2)安装jdk环境 (2)安装esclipe编译器 (3)对SDK进行补丁 (4)烧录环境 第一步:准备工作 (1)下载 ...

  4. 泰凌微8258入门指导2-串口打印

    泰凌微8258入门指导2-串口打印 第一步:准备工作 (1)支持浮点型 (2)下载printf文件代码 (3)配置uart 第一步:准备工作 (1)支持浮点型 编译出现以下问题; 原因是泰凌微硬件本身 ...

  5. 泰凌微8258入门教程 进阶篇④——恢复出厂配置

    文章目录 一.演示 二.日志 三.上电序列检测(SDK) 四.上电序列检测(简化) 五.不足与改进 一.演示 泰凌微8258--恢复出厂配置 二.日志 [2021-04-05 21:14:26.756 ...

  6. 泰凌微8258入门教程 BLE篇②——BLE Single Connection 蓝牙BLE 软件架构

    文章目录 一.前言 二.标准BLE软件架构 三.标准BLE数据流 四.Telink BLE 软件架构 一.前言 教程目录大纲请查阅:泰凌微8258入门教程--导读 开发环境搭建请查阅:泰凌微8258入 ...

  7. 泰凌微8258入门教程 BLE篇⑤——BLE Single Connection 通用访问协议 Generic Access Profile (GAP)

    文章目录 一.前言 二.GAP 简介 三.GAP Event 事件定义 四.源码修改 4.1 vendor/b85m_ble_remote/app_config.h 4.2 vendor/b85m_b ...

  8. 泰凌微8258入门教程 进阶篇③——LIGHT HSL+CT 彩色灯+色温灯调光

    文章目录 一.前言 二.刷新Light函数 light_dim_refresh() 三.Light硬件引脚 light_res_hw 一.前言 HSL彩色灯调光和CT色温灯调光 ,前面两篇博文都有讲述 ...

  9. 泰凌微8258入门教程 BLE篇③——BLE Single Connection 调试日志Log串口打印

    文章目录 一.前言 二.SDK版本和工程项目 三.源码修改 3.1 application/print/putchar.c 3.2 application/print/u_printf.h 3.3 v ...

最新文章

  1. arraylist从大到小排序_初学Python最简易入门之十四排序算法10对字典排序
  2. linux 网卡丢弃多播包,rp_filter及Linux下多网卡接收多播的问题
  3. 集成学习-Boosting集成学习算法LightGBM
  4. TensorFlow 教程——电影评论文本分类
  5. Go的runtime.GOMAXPROCS
  6. China .NET Conf 2019-.NET技术架构下的混沌工程实践
  7. centos 宝塔面板 mongodb 给新的数据库 创建登录用户和密码
  8. Flask开发天气查询软件,带你掌握pipenv的使用与手机Termux下的部署
  9. linux收集完整技术支持信息的命令有,Linux下常用的日志收集命令(RedhatSuSe)
  10. 点击率预估与冷启动(二)
  11. 【一天一个C++小知识】005. C++中的句柄类(智能指针)
  12. Linux设置bypass网卡,Linux pwn入门教程(7)——PIE与bypass思路
  13. html代码中数学公式,html中使用mathjax数学公式
  14. 利用电脑学象棋的一点想法
  15. 【Web UI自动化测试】Web UI自动化测试之PO篇(全网最全)
  16. x86_64汇编之三:x86_64汇编和x86_32汇编的区别
  17. 【报错记录】TypeError: __init__() takes 1 positional argument but 4 were given
  18. BeijingSubway
  19. 【vue-cli】使用es6的可选链?.操作符报错Module parse failed解决记录
  20. 黑马程序员--C语言基础之--变量、内部函数与外部函数

热门文章

  1. STC单片机的硬件仿真心得,可以解决99%不能仿真的问题
  2. 问题 G: Heartlessly 的魔法石
  3. php uniqid 高并发,PHP uniqid 高并发生成不重复唯一ID
  4. 服务器日志显示英文,在闪亮的服务器上显示R控制台日志
  5. Vue2实现仿小米商城练手项目前端篇(2-首页实现)
  6. 【unity】ps动画转为单帧图片
  7. 性能深度分析之SystemTrace
  8. 计算机专业海报排版设计,【平面设计必看干货:海报设计排版构图篇】- 环球网校...
  9. Laravel学习笔记4,文件上传,分页,验证码,数据表和迁移
  10. 数字游戏(区间dp)