SPI接口串行SRAM | AP Memory 6404
测试 APS6404 的基本读写功能, 然后在测试它的容量以及读写速度。根据 APS6404的数据手册,编写最基本的慢速SPI读写过程,利用 普通的 IO口模拟 SPI序列,这样便于移植。后面可以通过单片机 SPI 硬件, 便可以提高读取速度, 也可以通过 四路 IO 同时访问的形式, 来提高读写的速度。它的封装似乎具有通用性, 也就是和 2020年, 我测试的另外一款SPI接口的RAM 相同
串行接口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
//------------------------------------------------------------------------------
更多推荐
所有评论(0)