stc单片机的eeprom写数组,如写入ABCD在2e00和2e01,读出是2e00和2e01地址数据是CDCD
请帮忙看下程序,谢谢:voidByte_Program(INT16Uadd,INT8UArray[],INT8Un,INT8Um,INT8Ucounter){INT8Ui...
请帮忙看下程序,谢谢:
void Byte_Program(INT16U add,INT8U Array[],INT8U n,INT8U m,INT8U counter)
{ INT8U i,j, Protect_Array[16];
for(i=0;i<16;i++)
{
IAP_DATA = 0x00;
IAP_CONTR = ENABLE_ISP; //打开IAP 功能, 设置Flash 操作等待时间
IAP_CMD = READ_Command; //IAP/ISP/EEPROM 字节读命令
IAP_ADDRH = ((0x2E00+i)>>8); //设置目标单元地址的高8 位地址
IAP_ADDRL = (0x2E00+i)&0xff; //设置目标单元地址的低8 位地址
IAP_TRIG = 0x46; //先送 46h,再送b9h 到ISP/IAP 触发寄存器,每次都需如此
IAP_TRIG = 0xB9; //送完b9h 后,ISP/IAP 命令立即被触发起动
_nop_();
Protect_Array[i]=IAP_DATA;
}
IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
Sector_Erase(add);
for(i=n;i<=m;i++)
{
for(j=0;j<=counter;j++)
{
Protect_Array[i]=Array[j];
}
}
IAP_CONTR = ENABLE_ISP; //打开 IAP 功能, 设置Flash 操作等待时间
IAP_CMD = PROGRAM_Command; //IAP/ISP/EEPROM 字节编程命令
for(i=0;i<16;i++)
{
IAP_ADDRH = ((0x2E00+i)>>8); //设置目标单元地址的高8 位地址
IAP_ADDRL = (0x2E00+i)&0xff; //设置目标单元地址的低8 位地址
IAP_DATA = Protect_Array[i]; //要编程的数据先送进IAP_DATA 寄存器
IAP_TRIG = 0x46; //先送 46h,再送b9h 到ISP/IAP 触发寄存器,每次都需如此
IAP_TRIG = 0xB9; //送完b9h 后,ISP/IAP 命令立即被触发起动
_nop_();
}
IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
}
已经知道问题所在了,那个赋值的for嵌套出问题了,思路不对。感谢回答。 展开
void Byte_Program(INT16U add,INT8U Array[],INT8U n,INT8U m,INT8U counter)
{ INT8U i,j, Protect_Array[16];
for(i=0;i<16;i++)
{
IAP_DATA = 0x00;
IAP_CONTR = ENABLE_ISP; //打开IAP 功能, 设置Flash 操作等待时间
IAP_CMD = READ_Command; //IAP/ISP/EEPROM 字节读命令
IAP_ADDRH = ((0x2E00+i)>>8); //设置目标单元地址的高8 位地址
IAP_ADDRL = (0x2E00+i)&0xff; //设置目标单元地址的低8 位地址
IAP_TRIG = 0x46; //先送 46h,再送b9h 到ISP/IAP 触发寄存器,每次都需如此
IAP_TRIG = 0xB9; //送完b9h 后,ISP/IAP 命令立即被触发起动
_nop_();
Protect_Array[i]=IAP_DATA;
}
IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
Sector_Erase(add);
for(i=n;i<=m;i++)
{
for(j=0;j<=counter;j++)
{
Protect_Array[i]=Array[j];
}
}
IAP_CONTR = ENABLE_ISP; //打开 IAP 功能, 设置Flash 操作等待时间
IAP_CMD = PROGRAM_Command; //IAP/ISP/EEPROM 字节编程命令
for(i=0;i<16;i++)
{
IAP_ADDRH = ((0x2E00+i)>>8); //设置目标单元地址的高8 位地址
IAP_ADDRL = (0x2E00+i)&0xff; //设置目标单元地址的低8 位地址
IAP_DATA = Protect_Array[i]; //要编程的数据先送进IAP_DATA 寄存器
IAP_TRIG = 0x46; //先送 46h,再送b9h 到ISP/IAP 触发寄存器,每次都需如此
IAP_TRIG = 0xB9; //送完b9h 后,ISP/IAP 命令立即被触发起动
_nop_();
}
IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
}
已经知道问题所在了,那个赋值的for嵌套出问题了,思路不对。感谢回答。 展开
1个回答
展开全部
你搞的什么乱七八糟~~看的迷迷糊糊地~~给你一个我写的。
要注意,一次写一个,不然就出错。读可以批量,写就只能一次一个。
void isp_disable() // 关闭 ISP
{
ISP_CONTR = 0x00; //
ISP_ADDRL = 0x00;
ISP_ADDRH = 0x00;
ISP_CMD = 0x00;
ISP_TRIG = 0x00;
}
//------------
void read_eprom(uint address) // 读EPROM
{
uchar i_data;
ISP_CONTR = 0x83;
ISP_ADDRL = address;
address >>= 8;
ISP_ADDRH = address;
ISP_CMD = 0x01;
ISP_TRIG = 0x46;
ISP_TRIG = 0xb9;
/**/
i_data = ISP_DATA ;
isp_disable();
return(i_data);
}
//------------
void write_eprom(uint address,uchar write_data)
{
ISP_DATA = write_data ;
ISP_CONTR = 0x83; //
ISP_ADDRL = address ;
ISP_ADDRH = address>>8;
ISP_CMD = 0x02;
ISP_TRIG = 0x46;
ISP_TRIG = 0xb9;
/**/
isp_disable();
}
//------------
void clr_eprom (uint address) //扇区擦除。
{
ISP_CONTR = 0x83; //
ISP_ADDRL = address ;
ISP_ADDRH = address>>8 ;
ISP_CMD = 0x03;
ISP_TRIG = 0x46;
ISP_TRIG = 0xb9;
/**/
isp_disable();
}
要注意,一次写一个,不然就出错。读可以批量,写就只能一次一个。
void isp_disable() // 关闭 ISP
{
ISP_CONTR = 0x00; //
ISP_ADDRL = 0x00;
ISP_ADDRH = 0x00;
ISP_CMD = 0x00;
ISP_TRIG = 0x00;
}
//------------
void read_eprom(uint address) // 读EPROM
{
uchar i_data;
ISP_CONTR = 0x83;
ISP_ADDRL = address;
address >>= 8;
ISP_ADDRH = address;
ISP_CMD = 0x01;
ISP_TRIG = 0x46;
ISP_TRIG = 0xb9;
/**/
i_data = ISP_DATA ;
isp_disable();
return(i_data);
}
//------------
void write_eprom(uint address,uchar write_data)
{
ISP_DATA = write_data ;
ISP_CONTR = 0x83; //
ISP_ADDRL = address ;
ISP_ADDRH = address>>8;
ISP_CMD = 0x02;
ISP_TRIG = 0x46;
ISP_TRIG = 0xb9;
/**/
isp_disable();
}
//------------
void clr_eprom (uint address) //扇区擦除。
{
ISP_CONTR = 0x83; //
ISP_ADDRL = address ;
ISP_ADDRH = address>>8 ;
ISP_CMD = 0x03;
ISP_TRIG = 0x46;
ISP_TRIG = 0xb9;
/**/
isp_disable();
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询