|
楼主 |
发表于 2009-9-13 17:35:23
|
显示全部楼层
【9楼】 cyxavr 又一天
1.请问您知道您的MPC82G516A的IAP空间的大小吗?
本通讯协议要求:(请参见楼主位第0步的截图==0.8051 Writer U1 下载HEX成功==)
A.1K ISP代码空间
B.32K IAP代码空间
2.请问是写入初期就出错了对吗?
如果是,那说明前期的固定通讯协议就没有通过.这个现象,最有可能的就是您的IAP空间大小不对.导致程序初始化过程无法进行.
请参阅 main.c 中以下代码:
PLCType=IAPFlashReadMode(PLCTypeAddr); // 上电,核实 PLC 硬件版本号
if(PLCType!=0) // 第一次使用. IAP -- "FX1N PLC\r\n".
{
for(i=0;i<MCUIAPFLASHSIZE*1024;i+=512) // 全部擦除
{
IAPFlashErasureMode(PLCIAPCODEAddr+i);
}
for(i=0;i<8000*4;i++)
{
IAPFlashProgremMode(PLCIAPCODEAddr+i,0x46);
}
IAPFlashProgremMode(PLCTypeAddr,0);
WriteFlash(PLCIAPCODEAddr,(unsigned char *)(OrderSend4+1),92);
WriteFlash(PLCTypeAddr+1,(unsigned char *)PLCTypeArray,PLCTypeArrayLen);
WriteFlash(PLCIAPCODEAddr+32200,(unsigned char *)(OrderSend3+1),92);
WriteFlash(PLCIAPCODEAddr+32300,(unsigned char *)(OrderSend4+1),92);
UartSendString(ArrFirstused);
}
else UartSendString(ArrPass);
如果IAP空间不对的话,整个初始化会受影响.不会通过的.会死在IAP.C中,具体参阅以下代码:
void IAPFlashProgremMode(unsigned int codeaddr,unsigned char ucdata) // 编程模式
{
unsigned char checkdata=0;
unsigned char retry=0;
unsigned int i=0;
unsigned int tempaddr=0;
unsigned char pbuf[512];
do
{
IAPFlashProgrem(codeaddr,ucdata);
if(++retry>2) // 2次尝试机会
{
tempaddr=codeaddr-codeaddr%512; // 计算当前页首地址
for(i=0;i<512;i++)
{
pbuf=IAPFlashReadMode(tempaddr+i); // 读出当前页所有数据,备份
}
IAPFlashErasureMode(tempaddr); // 擦除当前页
for(i=0;i<512;i++) // 将备份写回
{
if(i==(codeaddr%512))IAPFlashProgrem(codeaddr,ucdata);
else IAPFlashProgrem(tempaddr+i,pbuf);
}
}
checkdata=IAPFlashReadMode(codeaddr);
if(retry==5)====================================****这里****====================================
{
while(1) // 出错了,不写了,显示写错误的地址,请核对是否超出IAP空间大小
{
Value=codeaddr;
Out_EY_BIT();
}
}
}while(checkdata!=ucdata);
}
在if(retry==5)的时候,出错了,不写了,显示写错误的地址,请核对是否超出IAP空间大小.如果您用的是简易型PLC,请连接上显示板,看看地址是在什么位置.如果现实的是0x7C00地址.那么表明ISP与IAP空间标定大小不正确.需用8051 Writer U1经行调整. |
|