一个 SPI 转串口驱动的优化

2023-11-04

rel="File-List" href="file:///C:%5CDOCUME%7E1%5Czjujoe%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml">

一个 SPI 转串口驱动的优化

作者: zjujoe 转载请注明出处

Emailzjujoe@yahoo.com

BLOGhttp://blog.csdn.net/zjujoe

 

由于串口不够用,我们选用了 Exar 公司的 xr 20m 1172 SPI/I 2C 转串口芯片。考虑到速率问题(I 2c 较慢只有100k/400k两种模式),我们采用 SPI接口驱动该芯片。

 

花了两周的时间, 该芯片可以和 PC 通信了。最近应用组同事拿去连接一个加密芯片,发现不能正常工作。 该加密芯片提供的接口为 19200速率,8 位字节, 奇校验, 1位停止位,CTS/RTC 流控制。硬件同事仔细查看示波器,发现原来我们发出 0x94 时, 校验位时对时错。

 

考虑到我们的驱动程序确实也只是刚刚能够工作,应该有较大的优化空间, 决定对代码进行一定优化,以辅助问题解决。

 

首先写一个测试程序,该程序以 Cooked 模式, 8 位字节, 奇校验, 1位停止位, auto rts/cts 流控设置串口,然后写出一个字节 (0x55 或者 0x94)。然后恢复串口设置,最后退出。

优化1 提高 SPI 接口速率:

通过SPI 接口的时钟来提高 uart 寄存器速率。 Marvell 平台的 ssp 接口有一个分频器,系统有一个寄存器SSCR bit27控制分频器的输入是 26M 还是 13M 另外同一个寄存器里bit 8-bit19 控制分频数。 SPI输出频率为 ( 13M or 26M / SSCR[8-19] + 1

我们使用系统提供的 3.25M 时钟来计数,计算各种设置下 SPI 读写 uart 寄存器时间:

1)      缺省设置, SSCR[27] = 0, SSCR[8-19]= 0xf, 测量结果:

 

计数

time in uS

write

5a

27.69230769

read

52

25.23076923

2SSCR[27] = 0, SSCR[8-19]= 0x0, 测量结果:

 

计数

time in uS

write

19

7.692307692

read

14

6.153846154

3SSCR[27] = 1, SSCR[8-19]= 0x0, 测量结果:

 

计数

time in uS

write

17

7.076923077

read

12

5.538461538

性能大概提高了 4-5倍!

遗憾的是发现发送 0x94 正常,但是发送0x55 校验位时好时坏。

优化2 做寄存器 cache, 减少 SPI 读操作

