当前位置:首页 > 单片机 > 单片机
[导读]刚刚调好了个24c256的操作,自己在程序里搞了个连续读写的函数!很烦那页写跨页的问题,所以干脆做了个通用点的函数,小于3字节的写就用随机写,大于3字节的就用页写!共享拉! 真正供其他操作调用的函数是: uncha

刚刚调好了个24c256的操作,自己在程序里搞了个连续读写的函数!很烦那页写跨页的问题,所以干脆做了个通用点的函数,小于3字节的写就用随机写,大于3字节的就用页写!共享拉!
真正供其他操作调用的函数是:
uncharSeqWriteTo24c256(uncharsla_add,unintaddr_op,uncharwrite_size,unchar*write_buf);
uncharSeqReadFrom24c256(uncharsla_add,unintaddr_op,uncharread_size,unchar*read_buf);
其他的都是本文件内自己调用的函数!!

//*****************************************************调试函数
voidDebugEepromService(void)
{
unchardebug_buf[255];
debug_buf[0]=0x91;
debug_buf[1]=0x92;
debug_buf[2]=0x93;
debug_buf[3]=0x94;
debug_buf[4]=0x95;
debug_buf[250]=0x05;
debug_buf[251]=0x06;
debug_buf[252]=0x07;
debug_buf[253]=0x08;
debug_buf[254]=0x09;
SeqWriteTo24c256(EEP1_ADDR,1,255,debug_buf);
SeqReadFrom24c256(EEP1_ADDR,1,255,debug_buf);
}
//*************************************************************



#defineIIC_SDA_PB0x20
#defineIIC_SCL_PB0x80
#defineIIC_DEL_WAIT0x10//>4.7us(12.80us)forFre=11.0592M
#defineIIC_DEL_WRITE0x2700//>6ms(7266.54us=7.266ms)forFre=11.0592M

#defineEEP1_ADDR0xa4
#definePAGE_CAP_BYTE64//24C256页写容量:64字节


