单片机交流
直播中

笑过就走

10年用户 991经验值
擅长:可编程逻辑 电源/新能源 MEMS/传感技术
私信 关注
[问答]

如何对基于23LC1024的SPI模式读写性能进行测试

如何对基于23LC1024的串口RAM扩展方式进行测试?

如何对基于23LC1024的SPI模式读写性能进行测试?

回帖(1)

李四民

2021-10-22 14:22:29
  在博文“为什么单片机通常只有那么小的数据内存?”讨论在单片机内部集成大规模RAM的问题。但在有的时候还是需要有大容量的RAM作为数据缓存。比如在博文“扩展32KRAM的STC8H8K信号采集版”介绍了通过并行接口扩展单片机片外内存的方法。在STC8H8K单片机运行在40MHz总线的情况下,完成片外RAM的读写仅仅需要0.5微妙。这在很多情况下可以满足单片机数据访问的要求了。
  但是通过单片机的并口扩展外部RAM,一个最大的缺点就是造成了单片机引脚的大量浪费,增加了电子线路布板空间的浪费。因此使用高速同步串行接口(Serial Peripheral Interface)开展外部RAM可以有效解决这个问题
  本文下面通过具体实验来测试基于Microcchip公司的23LC1024(128MByte)的串口RAM的扩展方式,为今后构建数据采集单片机系统做好准备。
  设计方案
  实验AD工程:
  D:zhuoqingAltiumDesignerTest2020Test23ALC1024Test23LC1024.SchDoc *
  1. 实验电路的原理图
  
  ▲ 实验电路的原理图
  2. PCB
  
  ▲ PCB 设计版图
  3. 底层软件设计
  (1)单片机ISP硬件配置:
  单片机的工作主要频率:
  
  ▲ 单片机的硬件配置
  (2)SPI设置:
  SPI基本信号,下图显示CS,CLK的信号。
  
  ▲ SPI中的基本信号,CS,CLK
  SPI 的CLK的频率设置为:
  SPISendChar():消耗时间:1.6us
  SPISendReceChar(): 1.6us
  特性测试
  1. MODE REGISTER
  (1)上电后读取Mode Register 缺省值:
  上电后读取LC1024:
  LC1024ReadMode: 0x40;
  
  ▲ MODE寄存器的定义
  (2)对Mode Register 读写:
  void SerialDebugProcessBuffer(void) {
  unsigned char ucChar;
  SerialDebugBuffer2Argument();
  if(g_ucSDANumber == 0) return;
  if(strcmp(“hello”, (char *)STD_ARG[0]) == 0)
  printf(“%s is ready !rn”, VERSION_STRING);
  else IFARG0(“mr”) {
  ucChar = LC1024ReadMode();
  printf(“LC1024 Mode:%bxrn”, ucChar);
  } else IFARG0(“mw”) {
  sscanf(SDA(1), “%bx”, &ucChar);
  LC1024WriteMode(ucChar);
  printf(“Mode:%bxrn”, LC1024ReadMode());
  }
  else printf(“Error command : %s !rn”, STD_ARG[0]);
  }
  2. 测试对内部RAM读写
  (1) 基本读写:
  通过写入和读出验证,可以验证整个0x1ffff可以被测试正确存储。
  (2)读写时间测试:
  循环写入0x8000字节,需要时间为:0.671s
  循环读出0x8000字节,需要时间为 : 0.671s
  nBegin = GetClickMS();
  for(i = 0; i 《 nSize; i ++) {
  LC1024ByteRead(lnAddress + i);
  }
  nEnd = GetClickMS();
  printf(“Time:%drn”, nEnd - nBegin);
  (3)测试读写单个字节的时间:
  通过测试CS波形,可以测到对于LC1024单个字节的读写时间为:19.6us。
  读写函数为: LC1024ByreRead(), LC1024ByteWrite()。
  
  ▲ LC1024读写单个字节时间(CS)
  测量:LC1024ByteReadDim, LC1024ByteWriteDim,读写两个字节所需要的时间为:23.2us。
  测量LC1024 CLK的波形,可以观察其中的主要延长来自于对于地址的操作。在LC1024ByteWrite()函数中存在对于长整地址的移位操作。所以前面的时序特别长了。
  
  ▲ 写操作中的CLK脉冲
  将LC1024相关函数的地址进行改造,直接将24bit的三个字节的地址通过参数输入。
  unsigned char LC1024ByteRead(unsigned long lnAddress);
  void LC1024ByteWrite(unsigned long lnAddress, unsigned char ucByte);
  void LC1024ByteReadDim(unsigned long lnAddress, unsigned char * pucDim, unsigned int nSize);
  void LC1024ByteWriteDim(unsigned long lnAddress, unsigned char *pucByte, unsigned int nSize);
  改造后的读写速度波形为:
  
  ▲ 读写LC1024的CS和CLK波形
  此时,读写一个字节所需要的时间为7.86us。
  直接对长整地址移位所消耗的时间测量:
  下面是测量的数据:
  
  ▲ 地址移位所消耗的时间
  测试的代码:
  OFF(LC1024_CS);
  lnAddress = lnAddress 》》 8;
  ON(LC1024_CS);
  结论
  测试了23LC1024的基本的SPI模式的读写性能,这对于一般的数据缓存是满足的。
  但是在高速数据采集过程中,高达20多微妙的访问时间受限。这需要通过芯片的SQI多数据线模式来提高访问速度。
  还是受限于8051这个单片机的内核,使得该芯片的高速性能无法进一步提高了。将MCU更换成ARM的32位单片机则可以实质提高提高速度。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分