Uart 寄存器的特殊之处在于它进行了地址复用:同一个地址对应了多个寄存器,到底是哪一个依赖于三个寄存器的内容:lcr, efr, mcr. 比如, lcr[7] == 1, lcr <> 0xbf 时, 地址 0x0 对应了 DLL 寄存器,在 lcr[7] == 1 时, 地址 0x0 对应了RHR/THR寄存器(读为 RHR, 写为 THR. 这样, 我们在进行读写寄存器时,需要频繁访问 lcr/efr/mcr, 对这三个寄存器进行缓冲可以减少 SPI接口访问, 提高读写效率。

优化前: 整个测试程序 SPI 读操作为: 103 次, 写操作为 240次。其中发送一个字符的 SPI 读操作为 15 次, 写操作为 26次。

优化后:整个测试程序 SPI 读操作为: 24 次, 写操作为 238次。其中发送一个字符的 SPI 读操作为 5 次, 写操作为 27次。

可见读操作大大减少了。写操作数基本不变。

遗憾的是问题依旧。

优化3 寄存器访问原子化

前面我们提过, 访问一个uart 寄存器可能需要先设置其它寄存器,这导致操作的原子性很难保证,另外,我们是通过 SPI 接口来读写 uart 寄存器的,这导致更加难以保证读写寄存器的原子性。 考虑到我们要在中断处理函数里访问 uart 寄存器,我们利用自旋锁来保证寄存器的原子性。

遗憾的是问题依旧。

优化4 进一步减少寄存器访问

跟踪系统寄存器访问发现, 我们目前不需要使用 IER:bit[4-7], ISR:bit[4/5], FCR :bit[4/5], MCR :bit[ 2/5/6 ], 对这些bit 访问需要更多的限制条件(EFR[4] == 1),事实上我们目前不需要。

所以我们修改这几个寄存器的访问限制, 从而节约寄存器访问。

优化后:整个测试程序 SPI 读操作为: 21 次, 写操作为 67次。其中发送一个字符的 SPI 读操作为 4 次, 写操作为 3次。

测试一下,发送 0x55 , 0x94 50次, 发现全部正确!

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一个 SPI 转串口驱动的优化 的相关文章

  • 常用电子元器件简介

    一 电阻器 电阻器 一般情况下也称电阻 是一种阻碍电流在电路中流动的线性元件 也是组成电子电路的主要元件之一 1 电阻器的作用及电路图形符号 1 电阻器的作用 电阻器主要用于控制电路中的电压和电流 除了具有降压 分压 限流和分流作用外 还具
  • HTTPRunner学习笔记

    HttpRunner 是一款面向 HTTP S 协议的通用测试框架 只需编写维护一份 YAML JSON 脚本 即可实现自动化测试 性能测试 线上监控 持续集成等多种测试需求 在yaml文件中组织测试用例 在命令行执行 参考 HTTPRun
  • 从零开始写一个Javascript解析器

    最近在研究 AST 之前有一篇文章 面试官 你了解过 Babel 吗 写过 Babel 插件吗 答 没有 卒 为什么要去了解它 因为懂得 AST 真的可以为所欲为 简单点说 使用 Javascript 运行Javascript代码 这篇文章
  • hdu2030 汉字统计

    hdu2030 汉字统计 Time Limit 2000 1000 MS Java Others Memory Limit 65536 32768 K Java Others Total Submission s 4080 Accepted
  • 软件测试 接口测试 入门Jmeter 接口关联 提取器 断言 与fiddler配合使用 使Jmeter录制和创建脚本 操作数据库 持续集成测试

    文章目录 1 接口测试概述 1 1 什么是接口测试 1 2 接口分类 1 3 接口的设计风格分类 1 3 1 Soap架构 1 3 2 Rpc架构 1 3 3 RestFul架构 1 3 4 接口测试工具介绍 1 4 接口测试流程 2 Jm
  • HTTP Status 500 - Request processing failed; nested exception is java.lang.IllegalArgumentException:...

    1 HTTP Status 500 Request processing failed nested exception is java lang IllegalArgumentException Control character in
  • 【app测试】adb常用指令及华为卸载预置软件

    adb基础指令 1 adb devices 显示当前运行的全部Android设备 2 adb s 设备编号 对某一设备执行命令 3 adb install APK路径 安装应用程序 r表示replace覆盖安装 连接了多台设备时 需要指定设
  • 高效程序员的40个好习惯和行为方式

    每一个好的习惯 开头都会相应有一个唱反调的句子哦 1 做事 出了问题 第一重要的是确定元凶 找到那个人 一旦证实了是他的错误 就可以保证这样的问题永远也不会再发生了 指责不会修复bug 把矛头对准问题的解决办法 而不是人 这是真正有用处的正
  • TLSv1.2抓包解密分析过程之ECDHE_RSA_WITH_AES_128_CBC_SHA256

    ECDHE RSA WITH AES 128 CBC SHA256模式下 RSA只用于身份验证 不用于加密 加密密钥是通过有限域的椭圆曲线算法交换的 需要拿到ECDH的私钥才能解密 本文的demo样本使用了特殊方法来获取这些参数 椭圆曲线加
  • 组合测试方法PK正交分析方法

    测试过程中 我们经常遇到需要覆盖多个变化参数的测试场景 如我们测试BS配置控制客户端组织资源远程配置一个设备时 进行一个设备通道视频参数设置的各种组合测试 如下图 多数情况下 类似于这种多组合测试时 老员工则是依靠经验去进行有针对性的测试
  • AngularJs单元测试

    这篇文章主要介绍了angularJS中的单元测试实例 本文主要介绍利用Karma和Jasmine来进行ng模块的单元测试 并用Istanbul 来生成代码覆盖率测试报告 需要的朋友们可以参考下 以下可全都是干货哦 当ng项目越来越大的时候
  • 软件测试题目

    一 判断题 每题2分 20 1 软件测试就是为了验证软件功能实现的是否正确 是否完成既定目标的活动 所以软件测试在软件工程的后期才开始具体的工作 初级 2 发现错误多的模块 残留在模块中的错误也多 初级 3 测试人员在测试过程中发现一处问题
  • 使用SpringSecurity

    前几天写了一个SpringBoot对拦截器的使用 在实际项目中 对一些情况需要做一些安全验证 比如在没有登录的情况下访问特定的页面应该解释的拦截处理 这一篇介绍使用SpringSecurity来做简单的安全控制 由于SpringSecuri
  • 如何在 Rust 中编写共享行为而不在每个模块中重复相同的代码?

    对于编写一个非常大的程序 我认为没有办法减轻为使用某种共享行为的每个结构编写相同代码的负担 例如 狗可能会 吠叫 struct Dog is barking bool impl Dog pub fn bark self self is ba
  • 测试:性能测试

    一 性能测试 性能测试是一种评估软件 系统或服务在特定条件下性能的过程 性能测试有助于确定系统的响应时间 吞吐量 可扩展性 稳定性和资源消耗等关键指标 一 响应时间 响应时间 Response Time 是性能测试中的一个重要指标 用于衡量
  • Android OnLongClickListener 奇怪/不可靠的行为

    我目前正在与 Android Api Lvl 8 上的 OnLongClickListener 进行斗争 采取这个代码 this webView setOnLongClickListener new OnLongClickListener
  • 具有 ViewModel 和行为的 Xamarin 视图

    我有一个视图 其中包含当前用户的用户配置文件 该视图包含一个视图模型 该模型具有与用户名或电子邮件地址等单个属性的双向绑定 该视图还有一个行为 它会验证输入并显示输入无效的错误 由于双向绑定 即使行为表明输入错误 视图模型也会更新值 我需要
  • Google Chrome 应用程序:Web 视图行为

    在研究一个问题时在 Chrome 扩展中
  • ASTM D6147测定压缩情况下硫化橡胶和热塑弹性体作用力衰减 (应力松弛) 的标准试验方法

    标准名称 ASTM D6147 Standard Test Method for Vulcanized Rubber and Thermoplastic Elastomer Determination of Force Decay Stre
  • Python 中的意外列表行为

    我想颠倒一个列表 我成功地做到了 但在工作的过程中我发现了一些奇怪的事情 以下程序按预期工作 但未注释行list reversed i list len list 1 i and 打印 列表 i 评论最后一行当然 导致了改变list 我没看

随机推荐

  • 彻底解决Qt报错:无法定位程序输入点于动态链接库

    一 问题描述 前段时间使用Qt Creator写程序 在最后打包的时候出错 期间尝试修改环境变量的顺序 后来发现不是环境变量的问题 但问题解决后并未将环境变量改回 导致今天使用VS2019联合Qt编译之前程序 之前已验证正确 的时候报错 具
  • alter table move跟shrink space的区别

    author skate time2010 05 28 alter table move跟shrink space的区别 今天主要从两点说他们的区别 1 碎片的整理 2 空间的收缩 SQL gt select from v version
  • 线性表的查找

    1 顺序查找 1 顺序查找介绍 顺序查找的查找过程为 从表的一端开始 依次将记录的关键字和给定的值进行比较 若某个记录的关键字和给定的值是一样的 则查找成功 反之 若扫描整个表之后 任然没有找到关键字和给定的值相等的记录 则查找失败 适用用
  • Java 读写锁 ReadWriteLock 原理与应用场景详解

    什么是读写锁 读写锁并不是JAVA所特有的读写锁 Readers Writer Lock 顾名思义是一把锁分为两部分 读锁和写锁 其中读锁允许多个线程同时获得 因为读操作本身是线程安全的 而写锁则是互斥锁 不允许多个线程同时获得写锁 并且写
  • 音视频 ffplay播放控制

    选项 说明 q ESC 退出播放 f 全屏切换 p SPC 暂停 m 静音切换 9 0 9减少音量 0增加音量 a 循环切换音频流 v 循环切换视频流 t 循环切换字幕流 c 循环切换节目 w 循环切换过滤器或显示模式 s 逐帧播放 lef
  • 第十九届“华为杯”研究生数学建模竞赛总结

    目录 一 前言 二 前提准备 2 1 寻找队友 2 2 赛前训练 2 3 赛前资料搜集 2 4 赛前分工 三 比赛时间规划 四 比赛过程 4 1 比赛选题 4 2 正赛开始 4 3 前期思路 4 4 难点 4 5 解决难点 4 6 规定时间
  • linux无桌面运行javafx图形界面程序

    第一步 安装mini版centos7 第二步 配置网卡IP和开机自启 可以用nmtui配置 伪图形界面 第三步 yum安装所有xorg服务和xterm服务 yum install xorg xterm y 第四步 解压jdk 8u291 l
  • Flask 学习记录

    python环境 1 安装 pyenv 用来切换各个python版本 pyenv的安装方式包括多种 重点推荐采用pyenv installer的方式 原因主要有两点 a 通过pyenv installer可一键安装pyenv全家桶 后续也可
  • [原创] 关于 “中国天气网 - www.weather.com.cn” 相关的 API 总结

    现在关于天气预报的手机应用是非常的多 包括那些非常著名的应用 我就不指名了 大家应该都用过 我就纳了闷了 一个预报天气的应用把天气好好的预报了就得了呗 非得加那么多没有用的功能 弄得应用本身越来越臃肿 而且速度越来越慢 你们到底要干什么吗
  • 最大正方形(前缀和)

    原题链接 题目描述 在一个 n m 的只包含 0 和 1 的矩阵里找出一个不包含 0 的最大正方形 输出边长 输入描述 输入文件第一行为两个整数 n m 1 lt n m lt 100 接下来 n 行 每行 m 个数字 用空格隔开 0 或
  • 2022年5月25 面试记录

    2022年5月25日 天气雨转晴 约的下午两点半面试11点出发的一点到的公司门口 他们在午休时间 我看前台右侧走廊有小沙发就索性坐在那等 一边记单例模式 是在一个园区 3栋五楼 同着的还有三家其他的企业 对门好像是做运输的 上午上了两节课
  • 多台电脑环境下Python统一相同的库及对应版本

    工作时很容易遇到这种情况 就是公司电脑和个人电脑Python中对应的库的版本甚至种类不同 这样就可能导致用个人电脑编写的代码在公司电脑上跑不了 或者别的什么原因需要统一版本库 可以通过以下方式解决 当然有别的方式 例如Docker 首先 在
  • CentOS 7 开放3306端口(实现MySQL远程登陆)

    一 开放3306端口 1 开启端口3306 firewall cmd zone public add port 3306 tcp permanent 2 重启防火墙 firewall cmd reload 3 查看已经开放的端口 firew
  • ajax的使用 json格式传参

    json格式被认为进行ajax前后端交互比较方便 这里就贴上前端js的相关代码 首先绑定一个按钮 被点击时触发ajax方法 sendEmail btn on click function ajax type post 请求类型为post 关
  • 微服务项目nginx前后台配置实例

    微服务项目nginx配置实例 1 准备好nginx服务我本地版本是nginx 1 18 0 zip 2 将前台代码放入nginx html目录下 3 将修改config nginx conf文件 user nobody worker pro
  • ubuntu问题g++ : 依赖: g++-4.8 (>= 4.8.2-5~) 但是它将不会被安装

    截图中选取了一个等同的例子 python dev 依赖 libpython dev 2 7 5 5ubuntu3 但是它将不会被安装 凡是遇到类似问题 括号里面会是一些版本号 这通常代表的意思是Ubuntu自生安装的软件包版本高 而所安装软
  • [非线性控制理论]4_反馈线性化_反步法

    非线性控制理论 1 Lyapunov直接方法 非线性控制理论 2 不变性原理 非线性控制理论 3 基础反馈稳定控制器设计 非线性控制理论 4 反馈线性化 反步法 非线性控制理论 5 自适应控制器 Adaptive controller 非线
  • C语言编译器

    C语言编译器是指用于将C语言源代码转换成可执行程序的工具软件 编译器将C语言源程序转化为目标代码的过程称为编译 目标代码通常是机器码 可由计算机直接执行 常见的C语言编译器有 GCC GNU Compiler Collection GNU编
  • 【C++入门】文件流(fstream)介绍和使用

    1 打开函数 open mode 含义 ios in 以读取方式打开文件 ios out 以写入方式打开文件 ios binary 以二进制方式存取 ios ate 存取指针在文件末尾 ios app 写入时采用追加方式 ios trunc
  • 一个 SPI 转串口驱动的优化

    rel File List href file C 5CDOCUME 7E1 5Czjujoe 5CLOCALS 7E1 5CTemp 5Cmsohtml1 5C01 5Cclip filelist xml gt 一个 SPI 转串口驱动的