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;
}