This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS320F28069M: Issue with Boot_loader example and running dfuprog.exe program on Windows10

Part Number: TMS320F28069M
Other Parts Discussed in Thread: C2000WARE

Hi, 

Recently I've been trying to upload my programs to my costume made board using "TMS320F28069UPNT" in order to make the product firmware updatable whenever there's a new version released at the customer side. I've checked successfully my USB hardware functionality with the  "usb_dev_serial" example and bunch of other examples to make sure the USB is functional and working fine. Then I tried to use the USB bootloader by reading "F2806x_USBBL_UG.pdf" and going to the steps mentioned in the document, according to this document I've flashed the "boot_loader" project from MWare in "C:\ti\c2000\C2000Ware_2_01_00_00\device_support\f2806x\MWare\boot_loader" to my microcontroller and installed the windows driver "boot_usb.inf" located in "C:\ti\c2000\C2000Ware_2_01_00_00\utilities\windows_drivers" which supposedly is the latest Windows driver for DFU porpuses.

Now in my windows device manager, I can clearly see the driver installed as below:

now when I try to use "dfuprog -e" command using the dfuprog program located at "C:\ti\c2000\C2000Ware_2_01_00_00\utilities\tools\f2806x\dfuprog\Release" I see: 


I understood this is a pretty common problem existing among C2000 users with windows as I saw in the forum after searching for almost 2 days. Based on the C2000 forum I also tried to do the followings:

1-deactivating windows 10 signature requirement

2- uninstall and install the windows drivers

3- using CONTROLSUIT version of dfuprog.exe

It worth mentioning, since in my device I use internal clock, I had to activate PPL2 clocking to USB and eliminating the TI sample code clock inside "ConfigureUSB(void)" function which is designed for those Launchpads equipped with external crystal as below ( I did the same for usb_dev_serial examples and so on to make them work )

void

ConfigureUSB(void)

{

    /*

    //

    // Enable the main oscillator.

    //

    EALLOW;

    SysCtrlRegs.CLKCTL.bit.XCLKINOFF = 1;

    SysCtrlRegs.CLKCTL.bit.XTALOSCOFF = 0;

    SysCtrlRegs.CLKCTL.bit.OSCCLKSRC2SEL = 0;

    SysCtrlRegs.CLKCTL.bit.OSCCLKSRCSEL = 1;

    

    //

    // DELAY_US while the main oscillator starts up.

    //

    DELAY_US(10);



    //

    // Set the crystal frequency, switch to the main oscillator, and enable the

    // PLL.

    //

    // Setup PLL for 80Mhz

    // Calculate the appropriate multiplier with the given crystal frequency

    //

    while(SysCtrlRegs.PLLSTS.bit.MCLKSTS);

    SysCtrlRegs.PLLSTS.bit.DIVSEL = 0;

    SysCtrlRegs.PLLSTS.bit.MCLKOFF = 1;

    SysCtrlRegs.PLLCR.bit.DIV = 80000000UL/CRYSTAL_FREQ;

    while(!SysCtrlRegs.PLLSTS.bit.PLLLOCKS);

    SysCtrlRegs.PLLSTS.bit.MCLKOFF = 1;

    SysCtrlRegs.PLLSTS.bit.DIVSEL = 3;



    //

    // DELAY_US while the PLL locks.

    //

    DELAY_US(10);



    //

    // Setup PLL2 for 60Mhz operation

    // Calculate the appropriate multiplier with the given crystal frequency

    //

    SysCtrlRegs.PLL2CTL.bit.PLL2CLKSRCSEL = 2;

    SysCtrlRegs.PLL2CTL.bit.PLL2EN = 1;

    SysCtrlRegs.PLL2MULT.bit.PLL2MULT = 120000000/CRYSTAL_FREQ;

    while(!SysCtrlRegs.PLL2STS.bit.PLL2LOCKS);

*/



    /**Added by me**/



    InitSysCtrl();



    // In this example:

    // PLL2 = INTOSC1 (10 Mhz) * 12 / 2 = 60 MHz

    // In general, for more accuracy, source PLL2 with a crystal or

    // external clock source.

    //

    //InitPll2(PLL2SRC_INTOSC1, 12, PLL2_SYSCLK2DIV2DIS);

    InitPll2(0, 12, 0);



    EALLOW;

    // Enable USB Clock

    //

    SysCtrlRegs.PCLKCR3.bit.USB0ENCLK = 1;



    // Enable PHY

    GpioCtrlRegs.GPACTRL2.bit.USB0IOEN = 1;



    EDIS;



    EALLOW; //only for boot_load code to follow the same order!!!!!

    /*****/



    InitPieCtrl();

    InitPieVectTable();

    EDIS;

    //

    // If the target device has a mux to allow selection of USB host or

    // device mode, make sure this is set to device mode.

    //

#ifdef USB_HAS_MUX

    SetUSBMux();

#endif



    //

    // Configure the USB interface and put the device on the bus.

    //

    ConfigureUSBInterface();

}

So as you might be understood by now I need :

1- To understand where's the problem? Is it the windows drivers? how can I mitigate them?
2- To know whether if there's any other way to update the firmware on C2000 microcontrollers with USB? ( preferably more stable methods)

