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.
小弟是使用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地址逐一寫入,還是須要進行其他配置?
謝謝
楼主可能有误解,DSP的I2C Boot模式是指由其他上位机按照一定通讯协议通过I2C给DSP传输数据,DSP本身不会去读取外部EEPROM的。
典型的应用时芯片烧写设备通过DSP的Boot模式给芯片烧写程序。
具体BOOT的使用请楼主参考芯片手册关于BOOT ROM的描述。
非常感謝 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数组的大小。
我是按照固化在芯片内部速率来配置的,即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写数据没有成功