为什么需要四线串行访问23LC1024?

在“单片机片外RAM,串行的”中减少了对Microchip公司的SPI接口RAM芯片:23LC1024的读写测试。但是在STC8G1K08但潘辰的SPI接口驱动下,访问对其进行一次字节的读写操作,大概需要消耗20微妙的的时间,这使得在高速、高精度采集应用中跟不上数据的采集。

为了提高对其的访问速度,可以采用以下的方式:

  • 使用其四线串行模式(SQI)的方式进行访问;
  • 尽量使用序列读写方式,而不是每次完成完整的命令+地址+数据的腹泻方式

下面为了配合AD7606八通道AD采集模块测试中数据的采集,首先测试23LC1024在STC8G1K08操作下访问速度

本文实验中的工程文件可以在下面资源中下载:

  1. 23LC1024串行四线访问工程

实验电路设计

AD工程文件目录:

AD\Test\2020\TestAD7606STC\TestAD7606STC8G.SchDoc

1. 原理图

电路板设计中采用了STC8G1K08 TSOP20封装的芯片。核心板上集成了23LC1024串行接口的RAM,对于AD7606的接口是通过ADI10芯接口连接。

▲ 原理图

2. PCB

设计电路PCB版图,适宜使用单面PCB板制作实验电路。

▲ 快速制版后的实验电路板

3. 硬件调试

软件开发所在的目录:

C51\STC\Test\2020\testAD76068G1K\TestAD76068G.uvproj

置STC8G1K08的硬件选项配置如下:

▲ 单片机硬件选项配置

主要性能测试

1. 测试单个字节读写的时间

测试标准写入函数在执行过程中,LC1024的CS的波形:

LC1024ByteWrite(0, 0, 0xff, 0xf)

写入时间为2us,CS的波形如下图所示:

▲ CS波形,时间为2.03us

读出的时间也是2.0us,

LC1024ByteRead(0x0, 0x0, 0xff)

下面是在读的时候,CLK, SO1的波形。

▲ CLK,SD1的波形

2. 连续字节读写

使用连续字节读写的方式读取多组字节。下面是读取连续10个字节。所需要的时间为8.57us。

LC1024ReadBegin(0x0, 0x0, 0x0);
LC1024WriteByte(0x0);
LC1024WriteByte(0x0);
LC1024WriteByte(0x0);
LC1024WriteByte(0x0);
LC1024WriteByte(0x0);
LC1024WriteByte(0x0);
LC1024WriteByte(0x0);
LC1024WriteByte(0x0);
LC1024WriteByte(0x0);
LC1024WriteByte(0x0);
LC1024ReadWriteEnd();

▲ 连续读取十个字节所需要的时间

如果仅仅执行读取起始和结束的语句:

LC1024ReadBegin(0x0, 0x0, 0x0);
LC1024ReadWriteEnd();            

所小号的时间为2us。这说明读取单个字节的时间大约为(8.57−2)/10=0.65μs\left( {8.57 - 2} \right)/10 = 0.65\mu s(8.57−2)/10=0.65μs左右。

这个速度与博文“扩展32KRAM的STC8H8K信号采集版”中,通过并口扩展RAM的一次读写时间0.532us的速度基本相当了。

通过这个时间可以说明,使用SQI(串行四线制)在连续读写的情况下可以达到与并口扩展RAM相当的速度。

即使是单个读写所消耗的2us的时间,也比在博文“单片机片外RAM,串行的”中读取单个字节所消耗19.2us将近快了10倍左右。

▲ 通电进行调试

▲ 测量读写信号波形

函数程序模块

相关LC1024读取的程序模块如下。

其中致的说明的是,在LC1024的初始化函数中,调用了LC1024Reset命令,就保证了LC1024成功进入SQI模式。

  1. LC1024访问函数头文件:
