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.

關於28346的I2C Boot問題

Other Parts Discussed in Thread: CCSTUDIO

小弟是使用TI原廠的 Delfino C28346 DIM168 Experimenter's Kit 帶有XDS100仿真器,並按照下列步驟進行 I2C Boot (不過網路上相關資料實在太少了)

1.利用C:\CCStudio_v3.3\C2000\cgtools\bin目錄下的hex2000.exe將 *.out 檔轉成 *.a00檔

用以下指令

hex2000 project.out -boot -o project.a00 -i2c8 -i2cpsc 29 -i2cclkh 5 -i2cclkl 10 -a

(project.out 於連接XDS100仿真器時有成功運行過)

2.修改TI原廠的 i2c_eeprom 範例,將上述 project.a00 的數據從 0x0000 位址開始寫入板上外擴的EEPROM中,總共 5152 bytes,每寫入8 bytes,隨後都有讀取是否正確

(其實是將*.a00內的值宣告成陣列的方式寫入

Uint16 fp[]={

0xAA,0x08,0x1D,0x00,0x05,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0xD4,0xA6,........};

)

3.寫入完畢後斷電,將SW1的Jump扳為

I2C EEPROM Boot
GPIO-87: 1
GPIO-86: 1
GPIO-85: 0
GPIO-84: 0

4.上電

不過結果卻無法運行

請問有哪位大大有成功進行I2C Boot的,若要由I2C啟動運行程序的話,是直接將*.a00的資料由0x0000地址逐一寫入,還是須要進行其他配置?

