初级会员

- 积分
- 68
- 金钱
- 68
- 注册时间
- 2012-4-10
- 在线时间
- 7 小时
|
发表于 2017-11-16 17:58:49
|
显示全部楼层
本帖最后由 nos001 于 2017-11-16 18:14 编辑
[mw_shl_code=c,false]
/************************************************************************************************************
* @brief eeprom多字节连续写入函数
* 采用页写方式,自行换页,一个程序循环周期写一页数据,减小对系统实时性的影响,同时减少写入过程被中断打断的情形。
* @note 自行换页,就是写入到达页边界后重新发送“器件地址”和“写入地址”。
* @Param \sla: eeprom器件从地址,高7位是地址,bit0是读写控制位,0表示写,1表示读。
* \suba: eeprom器件子地址,即eeprom的数据写入地址,读写操作时自动增加。
* \*pBuffer: 待写数据缓存的指针
* \Len: 字节数据长度
* \EepromType: enum{ _24C01, _24C02, _24C04, _24C08, _24C16, _24C32, _24C64,_24C128, _24C256 }
* @retval 1: 写入成功;0:写入失败。
***********************************************************************************************************/
BOOL EE_WriteBytes( UINT8 sla, UINT16 suba, UINT8 *pBuf, UINT16 len, EE_TYPE EepromType )
{
static UINT16 WriteAddr;
static UINT16 WriteLen;
static UINT16 Length;
static UINT8 rw_state = EE_IDLE;
if( rw_state == EE_IDLE )
{
rw_state = EE_BUSY;
WriteAddr = suba;
WriteLen = 0;
Length = len;
I2C_Stop( );
}
if( rw_state == EE_BUSY )
{
I2C_Start( ); // 启动总线
I2C_SendByte( sla ); // 发送器件地址
if( I2C_WaitAck() )
{
I2C_Stop( ); // 命令执行失败后,切记发送停止信号,避免影响I2C总线上其他设备
return( 0 );
}
/* 发送待存储数据的eeprom存储地址,\M24C02只有256字节,发送1个字节地址,如果是\M24C04以上,那么此处需要连发多个地址 */
if( EepromType > _24C02 )
{
I2C_SendByte( WriteAddr >> 8 ); // 2字节数据写入地址高8位
if( I2C_WaitAck() )
{
I2C_Stop( );
return( 0 );
}
}
I2C_SendByte( ( UINT8 )WriteAddr ); // 2字节数据写入地址低8位,或者1字节数据写入地址
if( I2C_WaitAck() )
{
I2C_Stop( );
return( 0 );
}
pBuf += WriteLen; // 待写数据缓存首指针加已写入数据长度,等于换页操作后待写数据缓存指针当前值
while( Length > 0 )
{
I2C_SendByte( *pBuf ); // 发送数据
if( I2C_WaitAck() )
{
I2C_Stop( );
return( 0 );
}
pBuf++; // 待发送数据缓存指针增加
WriteAddr++; // eeprom存储地址增加
WriteLen++; // 已写入字节数
Length--;
if( ( WriteAddr & ( EE_PAGE_SIZE - 1 ) ) == 0 )
{
/* 到达页边界时,跳出循环,结束本次页写操作。
* 换页操作,就是重新发送器件地址SLA、数据写入地址,
* 退出函数后再次进入就达到了换页操作的目的。
*/
I2C_Stop( ); // 每次页写后结束总线
break;
}
}
if( Length == 0 )
{
I2C_Stop( );
rw_state = EE_IDLE;
return( 1 );
}
}
return( 0 );
}[/mw_shl_code]
是不是简洁明了,数据长度取决于数据缓存的大小,一个系统滴答周期只写一页,一页64字节的话写入时间大概2ms左右。
10ms系统滴答周期的话,写eeprom根本不影响实时性。
|
|