/*
**==============================================================================
** LC1024L4.H:            -- by Dr. ZhuoQing, 2020-05-04
**
**  Description:
**
**==============================================================================
*/
#ifndef __LC1024L4__
#define __LC1024L4__
//------------------------------------------------------------------------------
#ifdef LC1024L4_GLOBALS#define LC1024L4_EXT
#else#define LC1024L4_EXT extern
#endif // LC1024L4_GLOBALS
//------------------------------------------------------------------------------
//==============================================================================
#define LC1024_CS           1, 5
#define LC1024_CLK          1, 4
#define LC1024_SO0          1, 0
#define LC1024_SO1          1, 1
#define LC1024_SO2          1, 2
#define LC1024_SO3          1, 3#define LC1024_CLK_PULSE    ON(LC1024_CLK),_nop_(),OFF(LC1024_CLK)
#define LC1024_SO_OUT       (P1M1 &= 0xf0, P1M0|=0xf)
#define LC1024_SO_IN        (P1M1 |= 0xf,  P1M0 &= 0xf0)//------------------------------------------------------------------------------void LC1024L4Init(void);//------------------------------------------------------------------------------
#define LC1024_READ         0x03            // Read data from memory areray beginning at selected address
#define LC1024_WRITE        0x02            // Write data to memory array beginning at selected address
#define LC1024_EDIO         0x3B            // Enter Dual I/O access(Enter SDI bus mode)
#define LC1024_EQIO         0x38            // Enter Quad I/O access
#define LC1024_RSTIO        0xFF            // Reset Dual and Quad I/O access
#define LC1024_RDMR         0x05            // Read Mode register
#define LC1024_WRMR         0x1             // Write Mode register#define LONG_3(w)           ((unsigned char)(w >> 24))
#define LONG_2(w)           ((unsigned char)(w >> 16))
#define LONG_1(w)           ((unsigned char)(w >> 8))
#define LONG_0(w)           ((unsigned char)w)//------------------------------------------------------------------------------
void LC1024Reset(void);
void LC1024EQIEnter(void);
void LC1024EQIExit(void);//------------------------------------------------------------------------------
unsigned char LC1024ByteRead(unsigned char ucAdd2, unsigned char ucAdd1, unsigned char ucAdd0);
void LC1024ByteWrite(unsigned char ucAdd2, unsigned char ucAdd1, unsigned char ucAdd0, unsigned char ucByte);//------------------------------------------------------------------------------
void LC1024ReadBegin(unsigned char ucAdd2, unsigned char ucAdd1, unsigned char ucAdd0);
void LC1024WriteBegin(unsigned char ucAdd2, unsigned char ucAdd1, unsigned char ucAdd0);
unsigned char LC1024ReadByte(void);
void LC1024WriteByte(unsigned char ucByte);
void LC1024ReadWriteEnd(void);//------------------------------------------------------------------------------
unsigned char LC1024ReadMode(void);
void LC1024WriteMode(unsigned char ucMode);//==============================================================================
//             END OF THE FILE : LC1024L4.H
//------------------------------------------------------------------------------
#endif // __LC1024L4__
  1. LC1024的C语言程序。
