今天我们先介绍四剑客之一的 32KE EEPROM Arduino 开发板
Arduino 由于其最完美的生态环境,成为了学习单片机的最佳途径,其库函数丰富,例程超多,开发效率高,开发产品稳定性好。但是最大的缺点是单片机内置存储空间很小,常用的UNO,NANO,PRO MINI 都是采用了328P单片机,内置的EEPROM用户数据存储空间只有1KB,比如我们如果做个刷卡的门禁系统,每个卡号+用户ID占用10个字节的话,最多也就存储102张卡号。如果做个网络版应用,可能连存储个首页文件都很困难。即便进化到UNO R4版本,高达150元人民币的开发板,其EEPROM容量也仅有8KB.
一、CC_SMINI 开发板简介
好在CC最近推出了多款大容量存储的Arduino 开发板,涵盖了EEPROM FLASH FRAM SD等,今天我来给大家介绍第一款 基于AT24C256的 容量高达32K eeprom开发板。
首先看下板子实物图:
板子的主芯片采用了328PB-AN,查了下官网,这是其328系列工业级芯片里面最强的一款了。整个板子到手第一感觉真的超级微型。长度仅2.1cm,宽度仅1.8cm。哈哈,这下随便设计个指纹门禁、遥控车啥的,再也不用担心体积重量问题了。
底板采用了CC 自家的SMINI 16M Arduino 开发板,这个个绝妙的设计。这里先来欣赏下:
2.54排针标准孔引出了D0 D1 D3 D7 D8 D10 D11 D12 D13 A4 A5 多达11个IO口,这11个IO口涵盖了2个硬件串口,1个SPI,1个I2C,2个模拟,4个PWM,中断1 的组合功能,可以满足绝大多数开发应用。更为惊艳的是 328PB芯片的另一面设计了一个8P的贴片扩展口,单独开放了D2 D23 D24 A0 A1 A7 6个IO口,涵盖了第2个独立的硬件SPI接口,第2个独立I2C,中断0,3个模拟的组合功能。也就是说扩展口完全没有占用排针主接口,可用于标准贴片外扩,飞线等使用。
总之一句话,在不到2厘米大小的空间上提供了多达17个IO口,真是最强超微型Arduino 了吧。
大家可能会有个疑问,Arduino 哪里来的第二SPI,第二I2C,第二硬件串口呢?其实这些硬件接口主要与所使用的芯片有关。比如MEGA2560 就有4个硬件串口,分别为Serial,Serial1,Serial2,Serial3 只要你在IDE中选择了2560的板子,就可以编译通过。同样如果选择了328PB的芯片,就可以使用Serial,Serial1,引用 SPI.h, SPI1.h , Wire.h , Wire1.h 这些内置的对象了。
328PB开发板采用的是MiniCore组件,安装方式:请在Arduino IDE 主界面 点击 文件-首选项-其他开发板管理器地址 中添加 https://mcudude.github.io/MiniCore/package_MCUdude_MiniCore_index.json,然后打开开发板管理器 搜索MiniCore安装即可
二、AT24C256的使用
安装好了 MiniCore组件 后,我们选择328PB的开发板,如图:
然后输入以下代码进行下读写速度测试,在32K EEPROM存储空间的加持下,如果存储10字节的门禁卡信息的话,就可以保存3200多个用户了哦。稍微压缩了点的网页文件也没有问题了呢。
#include <Wire1.h> //指定AT24C模块所接的arduino 开发板的 Wire1.h 或者 Wire1.h(仅328PB芯片有Wire1.h)
#define I2C_N Wire1 //指定AT24C模块所接的arduino 开发板的 I2C接口,可选Wire 或者 Wire1(仅328PB芯片有Wire1)
int DeviceAddress=0x50;//AT24C 模块的地址
unsigned long elsp = 0;//用来计算耗时的变量
void setup() {
I2C_N.begin(); //启动I2C通信
Serial.begin(115200);
pinMode(A1, OUTPUT); //CC_SMINI_EEPROM开发板有一个LED指示灯,接的A1
digitalWrite(A1, LOW); //指示灯亮
byte W_num=0;
Serial.print("write 1k:");//连续写入1K字节数据
elsp = millis();
for (uint16_t i = 0; i < 1024; i++) {
Write_Byte(i, W_num);
W_num++;
if (W_num == 256) { W_num = 0; }
}
Serial.print(millis() - elsp);
Serial.println(" ms"); //3861ms
Serial.println();
Serial.print("read 1k:");//读取1K字节数据
elsp = millis();
for (uint16_t i = 0; i < 1024; i++) {
W_num = Read_Byte(i);
Serial.print(Read_Byte(i));
Serial.print(" ");
}
Serial.print(millis() - elsp);
Serial.println(" ms"); //563ms
}
void loop() {
}
void Write_Byte(int DataAddress, byte Data) {
int rData = Data;
I2C_N.beginTransmission(DeviceAddress);
I2C_N.write((DataAddress >> 8) & 0xff);
I2C_N.write(DataAddress & 0x00ff);
I2C_N.write(rData);
I2C_N.endTransmission();
delayMicroseconds(3200); //写入一个字节最低需要3.5MS
while (1) {
I2C_N.beginTransmission(DeviceAddress);
if (I2C_N.endTransmission() == 0) {
return;
}
delayMicroseconds(100);
}
}
byte Read_Byte(int DataAddress) {
byte data = 0xFF;
I2C_N.beginTransmission(DeviceAddress);
I2C_N.write((DataAddress >> 8) & 0xff);
I2C_N.write(DataAddress & 0xff);
I2C_N.endTransmission();
size_t recv = I2C_N.requestFrom(DeviceAddress, 1);
if (recv != 1) {
return 0;
}
return I2C_N.read();
}
顺便说一句,很多网友都在说Arduino 不支持中文的问题,其实用了这个开发板,就容易解决了,先设计个简单的透传软件,从电脑把中文字符串发送给开发板,开发直接按字节存储到AT24C256芯片中,记好地址规则。然后程序中直接读取输出即可。
更多信息,大家有兴趣可以去了解了解,https://item.taobao.com/item.htm?id=745055383210