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__ */
相关文章推荐
- 步进电机细分4,8,16 ,32,64,128,256什么意思? 代表什么啊
- 关于C语言的宏定义,题目为编写一个带参数的宏,判断一个数是否在下列数列中:1 2 4 8 16 32 64 128 256 512 1024
- 16位LED恒流源芯片TC5020A,32*128点阵屏驱动函数
- AT24C01/02/04/08/16/32系列EEPROM驱动程序
- AT24C01/02/04/08/16/32系列EEPROM驱动程序
- 编写高质量代码:改善Java程序的151个建议(第1章:JAVA开发中通用的方法和准则___建议16~20)
- 简易电子书(24C64+Atmega16+128*64+红外接收+串口下载)
- 【Tiny6410 And Linux】—(5.1)—RamDisk 驱动实现(内核缺省的处理函数 __make_request())——代码
- 翻转64 32 16 位
- 图形液晶240*128驱动(型号为SMG240128A)移植到jlx的128*64单色lcd架构
- 《用EOM的眼光评判‘我要做全国最最好的标准权限组件和通用权限管理软件’3》(2010/04/08)
- CRC-32 CRC-16 校验算法 C# 代码
- 通用的PHP防注入漏洞攻击的过滤函数代码
- 16、把相同或近乎相同的代码形成函数和宏
- 使用AS3自带函数进2/8/10/16/32进制互换
- SSD1306驱动的0.91寸OLED屏上手(128*32)
- ESP8266之24C02 IIC驱动代码
- int8_t int16_t int32_t int64_t
- ASP通用分页样式函数代码
- 求s=2+4+8+16+32+64+......小于9000的最大值?