/*
**==============================================================================
** LC1024L4.C:             -- by Dr. ZhuoQing, 2020-05-04
**
**==============================================================================
*///------------------------------------------------------------------------------
#define LC1024L4_GLOBALS        1              // Define the global variables
#include "LC1024L4.H"
#include "C51BASIC.H"
#include "STC8G.H"
#include "INTRINS.H"//------------------------------------------------------------------------------void LC1024L4Init(void) {PM_PP(LC1024_CS);PM_PP(LC1024_CLK);ON(LC1024_CS);OFF(LC1024_CLK);LC1024_SO_IN;LC1024Reset();LC1024EQIEnter();
}//------------------------------------------------------------------------------
void LC1024EQIEnter(void) {unsigned char i, ucMask, ucByte;ucByte = LC1024_EQIO;ucMask = 0x80;LC1024_SO_IN;PM_PP(LC1024_SO0);OFF(LC1024_CS);for(i = 0; i < 8; i ++) {if(ucByte & ucMask) ON(LC1024_SO0);else OFF(LC1024_SO0);ucMask >>= 1;LC1024_CLK_PULSE;}LC1024_SO_IN;ON(LC1024_CS);}void LC1024EQIExit(void) {LC1024_SO_OUT;P1 |= 0xf;OFF(LC1024_CS);LC1024_CLK_PULSE;LC1024_CLK_PULSE;LC1024_SO_IN;ON(LC1024_CS);}//------------------------------------------------------------------------------
unsigned char LC1024ByteRead(unsigned char ucAdd2, unsigned char ucAdd1, unsigned char ucAdd0) {unsigned char ucRet;LC1024_SO_OUT;OFF(LC1024_CS);P1 &= 0xf0;LC1024_CLK_PULSE;P1 |= 0x3;LC1024_CLK_PULSE;P1 &= 0xf0;P1 |= (ucAdd2 >> 4);LC1024_CLK_PULSE;P1 &= 0xf0;P1 |= (ucAdd2 & 0xf);LC1024_CLK_PULSE;P1 &= 0xf0;P1 |= (ucAdd1 >> 4);LC1024_CLK_PULSE;P1 &= 0xf0;P1 |= (ucAdd1 & 0xf);LC1024_CLK_PULSE;P1 &= 0xf0;P1 |= (ucAdd0 >> 4);LC1024_CLK_PULSE;P1 &= 0xf0;P1 |= (ucAdd0 & 0xf);LC1024_CLK_PULSE;LC1024_SO_IN;LC1024_CLK_PULSE;                       // Dummy byteLC1024_CLK_PULSE;    ON(LC1024_CLK);ucRet = (P1 << 4);OFF(LC1024_CLK);ON(LC1024_CLK);ucRet |= (P1 & 0xf);OFF(LC1024_CLK);ON(LC1024_CS);return ucRet;}//------------------------------------------------------------------------------
void LC1024ByteWrite(unsigned char ucAdd2, unsigned char ucAdd1, unsigned char ucAdd0, unsigned char ucByte) {LC1024_SO_OUT;OFF(LC1024_CS);P1 &= 0xf0;LC1024_CLK_PULSE;P1 |= 0x2;LC1024_CLK_PULSE;P1 &= 0xf0;P1 |= (ucAdd2 >> 4);LC1024_CLK_PULSE;P1 &= 0xf0;P1 |= (ucAdd2 & 0xf);LC1024_CLK_PULSE;P1 &= 0xf0;P1 |= (ucAdd1 >> 4);LC1024_CLK_PULSE;P1 &= 0xf0;P1 |= (ucAdd1 & 0xf);LC1024_CLK_PULSE;P1 &= 0xf0;P1 |= (ucAdd0 >> 4);LC1024_CLK_PULSE;P1 &= 0xf0;P1 |= (ucAdd0 & 0xf);LC1024_CLK_PULSE;P1 &= 0xf0;P1 |= (ucByte >> 4);LC1024_CLK_PULSE;P1 &= 0xf0;P1 |= (ucByte & 0xf);LC1024_CLK_PULSE;LC1024_SO_IN;ON(LC1024_CS);
}//------------------------------------------------------------------------------
unsigned char LC1024ReadMode(void) {unsigned char ucRet;OFF(LC1024_CS);LC1024_SO_OUT;    P1 &= 0xf0;LC1024_CLK_PULSE;P1 |= 0x5;LC1024_CLK_PULSE;LC1024_SO_IN;ON(LC1024_CLK);ucRet = (P1 << 4);OFF(LC1024_CLK);ON(LC1024_CLK);ucRet |= (P1 & 0xf);OFF(LC1024_CLK);ON(LC1024_CS);return ucRet;}//------------------------------------------------------------------------------
void LC1024ReadBegin(unsigned char ucAdd2, unsigned char ucAdd1, unsigned char ucAdd0) {LC1024_SO_OUT;OFF(LC1024_CS);P1 &= 0xf0;LC1024_CLK_PULSE;P1 |= 0x3;LC1024_CLK_PULSE;P1 &= 0xf0;P1 |= (ucAdd2 >> 4);LC1024_CLK_PULSE;P1 &= 0xf0;P1 |= (ucAdd2 & 0xf);LC1024_CLK_PULSE;P1 &= 0xf0;P1 |= (ucAdd1 >> 4);LC1024_CLK_PULSE;P1 &= 0xf0;P1 |= (ucAdd1 & 0xf);LC1024_CLK_PULSE;P1 &= 0xf0;P1 |= (ucAdd0 >> 4);LC1024_CLK_PULSE;P1 &= 0xf0;P1 |= (ucAdd0 & 0xf);LC1024_CLK_PULSE;LC1024_SO_IN;LC1024_CLK_PULSE;                       // Dummy byteLC1024_CLK_PULSE;    }//------------------------------------------------------------------------------
void LC1024WriteBegin(unsigned char ucAdd2, unsigned char ucAdd1, unsigned char ucAdd0) {LC1024_SO_OUT;OFF(LC1024_CS);P1 &= 0xf0;LC1024_CLK_PULSE;P1 |= 0x2;LC1024_CLK_PULSE;P1 &= 0xf0;P1 |= (ucAdd2 >> 4);LC1024_CLK_PULSE;P1 &= 0xf0;P1 |= (ucAdd2 & 0xf);LC1024_CLK_PULSE;P1 &= 0xf0;P1 |= (ucAdd1 >> 4);LC1024_CLK_PULSE;P1 &= 0xf0;P1 |= (ucAdd1 & 0xf);LC1024_CLK_PULSE;P1 &= 0xf0;P1 |= (ucAdd0 >> 4);LC1024_CLK_PULSE;P1 &= 0xf0;P1 |= (ucAdd0 & 0xf);LC1024_CLK_PULSE;}unsigned char LC1024ReadByte(void) {unsigned char ucRet;ON(LC1024_CLK);ucRet = (P1 << 4);OFF(LC1024_CLK);ON(LC1024_CLK);ucRet |= (P1 & 0xf);OFF(LC1024_CLK);return ucRet;
}void LC1024WriteByte(unsigned char ucByte) {P1 &= 0xf0;P1 |= (ucByte >> 4);LC1024_CLK_PULSE;P1 &= 0xf0;P1 |= (ucByte & 0xf);LC1024_CLK_PULSE;}//------------------------------------------------------------------------------
void LC1024ReadWriteEnd(void) {LC1024_SO_IN;ON(LC1024_CS);
}//------------------------------------------------------------------------------
void LC1024WriteMode(unsigned char ucMode) {LC1024_SO_OUT;OFF(LC1024_CS);P1 &= 0xf0;LC1024_CLK_PULSE;P1 |= 0x5;LC1024_CLK_PULSE;P1 &= 0xf0;P1 |= (ucMode >> 4);LC1024_CLK_PULSE;P1 &= 0xf0;P1 |= (ucMode & 0xf);LC1024_CLK_PULSE;ON(LC1024_CS);LC1024_SO_IN;
}//------------------------------------------------------------------------------
void LC1024Reset(void) {LC1024_SO_OUT;P1 |= 0xf;OFF(LC1024_CS);LC1024_CLK_PULSE;LC1024_CLK_PULSE;LC1024_CLK_PULSE;LC1024_CLK_PULSE;LC1024_CLK_PULSE;LC1024_CLK_PULSE;LC1024_CLK_PULSE;LC1024_CLK_PULSE;ON(LC1024_CS);LC1024_SO_IN;}//==============================================================================
//                END OF THE FILE : LC1024L4.C
//------------------------------------------------------------------------------

23LC1024四线访问数据相关推荐

  1. Oracle 优化器_访问数据的方法_单表

    Oracle 在选择执行计划的时候,优化器要决定用什么方法去访问存储在数据文件中的数据.我们从数据文件中查询到相关记录,有两种方法可以实现:1.直接访问表记录所在位置.2.访问索引,拿到索引中对应的r ...

  2. Iterator:访问数据集合的统一接口

    导语 遍历器Iterator是ES6为访问数据集合提供的统一接口.任何内部部署了遍历器接口的数据集合,对于用户来说,都可以使用相同方式获取到相应的数据结构.如果使用的是最新版Chrome浏览器,那么你 ...

  3. SpringBoot中使用Thymeleaf常用功能(一):表达式访问数据

    环境搭建: 创建一个Maven项目,按照Maven项目的规范,在src/main/下新建一个名为resources的文件夹,并在下面新建static和templates文件夹. ①  修改pom.xm ...

  4. 访问数据段时的特权级检查,修改SS时的特权级检查——《x86汇编语言:从实模式到保护模式》读书笔记30

    1. 访问数据段时的特权级检查 为了访问数据段,数据段的选择子必须被加载进段寄存器(ES,ES,FS,GS,SS).在把一个段选择子加载进段寄存器之前,处理器会进行特权级检查(如下图所示). 在数值上 ...

  5. boost::python模块实现使用原始指针访问数据的示例

    boost::python模块实现使用原始指针访问数据的示例 实现功能 C++实现代码 实现功能 boost::python模块实现使用原始指针访问数据的示例 C++实现代码 #include < ...

  6. Visual Basic.NET中访问数据的方法(zz)

    http://info.shangdu.com/new/2003-5-8/200358113624.htm        Visual Basic.NET是微软对Visual Basic语言进行的升级 ...

  7. 在 SharePoint 2010 中访问数据

    数据访问的关键方法有哪些? | 使用查询类 | 使用 SPQuery | 使用 SPSiteDataQuery | 使用 LINQ to SharePoint | LINQ to SharePoint ...

  8. 水晶易表 跨域不能访问数据的解决方案

    上次做店铺销售对比水晶易表的时候碰到一个问题,一直没有解决. 今天刚好一个朋友也碰到了这个问题,看了要捣腾一番,最终找到了一个解决方案,方案如下. 当前情况:店铺销售对比报表(flash文件),目前放 ...

  9. 本地主机作服务器解决AJAX跨域请求访问数据的方法

    本地主机作服务器解决AJAX跨域请求访问数据的方法 参考文章: (1)本地主机作服务器解决AJAX跨域请求访问数据的方法 (2)https://www.cnblogs.com/QiScript/p/5 ...

最新文章

  1. python生成50个随机数_Python:如何生成12位随机数?
  2. k8s helm 私服chartmuseum minio s3 存储配置
  3. 初学jQuery之jQuery虚假购物车-------与真实数据无关
  4. Web安全实战训练营
  5. PPT快速制作精美3D柱状图
  6. 《大数据》第2期“应用”——医疗健康大数据:应用实例与系统分析
  7. oracle自动创建分区存储过程,oracle 存储过程创建表分区
  8. sql server序列_在SQL Server中实现序列聚类
  9. MySQL5.7安装教程(windows .zip)
  10. Python socket粘包解决
  11. 怎样获得正确的LINUX用户的文档音乐视频等目录?
  12. SolidWorks to URDF转换及常见机器人模型
  13. heap exploitation巩固——堆中的off-by-one
  14. Qt5之图形视图框架(一)
  15. Lua 程序设计——Lua 教程01
  16. 在matlab中syms是什么,syms在matlab中的作用是什么
  17. Oracle 10.2.0.5 + OFS 3.4.2 双节点集群
  18. 如何使用Qt调试飞机大战
  19. 3.28 将文字转换为路径并进行艺术再加工 [原创Ps教程]
  20. 2020 年互联网大厂薪资出炉!老夫酸了.......

热门文章

  1. CI框架表单提交数据接收乱码
  2. 安装Oralce时,系统参数详解
  3. Windows Server 2012 R2 WSUS-13:部署二级WSUS
  4. JAVA WEB 乱码问题解决方案
  5. SQL中CONVERT转化函数的用法
  6. 模糊测试(fuzz testing)介绍(一)
  7. php csv文件的读取,写入,输出下载操作详解
  8. 几个重要的 ASM Disk Groups 参数
  9. ASIFormDataRequest实现post的代码示例
  10. rust做嵌入式开发_Rust 嵌入式开发 STM32 amp; RISC-V