Hi Rod Boyce,
Thank you very much for your effort and the careful testing.
Sorry for my later reply, because a lot of cases need to do the test in the queue.
Today, I have test the doc description, with the same point :

For meet the big enough demand, I define the code like this in the codebundle IAP example, mainly test ErasePage API:
int ErasePage_KERRY (uint32_t adr)
{
uint32_t n;
uint32_t buf[ 10 ];
n = GetSecNum(adr);
buf[0] = IAP_PREPARE;
buf[1] = n;
buf[2] = n;
buf[3] = 0;
buf[4] = 0;
buf[5] = 0;
buf[6] = 0;
buf[7] = 0;
buf[8] = 0;
buf[9] = 0;
IAP_Call (buf, buf);
if(buf[5]) return (buf[5]);
IAP.cmd = IAP_PREPARE;
IAP.par[0] = n;
IAP.par[1] = n;
IAP_Call (&IAP.cmd, &IAP.stat);
if (IAP.stat) return (IAP.stat);
n = adr >> 6;
IAP.cmd = IAP_ERASE_PAGE;
IAP.par[0] = n;
IAP.par[1] = n;
IAP_Call (&IAP.cmd, &IAP.stat);
if (IAP.stat) return (IAP.stat);
return (0);
}
Then the test result like this:
1. before call the IAP_Call(buf,buf), with the same point:

2. after call the IAP_Call(buf,buf), with the same pointer:

The returned value is wrong, I think this 0x01 should be the status, although I judge buf[5].
Then Run the code with different pointer:

So, the result just like what you have side, it should be the doc problem,it can't use the same pointer.
I think that's why official code also use different pointer.
Don't worry, I will report it to our according department, they help to update the doc in the next version.
Thank you and Werner Fritsch, they help us make the doc better! 
Have a great day,
Kerry
-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------