/*
功能函数文件
2005-9-229:54byxth
版本:v1.0
--------------------------------------------
Mcu:avrmega32Frequency:11.0592M
--------------------------------------------
功能概述:Eeprom操作文件
--------------------------------------------
*/
//=============================函数声明
//----------IIC操作调用函数
voidIicDelayService(unintdelay_time);
voidIicStartBitSend(void);
voidIicStopBitSend(void);
voidIicAckService(uncharack_data);
uncharIicSendByteService(unchartx_data);
uncharIicAccByteService(void);
//----------At24c256操作函数
uncharRandWriteByteTo24c256(uncharsla_add,unintaddr_op,unchardata_op);
uncharWritePageTo24c256(uncharsla_add,unintaddr_op,unchar*write_data_buf);
uncharSeqWriteTo24c256ByPage(uncharsla_add,unintaddr_op,uncharwrite_size,unchar*write_buf);
uncharSeqWriteTo24c256(uncharsla_add,unintaddr_op,uncharwrite_size,unchar*write_buf);
uncharSeqReadFrom24c256(uncharsla_add,unintaddr_op,uncharread_size,unchar*read_buf);
//=============================函数定义
voidIicDelayService(unintdelay_count)
{
unintcount;
for(count=0;countasm("NOP");
}

voidIicStartBitSend(void)
{
PORTB|=IIC_SCL_PB;//发送起始条件的时钟信号
asm("NOP");
PORTB|=IIC_SDA_PB;//起始条件建立时间大于4.7us,延时
IicDelayService(IIC_DEL_WAIT);
PORTB&=~IIC_SDA_PB;
IicDelayService(IIC_DEL_WAIT);
PORTB&=~IIC_SCL_PB;//钳住I2C总线,准备发送或接收数据
asm("NOP");
}

voidIicStopBitSend(void)
{
PORTB&=~IIC_SDA_PB;//发送结束条件的时钟信号
IicDelayService(IIC_DEL_WAIT);
PORTB|=IIC_SCL_PB;//结束条件建立时间大于4μs
IicDelayService(IIC_DEL_WAIT);
PORTB|=IIC_SDA_PB;
asm("NOP");
}

voidIicAckService(uncharack_data)
{//作为主控器件应答->发应答或非应答信号
if(ack_data==0)PORTB&=~IIC_SDA_PB;
elsePORTB|=IIC_SDA_PB;
IicDelayService(IIC_DEL_WAIT);
PORTB|=IIC_SCL_PB;
IicDelayService(IIC_DEL_WAIT);
PORTB&=~IIC_SCL_PB;//清时钟线,钳住I2C总线以便继续接收
asm("NOP");
}

uncharIicSendByteService(unchartx_data)
{//将字节发送出去,可以是地址,也可以是数据,发完后等待应答并返回
uncharbit_count,ack_flag;
for(bit_count=0;bit_count<8;bit_count++)
{
if((tx_data<PORTB|=IIC_SDA_PB;
else
PORTB&=~IIC_SDA_PB;
IicDelayService(IIC_DEL_WAIT);
PORTB|=IIC_SCL_PB;//置时钟线为高,通知被控器开始接收数据位
IicDelayService(IIC_DEL_WAIT);//保证时钟高电平周期大于4μs
PORTB&=~IIC_SCL_PB;
}
IicDelayService(IIC_DEL_WAIT);
PORTB&=~IIC_SDA_PB;
DDRB&=~IIC_SDA_PB;//SDA置成输入
asm("NOP");
PORTB|=IIC_SCL_PB;
IicDelayService(IIC_DEL_WAIT);
IicDelayService(IIC_DEL_WAIT);
if(PINB&IIC_SDA_PB)//判断是否接收到应答信号
ack_flag=NO;
else
ack_flag=YES;//有应答信号
DDRB|=IIC_SDA_PB;
PORTB&=~IIC_SCL_PB;
asm("NOP");
return(ack_flag);
}

uncharIicAccByteService(void)
{//接收从器件传来的数据,并判断总线错误
uncharbit_count,get_data;
DDRB&=~IIC_SDA_PB;
get_data=0;
for(bit_count=0;bit_count<8;bit_count++)
{
asm("NOP");
PORTB&=~IIC_SCL_PB;//置时钟线为低,准备接收数据位
IicDelayService(IIC_DEL_WAIT);//时钟低电平周期大于4.7μs;
PORTB|=IIC_SCL_PB;//置时钟线为高使数据线上数据有效
get_data<<=1;
if(PINB&IIC_SDA_PB)
get_data++;
asm("NOP");
asm("NOP");
}
PORTB&=~IIC_SCL_PB;
DDRB|=IIC_SDA_PB;
asm("NOP");
return(get_data);
}

uncharRandWriteByteTo24c256(uncharsla_add,unintaddr_op,unchardata_op)
{
uncharresult_now,temp_data;
IicStartBitSend();//起始条件
temp_data=sla_add;//从器件地址
result_now=IicSendByteService(temp_data);
if(result_now==NO)return(result_now);
temp_data=addr_op>>8;//操作单元地址高8位
result_now=IicSendByteService(temp_data);
if(result_now==NO)return(result_now);
temp_data=addr_op;//操作单元地址低8位
result_now=IicSendByteService(temp_data);
if(result_now==NO)return(result_now);
temp_data=data_op;//操作数据
result_now=IicSendByteService(temp_data);
if(result_now==NO)return(result_now);
IicStopBitSend();//停止条件
IicDelayService(IIC_DEL_WRITE);
result_now=YES;
return(result_now);
}

uncharSeqReadFrom24c256(uncharsla_add,unintaddr_op,uncharread_size,unchar*read_buf)
{//addr“rollover”duringread:fromlastbyteofthelastpage,tothefirstbyteofthefirstpage
uncharresult_now,temp_data,read_count;
IicStartBitSend();//起始条件
temp_data=sla_add;//从器件地址
result_now=IicSendByteService(temp_data);
if(result_now==NO)return(result_now);
temp_data=addr_op>>8;//操作单元地址高8位
result_now=IicSendByteService(temp_data);
if(result_now==NO)return(result_now);
temp_data=addr_op;//操作单元地址低8位
result_now=IicSendByteService(temp_data);
if(result_now==NO)return(result_now);
IicStartBitSend();
temp_data=sla_add+1;//读操作
result_now=IicSendByteService(temp_data);
if(result_now==NO)return(result_now);
for(read_count=0;read_count{//连续读数据
*(read_buf+read_count)=IicAccByteService();
IicAckService(NO);
}
*(read_buf+read_count)=IicAccByteService();
IicAckService(YES);
IicStopBitSend();
result_now=YES;
return(result_now);
}

uncharWritePageTo24c256(uncharsla_add,unintaddr_op,unchar*write_data_buf)
{//页写
uncharcount,result_now,temp_data;
IicStartBitSend();//起始条件
temp_data=sla_add;//从器件地址
result_now=IicSendByteService(temp_data);
if(result_now==NO)return(result_now);
temp_data=addr_op>>8;//操作单元地址高8位
result_now=IicSendByteService(temp_data);
if(result_now==NO)return(result_now);
temp_data=addr_op;//操作单元地址低8位
result_now=IicSendByteService(temp_data);
if(result_now==NO)return(result_now);
for(count=0;count{//连续写
temp_data=*(write_data_buf+count);
result_now=IicSendByteService(temp_data);
if(result_now==NO)return(result_now);
}
IicStopBitSend();//停止条件
IicDelayService(IIC_DEL_WRITE);
result_now=YES;
return(result_now);
}

uncharSeqWriteTo24c256ByPage(uncharsla_add,unintaddr_op,uncharwrite_size,unchar*write_buf)
{//addr“rollover”duringwrite:fromlastbyteofthecurrentpagetofirstbyteofthesamepage.
unintpage_write,read_addr,temp_op_int;
unchardata_count,result_out,modify_count,count,write_data_buf[PAGE_CAP_BYTE];
result_out=YES;
data_count=0;
while(write_size>0)
{
page_write=addr_op/PAGE_CAP_BYTE;//得到当前页
read_addr=page_write*PAGE_CAP_BYTE;
SeqReadFrom24c256(sla_add,read_addr,PAGE_CAP_BYTE,write_data_buf);
temp_op_int=addr_op&(PAGE_CAP_BYTE-1);//得到在页内的起始字节地址
if(temp_op_int+write_size>=PAGE_CAP_BYTE)
{
modify_count=PAGE_CAP_BYTE;
addr_op=(page_write+1)*PAGE_CAP_BYTE;//写下一页的起始地址
}
else
modify_count=write_size;
count=temp_op_int;
write_size=write_size-modify_count+count;//写下一页的数据量
for(;countwrite_data_buf[count]=*(write_buf+data_count);
result_out=WritePageTo24c256(sla_add,read_addr,write_data_buf);
}
return(result_out);
}

uncharSeqWriteTo24c256(uncharsla_add,unintaddr_op,uncharwrite_size,unchar*write_buf)
{//连续写(非页写)
uncharwrite_result;
if(write_size<3)
{//如果要写入的数据小于3个,则用随机写实现
write_result=RandWriteByteTo24c256(sla_add,addr_op,*write_buf);
write_result=RandWriteByteTo24c256(sla_add,addr_op+1,*(write_buf+1));
}
else
write_result=SeqWriteTo24c256ByPage(sla_add,addr_op,write_size,write_buf);
return(write_result);
}

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

Sept. 8, 2025 ---- 根据TrendForce集邦咨询最新调查,2025年第二季NVIDIA(英伟达) Blackwell平台规模化出货,以及北美CSP业者持续扩大布局General Server(通用型...

关键字: SSD DDR4 服务器

Sept. 4, 2025 ---- Apple(苹果)即将发布iPhone 17、iPhone 17 Air(暂名)、iPhone 17 Pro及Pro Max四款旗舰新机,除了外观辨识度升级,处理器性能、散热和拍摄功...

关键字: iPhone 16 A19处理器 折叠机

Sept. 3, 2025 ---- 根据TrendForce集邦咨询最新发布的《2025近眼显示市场趋势与技术分析》报告,2025年随着国际品牌陆续推出AR眼镜原型,以及Meta预计在近期发布AR眼镜Celeste,市...

关键字: AR眼镜 OLED

Sept. 2, 2025 ---- TrendForce集邦咨询表示,2025年第二季DRAM产业因一般型DRAM (Conventional DRAM)合约价上涨、出货量显著增长,加上HBM出货规模扩张,整体营收为3...

关键字: DRAM 智能手机 ASP

Sept. 1, 2025 ---- 根据TrendForce集邦咨询最新调查,2025年第二季因中国市场消费补贴引发的提前备货效应,以及下半年智能手机、笔电/PC、Server新品所需带动,整体晶圆代工产能利用率与出货...

关键字: 晶圆代工 智能手机 笔电

Aug. 28, 2025 ---- 根据TrendForce集邦咨询最新调查,2025年第二季NAND Flash产业虽面临平均销售价格(ASP)小幅下滑,所幸原厂减产策略缓解供需失衡,叠加中、美两大市场政策推动,整体...

关键字: NAND Flash SSD AI

Aug. 26, 2025 ---- NVIDIA(英伟达)近日推出的Jetson Thor被视为机器人的物理智慧核心,以Blackwell GPU、128 GB记忆体堆叠出2070 FP4 TFLOPS AI算力,是前...

关键字: 机器人 大型语言模型 AI算力

Aug. 21, 2025 ---- 根据TrendForce集邦咨询最新液冷产业研究,随着NVIDIA GB200 NVL72机柜式服务器于2025年放量出货,云端业者加速升级AI数据中心架构,促使液冷技术从早期试点迈...

关键字: AI 数据中心 服务器

除了充电电路外,锂电池的放电过程也需要保护。锂电池的放电电压不能低于3.0V,否则电池寿命会大幅缩短。为了实现这一保护,工程师们设计了DW01芯片与8205 MOS管的电路组合。DW01芯片能够监控锂电池的放电电压和电流...

关键字: 锂电池 电池

在PCB设计的宏伟蓝图中,布局与布线规则犹如精密乐章中的指挥棒,是铸就电路板卓越性能、坚不可摧的可靠性及经济高效的制造成本的灵魂所在。恰如一位巧手的园艺师,合理的布局艺术性地编排着每一寸空间,既削减了布线交织的繁复迷宫,...

关键字: PCB 电路板
关闭