您的位置:首页 > 编程语言

24C02/04/08/16/32/64/128/256 通用 驱动代码 函数

2020-07-06 22:56 489 查看

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__ */
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: