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.

6455 i2c slave boot mode

采用i2c salve boot模式启动,数据发送成功,但依然无法启动

我的boot table是有i2cAsmTest.out通过hex6x.exe转换来的,转换的cmd如下:
i2cAsmTest.out
-boot
-a
-e _c_int00
-order L
-memwidth32
-romwidth32
-o ledtest.btbl
然后把这个btbl文件放在0x00,0x06,0x00,0x00,0x00,0x01后发送给dsp,请问这个btbl文件有问题吗?
另外dsp接受后是不是把boot table数据存到0x800000地址中

  • 我用arm做主,往dsp发boot table,arm的i2c 时钟为100k,i2c slave 地址为0x04,
    先发了六个字节0x00,0x06,0x00,0x00,0x00,0x01,延时1s,发boot table(每次发32byte),
    先前写过一个dsp slave的接受代码,抓到接受到的数据和转换后的btbl文件是一致的。
    请问上述过程问题在哪里?请各位大神帮忙看看
  • DSP接收数据后是根据boot table里的段地址信息把数据搬到目的地址中。

    可以按照前面的帖子里用仿真器跟踪bootloader的方法,看一下从ARM端接收的boot table有没有正确的搬移到RAM,如果搬移到片外DDR2,需要写二次bootloader先初始化DDR2. 如果正确搬移了,再看看是不是GEL文件里的初始化设置没有搬到代码里引起代码执行失败。
  • 您好!

    请问我上面生成的boot table正确吗?是否需要转换为.btbl.i2c?

  • 用仿真器后,出现NO source available for "0x100000"

    001014aa: 0C6E NOP 1
    001014ac: EC01 ADD.L2 B0,-1,B0
    001014ae: 016B [ B0] BNOP.S2 0x1014AA (PC+10 = 0x001014aa),0
    001014b0: 8C6E NOP 5
    单步运行一直在这几行循环
  • 我的btbl文件只有4kb,没有二次bootloader,cmd文件如下:
    MEMORY
    {
    L2RAM: o = 0x00800000 l = 0x00200000 /* 2MB L2 Internal SRAM */
    L1PRAM: o = 0x00E00000 l = 0x00008000 /* 32kB L1 Program SRAM/CACHE */
    L1DRAM: o = 0x00F00000 l = 0x00008000 /* 32kB L1 Data SRAM/CACHE */
    EMIFA_CE2: o = 0xA0000000 l = 0x00800000 /* 8MB EMIFA CE2 */
    EMIFA_CE3: o = 0xB0000000 l = 0x00800000 /* 8MB EMIFA CE2 */
    EMIFA_CE4: o = 0xC0000000 l = 0x00800000 /* 8MB EMIFA CE2 */
    EMIFA_CE5: o = 0xD0000000 l = 0x00800000 /* 8MB EMIFA CE2 */
    DDR2_CE0: o = 0xE0000000 l = 0x20000000 /* 512MB EMIFB CE0 */
    }

    SECTIONS
    {
    .text > L2RAM
    .stack > L2RAM
    .bss > L2RAM
    .cio > L2RAM
    .const > L2RAM
    .data > L2RAM
    .switch > L2RAM
    .sysmem > L2RAM
    .far > L2RAM
    .args > L2RAM
    .ppinfo > L2RAM
    .ppdata > L2RAM

    /* COFF sections */
    .pinit > L2RAM
    .cinit > L2RAM

    /* EABI sections */
    .binit > L2RAM
    .init_array > L2RAM
    .neardata > L2RAM
    .fardata > L2RAM
    .rodata > L2RAM
    .c6xabi.exidx > L2RAM
    .c6xabi.extab > L2RAM
    }
    是直接搬移到L2RAM中的
  • 001014aa这个地址是片上ROM地址,应该是在运行bootloader代码,可以研究一下代码,在I2C boot mode那块代码设个硬件断点,看能不能跳进去,再观察一下I2C的寄存器有没有收到数据。
  • 好的。我看过I2C那个0x02b04018寄存器,是收到数据的。另外我上面那样生成Boot table正确吗?
  • 然后把这个btbl文件放在0x00,0x06,0x00,0x00,0x00,0x01后发送给dsp,请问这个btbl文件有问题吗?

    我想你已经参考了文档spruec6g:

    另外,在host发送完数据后,连上仿真器看一下DSP的内存L2上的数据跟boot table里的数据是否一致,来确认是否真的成功发过去了。

    方便的话,把btbl文件及L2内存的CCS memory view截个屏看一下。

  • i2cAsmTest.out
    -boot
    -a
    -e _c_int00
    -order L
    -memwidth32
    -romwidth32
    -o ledtest.btbl

    所这个-a换成-b重新生成bin文件。

    你用的是ascii码,从host下发时,有先转换成二进制吗?

  • 我按照您的意见改成-b后,它只支持memwidth 8bit,所以我去掉了-memwidth32和-romwidth32,生成的.bin文件如下:

      

      

      

    重新发送后是上面这样的

  • #1. 根据boot table的定义:entry point为0x00800BA0, 第一个section的load address 0x00800800,length为0x00000460, 稍微对比了前面几个位置的内容是一致的。那么说明DSP 正确接收了I2C master发过来的数据并放到了对应的内存上了。

    #2. 有点问题,按照第一段的长度0x0460,在这个文件的0x0460处的数据是两个word的0,按照boot table的定义,这是文件结束的标志,那这后面的数是什么呢?

    #3.  上面memory的数据不是从CCS download .out文件后显示的吧。

    #4.这时,在CCS里将指针改为entry point:0x00800BA0,打开工程,load symbol, 先在main里打个定点,运行一下试试。 

    11.10.2 The Boot Table Format
    The boot table format is simple. There is a header record containing a 4-byte field that indicates where the
    boot loader should branch after it has completed copying data. After the header, each section that is to be
    included in the boot table will have the following:
    1. 4-byte field containing the size of the section
    2. 4-byte field containing the destination address for the copy
    3. The actual data to be copied

  • 改成-b后生成led.bin,后来我又修改了应用代码,生成新的led1.bin,但发送的还是旧的led.bin文件,但我连仿真器后发现0x800800地址的数据是新的led1.bin,是不是说明我的i2c发送失败了,host发送时地址0x04不要作为数据一起发送吧? 

  • 断下电再发送呗,以清掉memory原来的值。

    要不要发0x04不知道啊,按手册感觉要发,但想不出什么道理,没有实际用过这种boot模式。你可以不同的都试一下。

    我的思路是先验证host能不能发送数据给bootloader放到指令的内存上。 

  • 你好, 0x460的长度是值得.text段的长度吧,后面的是.cinit段的数据?
  • 好的,我来试试,谢谢
  • 0x460的长度是值得.text段的长度吧,

    应该是。可以看你的map文件进一步确定。

    后面的是.cinit段的数据?

    是什么段不是问题,关键这位置的值是0,而0代表文件结尾。那后面的数据就不会被boot了。

  • 尝试了几种方式,生成的.bin还是有多余的0,生成的map文件如下
    CONTENTS: 00000000..000004cb BOOT TABLE
    .text : btad=00000000 dest=00800800 size=00000480
    .cinit : btad=0000048c dest=00800c80 size=00000034
    是哪些原因可能导致这种情况呢?
  • qing zhang 说:
    .text : btad=00000000 dest=00800800 size=00000480
    .cinit : btad=0000048c dest=00800c80 size=00000034

    这个没有问题。

    第一段从00800800 + 0x480= 00800c80. 

    我前面搞错了,漏了三个word的文件头,以上面为例文件里0000048c的位置为00000034 00800c80 就是对的。所以bin文件夹的boot table没有问题。

    现面就看你能不能从host下载下去了。

  • 您好,还想再问你个问题, Bootloader从I2C ICDRR寄存器收到的数据存放在哪个地址了?我想用仿真器跟一下
  • 这是根据Boot table里的地址来的。