新手上路
- 积分
- 44
- 金钱
- 44
- 注册时间
- 2016-3-11
- 在线时间
- 11 小时
|
本帖最后由 260998842 于 2016-9-7 00:40 编辑
IIC写字节等应答之类的基本函数用的是原子哥的,看原子哥的历程的时候发现每写一个字节都要重新写器件地址和数据地址,最后在写数据,刚好最近用工作用到了AT24C02,Datasheet上说AT24C02支持页写和页读(8字节),于是乎就写了一个AT240C02连续写的函数,判断写的字节数超过8以后才进行换页重写器件地址和数据地址,测试了之后发现速度这样速度快了不少(0~255全部重新,速度大概快了几秒钟)。扯个题外话..工作用的是4位机..汇编.. 模拟IIC... 写完了以后整个人都不好了...还是喜欢C...
[mw_shl_code=cpp,true]#define Device_Address_Write 0xA0 //器件地址 A1 A2 A3均接地 末位0写
#define Device_Address_Read 0xA1 //器件地址 A1 A2 A3均接地 末位1读
//连续写AT24C02,一次最多8字节,此函仅供AT24C02_Write函数调用
//WriteAddress:起始地址
//Byte:要写入的字节(数组)
//ByteNumber:字节数
void AT24C02_Continuous_Write(u8 WriteAddress,u8 *Byte,u16 ByteNumber)
{
u8 i;
IIC_Start();
IIC_Send_Byte(Device_Address_Write); //器件地址0xA0(写)
IIC_Wait_Response();
IIC_Send_Byte(WriteAddress);; //数据地址
IIC_Wait_Response();
for(i=0;i<ByteNumber;i++)
{
IIC_Send_Byte(Byte); //一个字节
IIC_Wait_Response();
}
IIC_Stop();
delay_ms(6);
}
//在指定位置写入ByteNumber个字节
//WriteAddress:起始地址
//Byte:要写入的字节(数组)
//ByteNumber:字节数
void AT24C02_Write(u8 WriteAddress,u8 *Byte,u16 ByteNumber)
{
u8 PageRemain = 8-WriteAddress%8;
if(ByteNumber<=PageRemain) PageRemain = ByteNumber;
while(1)
{
AT24C02_Continuous_Write(WriteAddress,Byte,PageRemain);
if(PageRemain==ByteNumber) break;
else
{
WriteAddress+=PageRemain;
Byte+=PageRemain;
ByteNumber-=PageRemain;
if(ByteNumber<8) PageRemain = ByteNumber;
else PageRemain = 8;
}
}
}[/mw_shl_code]
怎么样,看起来是不是跟FLASH的历程很像..没错..我的灵感就是从FLASH的历程里面来的....
再来我要做伸手党了.. 求一个IIC的连续写函数..
照理来说.能连续写 自然能连续读
但是... 连续读的时候只能读到第一个字节
之后读出来的全部都是0x00
[mw_shl_code=cpp,true]//连续读AT24C02,一次最多8字节,次函仅供AT24C02_Read函数调用
//WriteAddress:起始地址
//Byte:读出的字节(数组)
//ByteNumber:字节数
void AT24C02_Continuous_Read(u8 WriteAddress,u8 *Byte,u8 ByteNumber)
{
u8 i;
IIC_Start();
IIC_Send_Byte(Device_Address_Write); //器件地址0xA0(写)
IIC_Wait_Response();
IIC_Send_Byte(WriteAddress);; //数据地址
IIC_Wait_Response();
IIC_Start(); //第二次起始信号
IIC_Send_Byte(Device_Address_Read); //器件地址0xA1(读)
IIC_Wait_Response();
for(i=0;i<ByteNumber;i++)
{
Byte = IIC_Read_Byte(1); //读一个字节 参数1应答
}
IIC_Stop();
}
//在指定位置读取ByteNumber个字节
//WriteAddress:起始地址
//Byte:读到的字节(数组)
//ByteNumber:字节数
void AT24C02_Read(u8 WriteAddress,u8 *Byte,u8 ByteNumber)
{
u8 PageRemain = 8-WriteAddress%8;
if(ByteNumber<=PageRemain) PageRemain = ByteNumber;
while(1)
{
AT24C02_Continuous_Read(WriteAddress,Byte,PageRemain);
if(PageRemain==ByteNumber) break;
else
{
WriteAddress+=PageRemain;
Byte+=PageRemain;
ByteNumber-=PageRemain;
if(ByteNumber<8) PageRemain = ByteNumber;
else PageRemain = 8;
}
}
}[/mw_shl_code]
我试过改过应答IIC_Read_Byte(1)和IIC_Read_Byte(0),甚至我就直接连着读了两个字节,结果都是这样,只能读到第一个字节,为什么不科学啊,我用汇编读AT24C02可以连续读8字节的
眼尖的帮忙看下哪里有问题? 还是说...不同厂商加工生产的AT24C02功能不一样的.....
|
|