Own Programmer using COM

Questions about programming (not codeing) PSoCs and Encore II as well as freeware programming hardware and software are discussed here. This is also the place to talk about production programming. Programming means loading a HEX file in to the Flash, not, writing your program.

Moderator: ericb

Own Programmer using COM

Postby Borstenhorst » Thu Mar 28, 2013 3:25 pm

Hey there
Im currently trying to build my own PSoC Programmer.

Im Using the PP_ComLib_Wrapper.

I can read the ports, Power the Device, Get the programmer capabilities and everything was fine.
But i am not able to programm a hexfile into the flash. It stops around EraseAll();
Unfortunately there are no errors thrown by the Programmer, it gives back a error string but it is null.

Its based on the example from cypress. No elementary changes are made.

So my Question is if any of you has got a working version of a own programmer?

This is my code, the port is already opened before I am calling this:
Code: Select all
        public void burn()
        {
            Busy = true;
            Parent.AddEvent(0, "Programmer", "Burn", "Started Burning", false);

            string strError;
            if (pp.SetProtocol(SelectedProtocoll, out strError) == 0)
            {
                if (pp.SetPowerVoltage(SelectedVoltage, out strError) == 0)
                {
                    int hexImageSize;
                    if (pp.ReadHexFile(SelectedHexFile, out hexImageSize, out strError) == 0)
                    {
                        pp.SetAcquireMode(SelectedAcquiremode, out strError);

                            if (pp.Acquire(out strError) == 0)
                            {
                                    //Typo from Cypress
                                    pp.Clibrate(1, out strError);
 
                                        int Banks, BlocksPerBank, BlockSize;
                                        pp.GetFlashCharacteristics(out BlockSize, out Banks, out BlocksPerBank, out strError);
                                       
                                            int flashImageSize = Banks * BlocksPerBank * BlockSize;
                                            if (hexImageSize <= flashImageSize)
                                            {
                                                pp.EraseAll(out strError);
                                               

                                                    if (ProgramOnly(hexImageSize) == 0)
                                                    {
                                                        bool verficitiondone = true;
                                                        if (Verification)
                                                        {
                                                            if (VerifyOnly(hexImageSize) == 0)
                                                            {
                                                                verficitiondone = false;
                                                            }
                                                            else
                                                            {
                                                                verficitiondone = false;
                                                                Parent.AddEvent(2, "Programmer", "Burn", "Block Not Verified", true);
                                                            }
                                                        }

                                                        if (verficitiondone)
                                                        {
                                                            if (pp.ProtectAll(out strError) == 0)
                                                            {
                                                                if (pp.VerifyProtect(out strError) == 0)
                                                                {
                                                                    ushort flashCS = 1, hexCS = 2;
                                                                    pp.CheckSum(0, out flashCS, out strError);
                                                                    pp.ReadHexChecksum(out hexCS, out strError);
                                                                    if (flashCS != hexCS)
                                                                    {
                                                                        strError = "Mismatch of Checksum";
                                                                        Parent.AddEvent(2, "Programmer", "Burn", strError, true);
                                                                    }
                                                                    else
                                                                        if (pp.ReleaseChip(out strError) != 0)
                                                                            Parent.AddEvent(2, "Programmer", "Burn", strError, true);

                                                                }
                                                                else
                                                                    Parent.AddEvent(2, "Programmer", "Burn", strError, true);
                                                            }
                                                            else
                                                                Parent.AddEvent(2, "Programmer", "Burn", strError, true);
                                                        }
                                                        else
                                                        {
                                                            Parent.AddEvent(2, "Programmer", "Burn", "Could not Verify, abort", true);
                                                        }
                                                    }
                                                    else
                                                        Parent.AddEvent(2, "Programmer", "Burn", "Could not write Blocks to chip", true);
                                     
                                            }
                                            else
                                                Parent.AddEvent(2, "Programmer", "Burn", "Hex File Size is bigger than Device's Flash Size", true);                               
                                }
                                else
                                    Parent.AddEvent(2, "Programmer", "Burn", strError, true);
                            }
                            else
                                Parent.AddEvent(2, "Programmer", "Burn", strError, true);
                        }
                        else
                            Parent.AddEvent(2, "Programmer", "Burn", strError, true);
                    }
                    else
                        Parent.AddEvent(2, "Programmer", "Burn", strError, true);

           


            Busy = false;
        }

        private int ProgramOnly(int hexImageSize)
        {
            string strError;
            int Banks, BlocksPerBank, BlockSize;
            pp.GetFlashCharacteristics(out BlockSize, out Banks, out BlocksPerBank, out strError);
            int hr = -1;
            int hexBlockID = 0;
            int totalHexBlocks = hexImageSize / BlockSize;
            bool fDone = false;
            for (int bank = 0; bank < Banks; bank++)
            {
                pp.SetBank(bank, out strError);
                for (int block = 0; block < BlocksPerBank; block++)
                {
                    int sscResult;
                    if (pp.WriteBlockFromHex(hexBlockID, block, out sscResult, out strError) != 0)
                    {
                        Parent.AddEvent(2, "Programmer", "Burn", strError, true);
                        return -1;
                    }

                    hexBlockID++;
                    if (hexBlockID >= totalHexBlocks) { fDone = true; break; }
                }
                if (fDone) break;
            }
            return hr;
        }

        private int VerifyOnly(int hexImageSize)
        {
            string strError;
            int Banks, BlocksPerBank, BlockSize;
            pp.GetFlashCharacteristics(out BlockSize, out Banks, out BlocksPerBank, out strError);
            int hr = -1;
            int totalHexBlocks = hexImageSize / BlockSize;
            for (int i = 0; i<totalHexBlocks; i++)
            {
                int verResult;
                if (pp.VerifyBlockFromHex(i, out verResult, out strError) != 0)
                {
                    Parent.AddEvent(2, "Programmer", "Burn", strError, true);
                    return hr;
                }
               
                if (verResult == 0) return hr; //Block Not Verified
            }
            return hr;
        }