Regards

My code composer version :  Version: 9.3.0.00012 

TMS320F28069UPNT

  • just an update, I've changed my code for ConfigureUSB(void) function just to make sure the exact method used by TI for boot_loader example used has been replicated with Internal Oscillator as below, still no success in dfuprog enumeration, but at least I would be more confident that the problem is not the source code (hopefully!). 

    void
    ConfigureUSB(void)
    {
        /* original TI code
        //
        // Enable the main oscillator.
        //
        EALLOW;
        SysCtrlRegs.CLKCTL.bit.XCLKINOFF = 1;
        SysCtrlRegs.CLKCTL.bit.XTALOSCOFF = 0;
        SysCtrlRegs.CLKCTL.bit.OSCCLKSRC2SEL = 0;
        SysCtrlRegs.CLKCTL.bit.OSCCLKSRCSEL = 1;
        
        //
        // DELAY_US while the main oscillator starts up.
        //
        DELAY_US(10);
    
        //
        // Set the crystal frequency, switch to the main oscillator, and enable the
        // PLL.
        //
        // Setup PLL for 80Mhz
        // Calculate the appropriate multiplier with the given crystal frequency
        //
        while(SysCtrlRegs.PLLSTS.bit.MCLKSTS);
        SysCtrlRegs.PLLSTS.bit.DIVSEL = 0;
        SysCtrlRegs.PLLSTS.bit.MCLKOFF = 1;
        SysCtrlRegs.PLLCR.bit.DIV = 80000000UL/CRYSTAL_FREQ;
        while(!SysCtrlRegs.PLLSTS.bit.PLLLOCKS);
        SysCtrlRegs.PLLSTS.bit.MCLKOFF = 1;
        SysCtrlRegs.PLLSTS.bit.DIVSEL = 3;
    
        //
        // DELAY_US while the PLL locks.
        //
        DELAY_US(10);
    
        //
        // Setup PLL2 for 60Mhz operation
        // Calculate the appropriate multiplier with the given crystal frequency
        //
        SysCtrlRegs.PLL2CTL.bit.PLL2CLKSRCSEL = 2;
        SysCtrlRegs.PLL2CTL.bit.PLL2EN = 1;
        SysCtrlRegs.PLL2MULT.bit.PLL2MULT = 120000000/CRYSTAL_FREQ;
        while(!SysCtrlRegs.PLL2STS.bit.PLL2LOCKS);
    */
    
        /**Added by me**/
    
       // InitSysCtrl();
    
        // IntOsc1Sel - This function switches to Internal Oscillator 1 and turns off
        // all other clock sources to minimize power consumption
        EALLOW;
        SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 0;
        SysCtrlRegs.CLKCTL.bit.OSCCLKSRCSEL=0;  // Clk Src = INTOSC1
        SysCtrlRegs.CLKCTL.bit.XCLKINOFF=1;     // Turn off XCLKIN
        SysCtrlRegs.CLKCTL.bit.XTALOSCOFF=1;    // Turn off XTALOSC
        SysCtrlRegs.CLKCTL.bit.INTOSC2OFF=1;    // Turn off INTOSC2
        //
        // DELAY_US while the main oscillator starts up.
        //
        DELAY_US(10);
    
        // Setup PLL for 90Mhz
        //
        while(SysCtrlRegs.PLLSTS.bit.MCLKSTS);
        SysCtrlRegs.PLLSTS.bit.DIVSEL = 0;
        SysCtrlRegs.PLLSTS.bit.MCLKOFF = 1;
        SysCtrlRegs.PLLCR.bit.DIV =18 ; //DSP28_PLLCR
        while(!SysCtrlRegs.PLLSTS.bit.PLLLOCKS);
        SysCtrlRegs.PLLSTS.bit.MCLKOFF = 1;
        SysCtrlRegs.PLLSTS.bit.DIVSEL = 2;
    
        // DELAY_US while the PLL locks.
        //
        DELAY_US(10);
    
        // Setup PLL2 for 60Mhz operation
        // Calculate the appropriate multiplier with the given crystal frequency
        // PLL2 = INTOSC1 (10 Mhz) * 12 / 2 = 60 MHz (using internal Clocking)
        // In general, for more accuracy, source PLL2 with a crystal or
        //
        SysCtrlRegs.PLL2CTL.bit.PLL2CLKSRCSEL = 0;
        SysCtrlRegs.PLL2CTL.bit.PLL2EN = 1;
        SysCtrlRegs.PLL2MULT.bit.PLL2MULT = 12;
        while(!SysCtrlRegs.PLL2STS.bit.PLL2LOCKS);
    
        /*****/
    
        InitPieCtrl();
        InitPieVectTable();
        EDIS;
        //
        // If the target device has a mux to allow selection of USB host or
        // device mode, make sure this is set to device mode.
        //
    #ifdef USB_HAS_MUX
        SetUSBMux();
    #endif
    
        //
        // Configure the USB interface and put the device on the bus.
        //
        ConfigureUSBInterface();
    }
    

  • Hi James,

    Looks like an issue with the Windows driver setting. Refer the following post and see if you are able to resolve it.

    Best Regards

    Siddharth