24cxx.c 源文件 源码
/**@copyright Copyright(c)2014-2011 XXXX Co.,Ltd. All rights reserved.
*******************************************************************************
* @file
* @brief
* @author 匠在江湖 (ID:123456)
* @version V1.0
* @date 2014/05/08
*******************************************************************************
* @note
*
* @attention
*
*******************************************************************************
* @par 修改日志:
* <table>
* <tr><th>Date <th>Version <th>Author(ID:xxxxxx) <th>Description</tr>
* <tr><td>2014/05/08 <td>V1.0 <td>某某某(ID:123456) <td>创建初始版本</tr>
* </table>
*******************************************************************************
*/
/* Private includes ***********************************************************/
/* USER CODE BEGIN Includes */
#include "24cxx.h"
/* USER CODE END Includes */
/* Private typedef ************************************************************/
/* USER CODE BEGIN PT */
/* USER CODE END PT */
/* Private constants **********************************************************/
/* USER CODE BEGIN PC */
/* 不同型号对应内存大小 */
#define AT24C01_BTYE 127
#define AT24C02_BTYE 255
#define AT24C04_BTYE 511
#define AT24C08_BTYE 1023
#define AT24C16_BTYE 2047
#define AT24C32_BTYE 4095
#define AT24C64_BTYE 8191
#define AT24C128_BTYE 16383
#define AT24C256_BTYE 32767
#define AT24C01_PAGE_SIZE 8
#define AT24C02_PAGE_SIZE 8
#define AT24C04_PAGE_SIZE 16
#define AT24C08_PAGE_SIZE 16
#define AT24C16_PAGE_SIZE 16
#define AT24C32_PAGE_SIZE 32
#define AT24C64_PAGE_SIZE 32
#define AT24C128_PAGE_SIZE 64
#define AT24C256_PAGE_SIZE 64
#define AT24CXX_BTYE AT24C02_BTYE
#define AT24CXX_PAGE_SIZE AT24C02_PAGE_SIZE
/* 器件地址、硬件/页地址、读写命令 */
#define AT24CXX_DEVEICE_ADDR 0xA0 //AT24C01~64的bit7~4位是器件地址,AT24C128/256的bit7~3位是器件地址
#define AT24CXX_AX_ADDR 0x00 //AT24C01~64的bit3~1位是可编程(硬件/页)地址,AT24C128/256的bit2~1位是可编程硬件地址
#define AT24CXX_WRITE_CMD 0x00 //对应bit0位
#define AT24CXX_READ_CMD 0x01 //对应bit0位
#define AT24CXX_DEVEICE_ADDR_W (AT24CXX_DEVEICE_ADDR | AT24CXX_AX_ADDR | AT24CXX_WRITE_CMD)
#define AT24CXX_DEVEICE_ADDR_R (AT24CXX_DEVEICE_ADDR | AT24CXX_READ_CMD)
/* USER CODE END PC */
/* Private macro **************************************************************/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables **********************************************************/
/* USER CODE BEGIN PV */
/* USER CODE END PV */
/* Private function prototypes ************************************************/
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/**
*******************************************************************************
* @brief 初始化 函数
* @param [in] None
* @return None
* @note
*******************************************************************************
*/
void AT24CXX_Init(void)
{
IIC_Init(); //IIC 初始化 IO口
}
/**
*******************************************************************************
* @brief 一页内写入多个数据 函数
* @param [in] addr : 写入数据的目的起始地址
* @param [in] *buf : 要写入的数据指针
* @param [in] size : 要写入的数据的字节数
* @return 1--操作成功,操作失败
* @note 在AT24CXX指定地址页内写入多个数据. 注意每次写之间间隔时间:AT24CXX_WRITE_DELAYMS()
*******************************************************************************
*/
void AT24CXX_WritePage(unsigned short addr, unsigned char *buf, unsigned char size)
{
IIC_Start(); //IIC 起始条件
if(AT24CXX_BTYE >= AT24C32_BTYE)
{
IIC_TxDataRxAck( AT24CXX_DEVEICE_ADDR_W ); //发送 固定地址+器件地址+写命令
IIC_TxDataRxAck( (addr>>8) ); //发送高位字地址
}
else
{
IIC_TxDataRxAck( AT24CXX_DEVEICE_ADDR_W | ((addr>>7)&0x0E) ); //发送 固定地址+器件地址+页地址+写命令
}
IIC_TxDataRxAck( addr ); //发送低位字地址
while(size--)IIC_TxDataRxAck( *buf++ ); //发送字节
IIC_Stop(); //IIC 停止条件
}
/**
*******************************************************************************
* @brief 向任意地址写多个数据 函数
* @param [in] addr : 写入数据的目的起始地址
* @param [in] *buf : 要写入的数据指针
* @param [in] size : 要写入的数据的字节数
* @return None
* @note 实现跨页写
*******************************************************************************
*/
void AT24CXX_Write(unsigned short addr, unsigned char *buf, unsigned short size)
{
unsigned char wbSize; //可写字节大小 writeable btye size
wbSize = (AT24CXX_PAGE_SIZE - (addr%AT24CXX_PAGE_SIZE));
if(wbSize >= size) wbSize = size;
while(size)
{
AT24CXX_WritePage(addr, buf, wbSize);
AT24CXX_WRITE_DELAYMS(); //一次性写完延时,给写延时时间
buf += wbSize;
addr += wbSize;
size -= wbSize;
if(size >= AT24CXX_PAGE_SIZE)
{
wbSize = AT24CXX_PAGE_SIZE;
}
else
{
wbSize = size;
}
}
}
/**
*******************************************************************************
* @brief 任意地址读多个数据 函数
* @param [in] addr : 读取数据的目的起始地址
* @param [in] *buf : 要读取的数据存放的内存指针
* @param [in] size : 要读取的数据的字节数
* @return 1--操作成功,操作失败
* @note 在AT24CXX里面的指定地址开始读出指定个数的数据
*******************************************************************************
*/
void AT24CXX_Read(unsigned short addr, unsigned char *buf, unsigned short size)
{
IIC_Start(); //IIC 起始条件
if(AT24CXX_BTYE >= AT24C32_BTYE)
{
IIC_TxDataRxAck( AT24CXX_DEVEICE_ADDR_W ); //发送 固定地址+器件地址+写命令
IIC_TxDataRxAck( (addr>>8) ); //发送高位字地址
}
else
{
IIC_TxDataRxAck( AT24CXX_DEVEICE_ADDR_W | ((addr>>7)&0x0E) ); //发送 固定地址+器件地址+页地址+写命令
}
IIC_TxDataRxAck( addr ); //发送低位字地址
IIC_Start(); //IIC 起始条件
IIC_TxDataRxAck( AT24CXX_DEVEICE_ADDR_R ); //发送 固定地址+器件地址+读命令
while(size--)*buf++ = IIC_RxDataTxAck(IIC_ACK); //IIC 接收返回数据 发送应答
IIC_Stop(); //IIC 停止条件
}
24cxx.h 头文件 源码
/**@copyright Copyright(c)2014-2011 XXXX Co.,Ltd. All rights reserved.
*******************************************************************************
* @file
* @brief
* @author 匠在江湖 (ID:123456)
* @version V1.0
* @date 2014/05/08
*******************************************************************************
* @note
*
* @attention
*
*******************************************************************************
* @par 修改日志:
* <table>
* <tr><th>Date <th>Version <th>Author(ID:xxxxxx) <th>Description</tr>
* <tr><td>2014/05/08 <td>V1.0 <td>某某某(ID:123456) <td>创建初始版本</tr>
* </table>
*******************************************************************************
*/
#ifndef __24CXX_H__
#define __24CXX_H__
/* Private includes ***********************************************************/
/* USER CODE BEGIN Includes */
#include "iic.h"
#include "delay.h"
/* USER CODE END Includes */
#ifdef __cplusplus
extern "C" {
#endif
/* Exported typedef ***********************************************************/
/* USER CODE BEGIN ET */
/* USER CODE END ET */
/* Exported constants *********************************************************/
/* USER CODE BEGIN EC */
/* USER CODE END EC */
/* Exported macro *************************************************************/
/* USER CODE BEGIN EM */
#define AT24CXX_WRITE_CYCLE_LIMIT 10 //ms,见器件规格 写周期限制 最大
#define AT24CXX_WRITE_DELAYMS() DelayMS(AT24CXX_WRITE_CYCLE_LIMIT) //ms
/* USER CODE END EM */
/* Exported functions prototypes **********************************************/
/* USER CODE BEGIN EFP */
extern void AT24CXX_Init(void); //初始化IIC
extern void AT24CXX_WritePage(unsigned short addr, unsigned char *buf, unsigned char size); //页写,只能在一个页内写.两次页写要延时间隔,内部没有间隔延时
extern void AT24CXX_Write(unsigned short addr, unsigned char *buf, unsigned short size); //从指定地址开始写入指定长度的数据,内部已有间隔延时
extern void AT24CXX_Read(unsigned short addr, unsigned char *buf, unsigned short size); //从指定地址开始读出指定长度的数据
/* USER CODE END EFP */
#ifdef __cplusplus
}
#endif
#endif /* __24CXX_H__ */