编写好 I2C 数据读写函数, 下面就可以编写 AT24CXX 的读写函数, 代码如下: - /****************************************************************
- * 函 数 名 : AT24CXX_ReadOneByte
- * 函数功能 : 在AT24CXX 指定地址读出一个数据
- * 输 入 : ReadAddr:开始读数的地址
- * 输 出 : 读到的数据
- *****************************************************************/
- u8 AT24CXX_ReadOneByte(u16 ReadAddr)
- {
- u8 temp=0;
- IIC_Start();
- if(EE_TYPE>AT24C16)
- {
- IIC_Send_Byte(0XA0); //发送写命令
- IIC_Wait_Ack();
- IIC_Send_Byte(ReadAddr>>8);//发送高地址
- }
- else
- {
- IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); //发送器件地址0XA0,写数据
- }
- IIC_Wait_Ack();
- IIC_Send_Byte(ReadAddr%256); //发送低地址
- IIC_Wait_Ack();
- IIC_Start();
- IIC_Send_Byte(0XA1); //进入接收模式
- IIC_Wait_Ack();
- temp=IIC_Read_Byte(0);
- IIC_Stop();//产生一个停止条件
- return temp;
- }
复制代码- /****************************************************************
- * 函 数 名 : AT24CXX_WriteOneByte
- * 函数功能 : 在AT24CXX 指定地址写入一个数据
- * 输 入 : WriteAddr :写入数据的目的地址DataToWrite:要写入的数据
- * 输 出 : 无
- *****************************************************************/
- void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
- {
- IIC_Start();
- if(EE_TYPE>AT24C16)
- {
- IIC_Send_Byte(0XA0); //发送写命令
- IIC_Wait_Ack();
- IIC_Send_Byte(WriteAddr>>8);//发送高地址
- }
- else
- {
- IIC_Send_Byte(0XA0+((WriteAddr/256)<<1)); //发送器件地址0XA0,写数据
- }
- IIC_Wait_Ack();
- IIC_Send_Byte(WriteAddr%256); //发送低地址
- IIC_Wait_Ack();
- IIC_Send_Byte(DataToWrite); //发送字节
- IIC_Wait_Ack();
- IIC_Stop();//产生一个停止条件
- delay_ms(10);
- }
复制代码- /****************************************************************
- * 函 数 名 : AT24CXX_WriteLenByte
- * 函数功能 : 在 AT24CXX 里面的指定地址开始写入长度为 Len的数据用于写入 16bit 或者 32bit 的数据
- * 输 入 : WriteAddr :写入数据的目的地址
- DataToWrite:要写入的数据
- Len :要写入数据的长度 2,4
- * 输 出 : 无
- *****************************************************************/
- void AT24CXX_WriteLenByte(u16 WriteAddr,u32 DataToWrite,u8 Len)
- {
- u8 t;
- for(t=0;t<Len;t++)
- {
- AT24CXX_WriteOneByte(WriteAddr+t,(DataToWrite>>(8*t))&0xff);
- }
- }
复制代码- /****************************************************************
- * 函 数 名 : AT24CXX_ReadLenByte
- * 函数功能 : 在 AT24CXX 里面的指定地址开始读出长度为 Len的数据用于读出 16bit 或者 32bit 的数据
- * 输 入 : ReadAddr :开始读出的地址
- Len :要读出数据的长度 2,4
- * 输 出 : 读取的数据
- *****************************************************************/
- u32 AT24CXX_ReadLenByte(u16 ReadAddr,u8 Len)
- {
- u8 t;
- u32 temp=0;
- for(t=0;t<Len;t++)
- {
- temp<<=8;
- temp+=AT24CXX_ReadOneByte(ReadAddr+Len-t-1);
- }
- return temp;
- }
复制代码- /****************************************************************
- * 函 数 名 : AT24CXX_Check
- * 函数功能 : 检查 AT24CXX 是否正常
- * 输 入 : 无
- * 输 出 : 1:检测失败,0:检测成功
- *****************************************************************/
- u8 AT24CXX_Check(void)
- {
- u8 temp;
- temp=AT24CXX_ReadOneByte(255);//避免每次开机都写 AT24CXX
- if(temp==0x36)return 0;
- else//排除第一次初始化的情况
- {
- AT24CXX_WriteOneByte(255,0X36);
- temp=AT24CXX_ReadOneByte(255);
- if(temp==0X36)return 0;
- }
- return 1;
- }
复制代码- /****************************************************************
- * 函 数 名 : AT24CXX_Read
- * 函数功能 : 在 AT24CXX 里面的指定地址开始读出指定个数的数据
- * 输 入 : ReadAddr :开始读出的地址 对 24c02为0~255
- pBuffer :数据数组首地址
- NumToRead:要读出数据的个数
- * 输 出 : 无
- *****************************************************************/
- void AT24CXX_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead)
- {
- while(NumToRead)
- {
- *pBuffer++=AT24CXX_ReadOneByte(ReadAddr++);
- NumToRead--;
- }
- }
复制代码- /****************************************************************
- * 函 数 名 : AT24CXX_Write
- * 函数功能 : 在 AT24CXX 里面的指定地址开始写入指定个数的数据
- * 输 入 : WriteAddr :开始写入的地址 对 24c02为0~255
- pBuffer :数据数组首地址
- NumToRead:要读出数据的个数
- * 输 出 : 无
- *****************************************************************/
- void AT24CXX_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)
- {
- while(NumToWrite--)
- {
- AT24CXX_WriteOneByte(WriteAddr,*pBuffer);
- WriteAddr++;
- pBuffer++;
- }
- }
复制代码 这部分函数在 24cxx.c文件内,这个文件支持 AT24CXX 系列的很多芯片,可通过 24cxx.h 文件内的 EE_TYPE宏来修改,可修改的宏定义如下: - #define AT24C01 127
- #define AT24C02 255
- #define AT24C04 511
- #define AT24C08 1023
- #define AT24C16 2047
- #define AT24C32 4095
- #define AT24C64 8191
- #define AT24C128 16383
- #define AT24C256 32767
复制代码
由于我们开发板上使用的是 AT24C02,所以宏定义默认是:
如果你自己设计的电路板上使用的是其他的 AT24CXX 芯片, 那么可以修改这个宏,实现不同芯片数据的读取和写入操作。
|