串行接口SRAM
01 串口SRAM
一、前言
这个小型的电子胸牌上有很多奇特的元器件。 这个 AP Memory 是一个 SPI 接口的 SRAM。 它具有 8M字节的容量。 下面对它进行初步测试。
二、制作测试电路
这颗具有SPI接口的RAM, 工作电流从 2.7V 到3.6V。 它的封装似乎具有通用性, 也就是和 2020年, 我测试的另外一款SPI接口的RAM 相同, 型号为 24LC1024。 下面就使用相同的封装建立测试电路。
▲ 图1.2.1 APMemory 的封装
使用STM32F103作为测试控制器, 使用它的 六个 IO 连接 SRAM, 完成读写。 利用快速制版方法, 制作测试电路。 一分钟后得到测试电路板。 焊接元器件, 其中的一个跳线, 使用 0 欧姆电阻完成。 下面对其进行测试。
▲ 图1.2.2 测试电路原理图
▲ 图1.2.3 测试电路PCB
AD\Test\2023\TestAPM.PcbDoc
▲ 图1.2.4 使用焊锡膏焊接芯片, 非常完美
三、测试结果
焊接电路板之后, 对 APS6404L进行测试。 测试 APS6404 的基本读写功能, 然后在测试它的容量以及读写速度。 根据 APS6404的数据手册, 编写最基本的慢速SPI读写过程, 利用 普通的 IO口模拟 SPI序列, 这样便于移植。 下载程序。 基本读写功能正常。
▲ 图1.3.1 测试电路板
D:\zhuoqing\window\ARM\IAR\STM32\Application\Test\2023\TestAPS6404L\Core\Src\main.c
下面测试一下模拟SPI读写 串口RAM的速度。 利用LED灯输出端口标志对RAM读写的起始时刻, 对APS6404L填充 0x800 个零。 通过测试LED灯端口电压信号 来测量读写所使用的时间。 然后除以 0x800 之后, 便可以获得读写RAM 单个字节的平均时间了。 这里测量访问时间为 4.62ms。 单个字节访问时间为 2.25微秒。
▲ 图1.3.2 读写时间
由于是采用了模拟SPI口的方式, 所以访问单个字节所需要的时间比较长。 如果将整个8兆字节全部读一遍, 需要花费19秒钟的时间。 后面可以通过单片机 SPI 硬件, 便可以提高读取速度, 也可以通过 四路 IO 同时访问的形式, 来提高读写的速度。
※ 总 结 ※
本文记录了对SPI接口的串行SRAM进行了测试。 RAM的型号为APS6404L。 测试了基本读写功能, 为之后的应用提供了经验。 赛读写速度方面并没有发挥它的最高接口速度。
■ 相关文献链接:
● 相关图表链接:
/*
**==============================================================================
** APS6404L.H: -- by Dr. ZhuoQing, 2023-11-29
**
** Description:
**
**==============================================================================
*/
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//==============================================================================
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void APS6404LInit(void);
//------------------------------------------------------------------------------
void APS6404LOutByte(unsigned char ucByte);
void APS6404LOutAddress(unsigned int nAddress);
void APS6404LOutInt32(unsigned int nData);
unsigned char APS6404LInByte(void);
void APS6404LWriteBytes(unsigned int nAddress, unsigned char * pBuffer, int nLength);
void APS6404LReadBytes(unsigned int nAddress, unsigned char * pBuffer, int nLength);
void APS6404LSetByte(unsigned int nAddress, unsigned char ucByte, int nLength);
//==============================================================================
// END OF FILE : APS6404L.H
//------------------------------------------------------------------------------
/*
**==============================================================================
** APS6404L.C: -- by Dr. ZhuoQing, 2023-11-29
**
**==============================================================================
*/
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void APS6404LInit(void) {
OUT(APS6404L_CS);
ON(APS6404L_CS);
OFF(APS6404L_CLK);
OUT(APS6404L_CLK);
ON(APS6404L_MISO);
IN(APS6404L_MISO);
OFF(APS6404L_MOSI);
OUT(APS6404L_MOSI);
}
//------------------------------------------------------------------------------
void APS6404LOutByte(unsigned char ucByte) {
unsigned int i;
unsigned char ucMask;
ucMask = 0x80;
for(i = 0; i < 8; i ++) {
if(ucByte & ucMask) ON(APS6404L_MOSI);
else OFF(APS6404L_MOSI);
ON(APS6404L_CLK);
ucMask >>= 1;
OFF(APS6404L_CLK);
}
}
void APS6404LOutAddress(unsigned int nAddress) {
unsigned int i, nMask;
nMask = 0x800000;
for(i = 0; i < 24; i ++) {
if(nAddress & nMask) ON(APS6404L_MOSI);
else OFF(APS6404L_MOSI);
ON(APS6404L_CLK);
nMask >>= 1;
OFF(APS6404L_CLK);
}
}
void APS6404LOutInt32(unsigned int nData) {
unsigned int i, nMask;
nMask = 0x80000000;
for(i = 0; i < 32; i ++) {
if(nData & nMask) ON(APS6404L_MOSI);
else OFF(APS6404L_MOSI);
ON(APS6404L_CLK);
nMask >>= 1;
OFF(APS6404L_CLK);
}
}
unsigned char APS6404LInByte(void) {
unsigned int i;
unsigned char ucMask, ucByte;
ucMask = 0x80;
ucByte = 0;
for(i = 0; i < 8; i ++) {
if(VAL(APS6404L_MISO)) ucByte |= ucMask;
ON(APS6404L_CLK);
OFF(APS6404L_CLK);
ucMask >>= 1;
}
return ucByte;
}
//------------------------------------------------------------------------------
void APS6404LWriteBytes(unsigned int nAddress, unsigned char * pBuffer, int nLength) {
OFF(APS6404L_CLK);
OFF(APS6404L_CS);
APS6404LOutByte(APS6404L_WRITE);
APS6404LOutAddress(nAddress);
int i;
for(i = 0; i < nLength; i ++) {
APS6404LOutByte(*(pBuffer ++));
}
ON(APS6404L_CS);
}
void APS6404LReadBytes(unsigned int nAddress, unsigned char * pBuffer, int nLength) {
OFF(APS6404L_CLK);
OFF(APS6404L_CS);
APS6404LOutByte(APS6404L_READ);
APS6404LOutAddress(nAddress);
int i;
for(i = 0; i < nLength; i ++) {
*(pBuffer ++) = APS6404LInByte();
}
ON(APS6404L_CS);
}
void APS6404LSetByte(unsigned int nAddress, unsigned char ucByte, int nLength) {
OFF(APS6404L_CLK);
OFF(APS6404L_CS);
APS6404LOutByte(APS6404L_WRITE);
APS6404LOutAddress(nAddress);
int i;
for(i = 0; i < nLength; i ++) {
APS6404LOutByte(ucByte);
}
ON(APS6404L_CS);
}
//==============================================================================
// END OF FILE : APS6404L.C
//------------------------------------------------------------------------------