当前位置: 首页 > news >正文

DrvBsp_I2C驱动_EEPROM(二)

目录

1.概述

2.设备映射表

3. 全局变量

4. 输出接口

4.1 DrvB_E2P_Map

4.2 DrvB_E2P_Rd

4.3 DrvB_E2P_Wr


1.概述

        本文描述了作为板级驱动库DrvBsp对EEPROM的支持接口。需要特别说明EEPROM的地址位:

        通过检查M24C02、M24C04、M24C16、M24C32、M24512等几款EEPROM,发现在2k字节(16kbit)以下容量的EEPROM仅使用1个字节的地址位,高位地址位利用了设备选择码的低三位。

2.设备映射表

typedef struct _STDRVB_E2P_MAP{unsigned char 	ucI2CId;		//本EEP操作所采用的I2C总线在DrvMcu库的序号unsigned char 	ucDevCode;	//设备选择码long		lSize;				//EEPROM的大小,目前主要用以确定地址位字节数short  	sPageSize;			//EEPROM的页尺寸short		sWrDly;			//页写入时间,在每一次页写之后需要进行等待写入动作执行
}STDRVB_E2P_MAP;

        配置表定义的是该驱动库对外输出的EEPROM的初始配置。

3. 全局变量

unsigned short 		m_usDrvB_E2P_Num;	//映射表的尺寸
STDRVB_E2P_MAP  *m_pstDrvB_E2P_Map;	//库DrvB的EEPROM配置信息映射表

4. 输出接口

4.1 DrvB_E2P_Map

        原型:void DrvB_E2P_Map( STDRVB_E2P_MAP  *pstMap , short sE2pNum)

      功能:为各个EEPROM的映射表进行初始化。

      参数:       STDRVB_E2P_MAP    *pstMap : 映射配置表
                        short            sE2pNum: 映射配置表中成员数量

void DrvB_E2P_Map( STDRVB_E2P_MAP      *pstMap , short sE2pNum)
{m_usDrvB_E2p_Num  = sE2pNum;m_pstDrvB_E2p_Map = pstMap;
}

4.2 DrvB_E2P_Rd

        原型:bool DrvB_E2P_Rd( short sDrvB_E2PNo , long lAddr , unsigned char *pucBuf , short sRdSize )
        功能:EEPROM的随机读功能。
        参数:     short sDrvB_E2PNo  :EEPROM在映射表的序号
                        long lAddr             :起始地址
                        unsigned char *pucBuf :读取数据的返回缓存
                        short sRdSize             :读取的字节数

bool DrvB_E2P_Rd( short sDrvB_E2PNo , long lAddr , unsigned char *pucBuf , short sRdSize )
{if( sDrvB_E2PNo >= m_usDrvB_E2p_Num )return false;unsigned char ucI2CId 	  = m_pstDrvB_E2p_Map[sDrvB_E2PNo].ucI2CId;unsigned char ucDevCode = m_pstDrvB_E2p_Map[sDrvB_E2PNo].ucDevCode;long lSize   	= m_pstDrvB_E2p_Map[sDrvB_E2PNo].lSize;short sAddrBit	= DrvB_E2P_GetAddrBit(m_pstDrvB_E2p_Map[sDrvB_E2PNo].lSize);; //当地址字节数为1,且地址超过256时,则将设备选择码的低3位用作地址位	if( sAddrBit == 1 ) //最低位为读写标志,不能修改ucDevCode |= ((lAddr>>8)<<1);DrvMI2C_sta(ucI2CId);							//起始if(DrvMI2C_wrbyt(ucI2CId , ucDevCode) == false)	//设备选择码+读return false;if(	sAddrBit == 2)if(DrvMI2C_wrbyt(ucI2CId , (lAddr&0xFF00)>>8) == false)	//地址return false;if(	sAddrBit <= 2)if(DrvMI2C_wrbyt(ucI2CId , (lAddr&0xFF)) == false)		return false;DrvMI2C_sta(ucI2CId);							//起始if(DrvMI2C_wrbyt(ucI2CId , ucDevCode|0x01) == false)//设备选择码+写				return false;for( short i=0;i<sRdSize;i++)	{pucBuf[i] = DrvMI2C_rdbyt( ucI2CId );			if( i == sRdSize-1 )DrvMI2C_nack(ucI2CId);					//最后一个字节返回NACKelseDrvMI2C_ack(ucI2CId);					//其余字节返回ACK}DrvMI2C_stop(ucI2CId);		return true;
}