謝謝

  • 用I2C写入的时候会不会存在问题?我之前用I2C页写的时候就是中间间断了,使得不能bootload。

  • 楼主可能有误解,DSP的I2C Boot模式是指由其他上位机按照一定通讯协议通过I2C给DSP传输数据,DSP本身不会去读取外部EEPROM的。

    典型的应用时芯片烧写设备通过DSP的Boot模式给芯片烧写程序。

    具体BOOT的使用请楼主参考芯片手册关于BOOT ROM的描述。

  • 我不赞同楼上的说法。TI测试版上I2C外扩了一块EEPROM,在以I2C BOOT的时候,是可以将存储于其中的程序上电自举的,并不需要其他的烧写设备。

  • 非常感謝 BIN YAO1 大大與 Terry Deng 大大的回覆

    關於頁寫部份,一開始使用每次寫入14 bytes的方式(不知為何若改為每次寫入16 bytes,程式就會在寫入的副程式中當住,FIFO深度應有16 bytes),在第一頁最後一次寫入時(位址 0x007E開始),因為超出每頁的128 bytes(其實當時不知道每頁的大小,因為第一次接觸EEPROM),所以第129個值就會比對錯誤,TI原廠範例中的FailCount就會檢測出來,(因為產生回捲??)

    最後改為每次寫入8 bytes的方式(128 bytes的因數,可以完整寫完每一頁),當程序完全寫入後,TI原廠範例中的PassCount與寫入的數量是相符合的,並且沒有FailCount,而且I2cMsgIn1.MemoryHighAddr、I2cMsgIn1.MemoryLowAddr、I2cMsgOut1.MemoryHighAddr、I2cMsgOut1.MemoryLowAddr寄存器也都符合設定值,所以照理來說應該沒有寫入錯誤的問題。

    另外剛才拜讀了 BIN YAO1 大大以前發布的文章,似乎您去年也曾經做過 I2C Boot 的相關測試,不知最後是否有成功運行呢,能否提供一下相關的經驗?

    小弟以前也曾使用過28035及28335,但因為速度的要求,所以才會一路換到28346。

    而之前因為核心內部含有Flash,所以要脫離仿真器運行,只要用CCS燒進Flash就好,不過CMD文件要換成Flash使用的,不知使用I2C Boot是否也要替換呢?以及小弟的步驟是否有問題?

    謝謝

  • for(;;)
       {  
        for (i=0;i<128;i++)
        {
         c=i+b*128;
         Data[i]=a[c];
        }
        if (b%2==0)
        {
         I2C_EEPROM_LOW_ADDR=0x00;
         write();
         DELAY_US(DELAY);
         b++;
         I2CA_Init();
        }
        else if (b%2==1)
        {
         I2C_EEPROM_LOW_ADDR=0x80;
         write();
         DELAY_US(DELAY);
         I2C_EEPROM_HIGH_ADDR++;
         b++;
         I2CA_Init();
        }
        if (c>7740)
        {
         pass();
        }

    void write(void)
    {
       I2caRegs.I2CSAR = I2C_SLAVE_ADDR;    //Set slave address
       I2caRegs.I2CCNT = I2C_NUMBYTES + 2;    //Set count to 5 characters plus 2 address bytes
       I2caRegs.I2CDXR = I2C_EEPROM_HIGH_ADDR;   //Send eeprom high address           
       I2caRegs.I2CMDR.bit.TRX = 1;     //Set to Transmit mode
       I2caRegs.I2CMDR.bit.MST = 1;     //Set to Master mode
       I2caRegs.I2CMDR.bit.FREE = 1;    //Run in FREE mode
       I2caRegs.I2CMDR.bit.STP = 1;     //Stop when internal counter becomes 0
       I2caRegs.I2CMDR.bit.STT = 1;     //Send the start bit, transmission will follow
       while(I2caRegs.I2CSTR.bit.XRDY == 0){};   //Do nothing till data is shifted out
       I2caRegs.I2CDXR = I2C_EEPROM_LOW_ADDR;     //Send eeprom low address
      
       for(i = 0; i < I2C_NUMBYTES; i++){
        while(I2caRegs.I2CSTR.bit.XRDY == 0){};  //Do nothing till data is shifted out
        I2caRegs.I2CDXR = Data[i];      //Send out the message
       }
    }

    void pass()
    {
        asm("   ESTOP0");
        for(;;);

    这是我从程序里提出来的,其中for循环式在主函数中执行的,a数组用于存放bootload的8位数据。判断进入pass函数的条件取决于a数组的大小。

  • 非常感謝 BIN YAO1 大大的回覆,小弟會試試看

    另外關於小弟將 *.out 檔轉為bootload數據的方式是否有誤呢?

    謝謝

  • 我是按照固化在芯片内部速率来配置的,即i2cclkh和i2cclkl都为54,而i2cpsc为0,拨码开关拨至0010。但是我试过即使配置为i2cpsc为1,拨码为1100也能自举。所以我现在对i2cpsc这个值还不能很清楚。我的command是:

    -a -boot -i2c8 -i2cpsc 0 -i2cclkh 54 -i2cclkl 54

    如果你是用CCSv4的话,在生成.out文件的同时,也可以直接生成.hex也就是你这里的.a00文件。

  • 非常感謝 BIN YAO1 大大的協助

    將command改成

    -a -boot -i2c8 -i2cpsc 1 -i2cclkh 54 -i2cclkl 54

    後,還是無法啟動,最後檢查電路才發現,原來原廠板子上的JUMP扳為ON是0,OFF才是1,扳成正確的1100後,已經可以正常由EEPROM啟動運行了,不須連接仿真器

    謝謝

  • 你好,我最近在做I2C eeprom自启动。我也是按照上边的步骤去做的 但是boot没有成功,请问TI原厂的例程里I2cMSg的数据定义都是Uint16,但是实际的高位地址和低位地址都是八位,这是为什么呢? 请多指教,这个地方没有搞懂,不知道是不是I2C写数据没有成功

  • 对于DSP而言,定义8位数据和定义16位的数据效果是一样的,都会表现为16位数据,因此定义Uint16是没有什么问题的。
    要想观察I2C写数据是否成功,可以将数据读回来,观察是否正确。
    在I2C写操作的时候,你是按照我上面那段程序进行写的吗?还是在TI例程的基础上修改的?在.out转换为.hex文件的时候,是否会有问题?

  • 但是I2C读写 是以八位数据位单位的,我按照你的程序进行写的 但是启动仍然没有成功。转化的过程也是按照这个帖子里的方法进行的,还望指点!

  • 写入之后,你是否将拨码开关拨至I2C引导的方式,请确认开关ON的方向

  • EEPROM烧录完毕后 我有将薄码开关调至I2C启动模式,但是还是未能启动成功.

    被烧录进EEPROM的源程序 在其被编译时  其工程里的cmd文件 是否可以是 DSP2834x_Header_nonBIOS.cmd? 还是必须得是DSP2834x_Header_BIOS.cmd?

    望指教~!

  • 我都是用DSP2834x_Header_nonBIOS.cmd的,没有出现这种问题。

    如果方便的话,你把.out文件发给我,我帮你转换完后发个.out文件你烧写试试。

    QQ:521169063