SmartOS/Drivers/AT24CXX.cpp

134 lines
3.1 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "AT24CXX.h"
/*
AT24C02的存储容量为2K bit内容分成32页每页8Byte共256Byte操作时有两种寻址方式芯片寻址和片内子地址寻址
1芯片寻址AT24C02的芯片地址为1010其地址控制字格式为1010A2A1A0R/W。其中A2A1A0可编程地址选择位。
A2A1A0引脚接高、低电平后得到确定的三位编码与1010形成7位编码即为该器件的地址码。R/W为芯片读写控制位该位为0表示芯片进行写操作。
2片内子地址寻址芯片寻址可对内部256B中的任一个进行读/写操作其寻址范围为00~FF共256个寻址单位。
*/
#define AT24C01 127
#define AT24C02 255
#define AT24C04 511
#define AT24C08 1023
#define AT24C16 2047
#define AT24C32 4095
#define AT24C64 8191 //256 Pages of 32 bytes
#define AT24C128 16383 //256 Pages of 64bytes
#define AT24C256 32767 //512 Pages of 64bytes
#define AT24C512 65535 //512 Pages of 128bytes
#define EE_PAGES 512 //存储器页数目
#define EE_BYTES 128 //每页字节数目
#define EE_TYPE AT24C512//存储器型号
#define EE_TDEA 10 //页延时 ms
AT24CXX::AT24CXX()
{
IIC = nullptr;
// A2A1A0都接低电平时地址为 1010000也就是0x50
// 7位地址到了I2C那里需要左移1位
Address = 0x50;
}
AT24CXX::~AT24CXX()
{
delete IIC;
IIC = nullptr;
}
void AT24CXX::Init()
{
debug_printf("\r\nAT24CXX::Init Address=0x%02X \r\n", Address);
IIC->SubWidth = 1;
IIC->Address = Address << 1;
IIC->Open();
// 等待可用
int retry = 5;
while (retry-- > 0 && Read(0, 4).Length() < 4) Sys.Sleep(1);
}
bool AT24CXX::Write(ushort addr, byte data)
{
if (!IIC) return false;
return IIC->Write(addr & 0xFF, data);
}
byte AT24CXX::Read(ushort addr) const
{
if (!IIC) return 0;
return IIC->Read(addr & 0xFF);
}
bool AT24CXX::Write(uint addr, const Buffer& bs) const
{
if (!IIC) return false;
// 单页最大只能写入8个
int index = 0;
int count = bs.Length();
while (count > 0) {
int size = 8;
if (size > count) size = count;
if (!IIC->Write((ushort)addr, bs.Sub(index, size))) return false;
addr += size;
index += size;
count -= size;
// 内部存储数据等1ms差点点等5ms足够了。手册规定10ms
Sys.Sleep(5);
}
return true;
}
bool AT24CXX::Read(uint addr, Buffer& bs) const
{
if (!IIC) return false;
int len = IIC->Read((ushort)addr, bs);
if (len == 0) return false;
if (len != bs.Length()) bs.SetLength(len);
return true;
}
ByteArray AT24CXX::Read(ushort addr, int count) const
{
ByteArray bs;
bs.SetLength(count);
if (!Read(addr, bs)) bs.SetLength(0);
return bs;
}
ushort AT24CXX::Read16(ushort addr) const
{
if (!IIC) return 0xFFFF;
return IIC->Read2(addr);
}
uint AT24CXX::Read32(ushort addr) const
{
if (!IIC) return 0xFFFFFFFF;
return IIC->Read4(addr);
}
bool AT24CXX::Write(ushort addr, ushort data)
{
return Write(addr, Buffer(&data, 2));
}
bool AT24CXX::Write(ushort addr, uint data)
{
return Write(addr, Buffer(&data, 4));
}