Borstenhorst
Bite-Size Cheese
Bite-Size Cheese
 
Posts: 13
Joined: Fri Oct 19, 2012 8:24 am

Re: Own Programmer using COM

Postby Borstenhorst » Thu Mar 28, 2013 5:24 pm

I made it :)

I dont know exactly what it is but I think its a bug with the return value of WriteBlockFromHex

Anyway. Here is the jet very chaotic code. But hey, it works ;)
Code: Select all
  public void burn()
        {

            Busy = true;
            string strError;

            if (!Powered)
                pp.PowerOn(out strError);


            int hexImageSize;
            pp.SetProtocol(SelectedProtocoll, out strError);
            pp.SetPowerVoltage(SelectedVoltage, out strError);
            pp.ReadHexFile(SelectedHexFile, out hexImageSize, out strError);
            pp.SetAcquireMode(SelectedAcquiremode, out strError);
            pp.Acquire(out strError);
            pp.Clibrate(1, out strError);
            pp.EraseAll(out strError);
            ProgramOnly(hexImageSize);

            if(Verification)
            VerifyOnly(hexImageSize);

            pp.ProtectAll(out strError);
            pp.VerifyProtect(out strError);
            pp.ReleaseChip(out strError);
            Busy = false;
            if (Powered)
                PowerOn();
            else
                PowerOff();

}

private int ProgramOnly(int hexImageSize)
        {
            string strError;
            int Banks, BlocksPerBank, BlockSize;
            pp.GetFlashCharacteristics(out BlockSize, out Banks, out BlocksPerBank, out strError);
            int hr = -1;
            int hexBlockID = 0;
            int totalHexBlocks = hexImageSize / BlockSize;
            bool fDone = false;
            for (int bank = 0; bank < Banks; bank++)
            {
                pp.SetBank(bank, out strError);
                for (int block = 0; block < BlocksPerBank; block++)
                {
                    int sscResult;
                    if (pp.WriteBlockFromHex(hexBlockID, block, out sscResult, out strError) != 0)
                    {
                        //Parent.AddEvent(2, "Programmer", "Burn", strError, true);
                        //return -1;
                    }

                    hexBlockID++;
                    if (hexBlockID >= totalHexBlocks) { fDone = true; break; }
                }
                if (fDone) break;
            }
            return hr;
        }

        private int VerifyOnly(int hexImageSize)
        {
            string strError;
            int Banks, BlocksPerBank, BlockSize;
            pp.GetFlashCharacteristics(out BlockSize, out Banks, out BlocksPerBank, out strError);
            int hr = -1;
            int totalHexBlocks = hexImageSize / BlockSize;
            for (int i = 0; i<totalHexBlocks; i++)
            {
                int verResult;
                if (pp.VerifyBlockFromHex(i, out verResult, out strError) != 0)
                {
                    //Parent.AddEvent(2, "Programmer", "Burn", strError, true);
                    return hr;
                }
               
                if (verResult == 0) return hr; //Block Not Verified
            }
            return hr;
        }
Borstenhorst
Bite-Size Cheese
Bite-Size Cheese
 
Posts: 13
Joined: Fri Oct 19, 2012 8:24 am


Return to “%s” Device Programmers

Who is online

Users browsing this forum: No registered users and 1 guest