本文来自一位博主,对产品的使用过程以及部分设计分享。
CSNP4GCR01-DPW是一种基于NAND闪存和SD控制器的4Gb密度嵌入式存储;而CSNP32GCR01-AOW是一种基于NAND闪存和SD控制器的32Gb密度嵌入式存储。与原始NAND相比其具有嵌入式坏块管理和更强的嵌入式ECC。即使在异常断电,它仍然可以安全地保存数据。作为一个存储芯片,它确实做到了小巧,LGA-8的封装对比我之前用到过的TF卡,只占到了其面积的三分之一,这样对于一些嵌入式的设计就方便了很多。
官方还很贴心的提供了样品的测试板,在这款测试板上,我焊接了4GB的CSNP4GCR01-DPW上去,并且跑了一下分,对于一款小的存储芯片而言,实在难得。
(上图为测试板焊接图)
博主日前在设计基于H616与NB-IOT的嵌入式智能储物柜的时候考虑过存储方面的问题,当时在SD NAND和EMMC与TF卡中徘徊,以下是几个存储类型的对比。
经过多方对比,本着不需要频繁更换的原则,同时也为了更好的防水和成本考虑,最终决定使用雷龙公司的SD NAND 作为设计样品的存储部分。
此外,SD NAND还具有不用写驱动程序自带坏块管理的NAND FLASH(贴片式TF卡),不标准的SDIO接口,也同时兼容SPI/SD接口,10万次的SLC晶圆擦写寿命,通过一万次的随机掉电测试耐高低温,经过跑分测得,速度级别Class10。标准的SD2.0协议,普通的SD卡可以直接驱动,支持TF卡启动的SOC都可以用SD NAND,而且雷龙官方还贴心的提供了STM32参考例程和原厂技术支持,这对于刚上手的小白而言,十分友好。
使用H616作为主控CPU并搭配NB-IOT来向申请下来的云端传输数据,当WIFI正常时,储物数据每搁两小时向云端传输一次,当有人取出物品时再次向云端发送一次数据(不保留在SD NAND中);一旦系统检测到WIFI出现问题,储物数据转而存储到SD NAND中,取物时输入的物品ID和取出时间一并放入SD NAND中(我也是看中了SD NAND与原始NAND相比其具有嵌入式坏块管理和更强的嵌入式ECC。即使在异常断电,它仍然可以安全地保存数据这一点)。
根据官方数据手册提供的SD NAND参考设计,只占用8个GPIO,对于H616来说,确实很友好
这里为了不泄露他人的劳动成果,我也就不粘PCB设计了。
下面是关于H616驱动SD NAND的示例代码,这里记录一下自己当初的学习过程(注:这个代码不能直接拿过来就用,而是要根据自己的需求修改)
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include "h616_sdio.h"
// 定义SDIO引脚
#define SDIO_CMD_PIN 0
#define SDIO_CLK_PIN 1
#define SDIO_D0_PIN 2
#define SDIO_D1_PIN 3
#define SDIO_D2_PIN 4
#define SDIO_D3_PIN 5
// 定义NAND芯片命令
#define CMD_READ 0x00
#define CMD_WRITE 0x80
#define CMD_ERASE 0x60
#define CMD_STATUS 0x70
#define CMD_RESET 0xff
// 定义NAND芯片状态
#define STATUS_READY 0x40
#define STATUS_ERROR 0x01
// 初始化SDIO控制器
void sdio_init()
{
// 设置SDIO引脚模式和速率
h616_sdio_set_pin_mode(SDIO_CMD_PIN, H616_SDIO_PIN_MODE_SDIO);
h616_sdio_set_pin_mode(SDIO_CLK_PIN, H616_SDIO_PIN_MODE_SDIO);
h616_sdio_set_pin_mode(SDIO_D0_PIN, H616_SDIO_PIN_MODE_SDIO);
h616_sdio_set_pin_mode(SDIO_D1_PIN, H616_SDIO_PIN_MODE_SDIO);
h616_sdio_set_pin_mode(SDIO_D2_PIN, H616_SDIO_PIN_MODE_SDIO);
h616_sdio_set_pin_mode(SDIO_D3_PIN, H616_SDIO_PIN_MODE_SDIO);
h616_sdio_set_clock(H616_SDIO_CLOCK_FREQ_25MHZ);
// 初始化SDIO控制器
h616_sdio_init();
}
// 发送NAND芯片命令
void nand_send_cmd(uint8_t cmd)
{
// 设置SDIO控制器传输模式和命令码
h616_sdio_set_transfer_mode(H616_SDIO_TRANSFER_MODE_WRITE);
h616_sdio_set_command_code(cmd);
// 发送命令
h616_sdio_send_command();
}
// 发送NAND芯片地址
void nand_send_addr(uint32_t addr)
{
// 设置SDIO控制器传输模式和地址
h616_sdio_set_transfer_mode(H616_SDIO_TRANSFER_MODE_WRITE);
h616_sdio_set_address(addr);
// 发送地址
h616_sdio_send_address();
}
// 读取NAND芯片数据
void nand_read_data(uint8_t *data, uint32_t size)
{
// 设置SDIO控制器传输模式
h616_sdio_set_transfer_mode(H616_SDIO_TRANSFER_MODE_READ);
// 读取数据
h616_sdio_read_data(data, size);
}
// 写入NAND芯片数据
void nand_write_data(const uint8_t *data, uint32_t size)
{
// 设置SDIO控制器传输模式
h616_sdio_set_transfer_mode(H616_SDIO_TRANSFER_MODE_WRITE);
// 写入数据
h616_sdio_write_data(data, size);
}
// 读取NAND芯片状态
uint8_t nand_read_status()
{
uint8_t status;
// 发送读取状态命令
nand_send_cmd(CMD_STATUS);
// 读取状态
nand_read_data(&status, 1);
return status;
}
// 等待NAND芯片准备就绪
void nand_wait_ready()
{
uint8_t status;
// 循环读取状态,直到NAND芯片准备就绪
do {
status = nand_read_status();
} while ((status & STATUS_READY) == 0);
}
// 读取NAND芯片数据
void nand_read(uint32_t page, uint32_t column, uint8_t *data, uint32_t size)
{
// 发送读取命令和地址
nand_send_cmd(CMD_READ);
nand_send_addr(column | (page << 8));
// 等待NAND芯片准备就绪
nand_wait_ready();
// 读取数据
nand_read_data(data, size);
}
// 写入NAND芯片数据
void nand_write(uint32_t page, uint32_t column, const uint8_t *data, uint32_t size)
{
// 发送写入命令和地址
nand_send_cmd(CMD_WRITE);
nand_send_addr(column | (page << 8));
// 写入数据
nand_write_data(data, size);
// 等待NAND芯片准备就绪
nand_wait_ready();
}
// 擦除NAND芯片块
void nand_erase(uint32_t block)
{
// 发送擦除命令和地址
nand_send_cmd(CMD_ERASE);
nand_send_addr(block << 8);
// 等待NAND芯片准备就绪
nand_wait_ready();
}
// 复位NAND芯片
void nand_reset()
{
// 发送复位命令
nand_send_cmd(CMD_RESET);
// 等待NAND芯片准备就绪
nand_wait_ready();
}
// 示例程序入口
int main()
{
uint8_t data[2048];
memset(data, 0x5a, sizeof(data));
// 初始化SDIO控制器
sdio_init();
// 复位NAND芯片
nand_reset();
// 擦除第0块
nand_erase(0);
// 写入第0页
nand_write(0, 0, data, sizeof(data));
// 读取第0页
nand_read(0, 0, data, sizeof(data));
return 0;
}
MAX3485EESA+T/RS-485/RS-422芯片 | 5.99 | |
DS18B20+/温度传感器 | 4.38 | |
ADUM1201ARZ-RL7/数字隔离器 | 5.28 | |
ADM2483BRWZ-REEL/隔离式RS485/422收发器 | 9.36 | |
OPA2189IDR/精密运放 | 6.83 | |
STM32F103RCT6/单片机(MCU/MPU/SOC) | 6.5 | |
STM32F103VCT6/单片机(MCU/MPU/SOC) | 7.05 | |
STM32F103CBT6/单片机(MCU/MPU/SOC) | 5.75 | |
STM32F103ZET6/单片机(MCU/MPU/SOC) | 10.9 | |
AMC1311BDWVR/特殊功能放大器 | 4.95 |
60万+现货SKU
品类不断扩充中
科技智能大仓储
最快4小时发货
正品有保障
物料可追溯
明码标价节省时间
一站式采购元器件
您确定要删除此收货地址的吗?
您确定删除此收货地址吗?
content
content