4.3 DrvB_E2P_Wr

        原型:bool DrvB_E2P_Wr( short sDrvB_E2PNo , long lAddr , unsigned char *pucBuf , short sWrSize )
        功能:利用页写实现EEPROM的随机写功能。
        参数:      short sDrvB_E2PNo  :EEPROM在映射表的序号
                        long lAddr             :起始地址
                        unsigned char *pucBuf :写入数据的缓存
                        short sWrSize             :写入数据的字节数

bool DrvB_E2P_Wr( short sDrvB_E2PNo, long lAddr , unsigned char *pucBuf , short sWrSize )
{if( sDrvB_E2PNo >= m_usDrvB_E2p_Num )return false;unsigned char ucDevCode = m_pstDrvB_E2p_Map[sDrvB_E2PNo].ucDevCode;unsigned char ucI2CId 	= m_pstDrvB_E2p_Map[sDrvB_E2PNo].ucI2CId;short  sAddrBit   = DrvB_E2P_GetAddrBit(m_pstDrvB_E2p_Map[sDrvB_E2PNo].lSize);short  sPageSize  = m_pstDrvB_E2p_Map[sDrvB_E2PNo].sPageSize;short  sPageMask = sPageSize - 1;short  sOffset  = 0;while( sOffset < sWrSize  ){long lBegAddr = lAddr + sOffset;if( sAddrBit == 1 )ucDevCode |= ((lBegAddr>>8)<<1);DrvMI2C_sta(ucI2CId);		if(DrvMI2C_wrbyt(ucI2CId , ucDevCode) == false)return false;if(	sAddrBit == 2)if(DrvMI2C_wrbyt(ucI2CId , (lBegAddr&0xFF00)>>8) == false)return false;if(	sAddrBit <= 2)if(DrvMI2C_wrbyt(ucI2CId , (lBegAddr&0xFF)) == false)return false;
//按页写,一致写到页的边界或已到写入字节数		for( short i=0;i<(sPageSize - (lBegAddr&sPageMask)) && sOffset < sWrSize ; i++)DrvMI2C_wrbyt(ucI2CId , pucBuf[sOffset++]);DrvMI2C_stop(ucI2CId);		
//写入长延时,直到EEPROM中缓存的数据存入EEPROMDrvB_Delay(m_pstDrvB_E2p_Map[sDrvB_E2PNo].lWrDly);  }return true;
}

http://www.dtcms.com/a/488081.html

相关文章:

  • 上海设计师网站有哪些md主题 wordpress
  • 网站建设企业建站模板树脂工艺品网站建设公司
  • DMABUF 核心概念:Linux 的“共享白板”机制
  • 鸿蒙Harmony实战开发教学(No.2)-鸿蒙新项目创建+目录配置!(新手入门指南)
  • 网站开发 项目计划书运营最好的网站
  • 上海网站建设500元wordpress显示版权
  • MA模型(移动平均模型)
  • RuoYi.Net后端返回雪花ID前端精度丢失问题
  • asp网站连不上数据库网站自动化开发
  • 云信im在Android中的使用2
  • 朴素贝叶斯分类
  • pos网站源码wordpress上线需要改什么
  • 阿里巴巴上怎样做自己的网站郑州网站制作
  • 【ComfyUI】SDXL Simple 实现高质量图像生成全流程
  • 基于 STM32CubeMX 实现 FreeRTOS 可视化移植的多任务 LED 控制实践(基于 STM32F103ZET6)
  • 网站制作自己接单微分销代理
  • it项目网站开发的需求文档北京网站设计培训学校
  • Fragment与Fragment、Activity通信的方式?
  • 中建西部建设网站网站网页设计基本理论
  • wordpress网站有哪些免费的ppt模板下载软件
  • 目标检测全解析
  • 微企点网站建设的教学视频小程序定制开发要多少钱
  • 玩机搞机基本常识-------安卓刷机与 ROOT:从基础概念到工具选择指南 基础玩机 一
  • 查看你电脑上某个端口正在被哪个进程占用
  • 垦利网站建设建筑网建筑规范大全
  • wordpress标题标签10个网站用户体验优化的研究结果
  • 没有网站怎么做推广网站开发文献综述
  • 网站建设速成班培训免费公司网址怎么注册
  • 今日训练 ——线段树与二分法
  • PyQt5事件机制