小弟是使用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地址逐一寫入,還是須要進行其他配置?
謝謝
BIN YAO1:
用I2C写入的时候会不会存在问题?我之前用I2C页写的时候就是中间间断了,使得不能bootload。
小弟是使用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地址逐一寫入,還是須要進行其他配置?
謝謝
Terry Deng:
楼主可能有误解,DSP的I2C Boot模式是指由其他上位机按照一定通讯协议通过I2C给DSP传输数据,DSP本身不会去读取外部EEPROM的。
典型的应用时芯片烧写设备通过DSP的Boot模式给芯片烧写程序。
具体BOOT的使用请楼主参考芯片手册关于BOOT ROM的描述。
小弟是使用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地址逐一寫入,還是須要進行其他配置?
謝謝
BIN YAO1:
回复 Terry Deng:
我不赞同楼上的说法。TI测试版上I2C外扩了一块EEPROM,在以I2C BOOT的时候,是可以将存储于其中的程序上电自举的,并不需要其他的烧写设备。
小弟是使用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地址逐一寫入,還是須要進行其他配置?
謝謝
Yung Sheng Lin:
回复 BIN YAO1:
非常感謝 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是否也要替換呢?以及小弟的步驟是否有問題?
謝謝
小弟是使用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地址逐一寫入,還是須要進行其他配置?
謝謝
BIN YAO1:
回复 Yung Sheng Lin:
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数组的大小。
小弟是使用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地址逐一寫入,還是須要進行其他配置?
謝謝
Yung Sheng Lin:
回复 BIN YAO1:
非常感謝 BIN YAO1 大大的回覆,小弟會試試看
另外關於小弟將 *.out 檔轉為bootload數據的方式是否有誤呢?
謝謝
小弟是使用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地址逐一寫入,還是須要進行其他配置?
謝謝
Yang Ji:
回复 Yung Sheng Lin:
你好,我最近在做I2C eeprom自启动。我也是按照上边的步骤去做的 但是boot没有成功,请问TI原厂的例程里I2cMSg的数据定义都是Uint16,但是实际的高位地址和低位地址都是八位,这是为什么呢? 请多指教,这个地方没有搞懂,不知道是不是I2C写数据没有成功
小弟是使用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地址逐一寫入,還是須要進行其他配置?
謝謝
BIN YAO1:
回复 Yang Ji:
对于DSP而言,定义8位数据和定义16位的数据效果是一样的,都会表现为16位数据,因此定义Uint16是没有什么问题的。要想观察I2C写数据是否成功,可以将数据读回来,观察是否正确。在I2C写操作的时候,你是按照我上面那段程序进行写的吗?还是在TI例程的基础上修改的?在.out转换为.hex文件的时候,是否会有问题?