SPI接口串行SRAM | AP Memory 6404

串行接口SRAM

 

01 口SRAM


一、前言

  这个小型的电子胸牌上有很多奇特的元器件。  这个 AP Memory 是一个 SPI 接口的 SRAM。 它具有 8M字节的容量。  下面对它进行初步测试。

GM1701173799_1280_720.MPG|_-3

二、制作测试电路

  这颗具有SPI接口的RAM,  工作电流从 2.7V 到3.6V。  它的封装似乎具有通用性,  也就是和 2020年, 我测试的另外一款SPI接口的RAM 相同, 型号为 24LC1024。 下面就使用相同的封装建立测试电路。

GM1701174213_1280_720.MPG|_-4

▲ 图1.2.1 APMemory 的封装

▲ 图1.2.1 APMemory 的封装

  使用STM32F103作为测试控制器,  使用它的 六个 IO 连接 SRAM, 完成读写。 利用快速制版方法, 制作测试电路。  一分钟后得到测试电路板。  焊接元器件, 其中的一个跳线,  使用 0 欧姆电阻完成。  下面对其进行测试。

GM1701176712_1280_720.MPG|_-7

▲ 图1.2.2 测试电路原理图

▲ 图1.2.2 测试电路原理图

▲ 图1.2.3 测试电路PCB

▲ 图1.2.3 测试电路PCB

AD\Test\2023\TestAPM.PcbDoc

▲ 图1.2.4 使用焊锡膏焊接芯片, 非常完美

▲ 图1.2.4 使用焊锡膏焊接芯片, 非常完美

三、测试结果

  焊接电路板之后, 对 APS6404L进行测试。  测试 APS6404 的基本读写功能, 然后在测试它的容量以及读写速度。  根据 APS6404的数据手册, 编写最基本的慢速SPI读写过程, 利用 普通的 IO口模拟 SPI序列, 这样便于移植。  下载程序。 基本读写功能正常。

GM1701307061_1280_720.MPG|_-5

▲ 图1.3.1  测试电路板

▲ 图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微秒。

GM1701314781_1280_720.MPG|_-9

▲ 图1.3.2  读写时间

▲ 图1.3.2 读写时间

  由于是采用了模拟SPI口的方式, 所以访问单个字节所需要的时间比较长。 如果将整个8兆字节全部读一遍, 需要花费19秒钟的时间。  后面可以通过单片机 SPI 硬件, 便可以提高读取速度,  也可以通过 四路 IO 同时访问的形式, 来提高读写的速度。
GM1701314917_1280_720.MPG|_-3

 

  结 ※


  文记录了对SPI接口的串行SRAM进行了测试。 RAM的型号为APS6404L。  测试了基本读写功能, 为之后的应用提供了经验。  赛读写速度方面并没有发挥它的最高接口速度。

GM1701315280_1280_720.MPG|_-3


■ 相关文献链接:

● 相关图表链接:

/*
**==============================================================================
** 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
//------------------------------------------------------------------------------
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卓晴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值