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.

TMS320C28346外扩程序存储器加密方案

Other Parts Discussed in Thread: TMS320C28346

 

问题描述:

1、由于28346芯片不带片内FLASH,所以芯片上电后需要通过Boot ROM从片外的FLASH/EEPROM导入程序代码;

2、由于程序代码需要保存在片外的FLASH/EEPROM中,所以就必须考虑在外扩存储器中代码的安全,为此我参考了TI的文档《Programming External Nonvolatile Memory Using SDFlash for TMS320C28x Devices》、《TMS320x2834x Delfino Boot ROM Reference Guide》、《tms320c28346 data manual》,这些文档提供了如何实现外扩程序存储器的方案,但是关于代码安全只是在《tms320c28346 data manual》中提到说经过加密后28346片内的某些内存区域不可以通过外部方式访问。如下图所示。也没有提及如何保护外部存储器中代码的安全。
疑问:

1、对于TMS320C28346这款芯片,如何保证外扩程序存储器FLASH/EEPROM中代码的安全?

2、如果选用带加密的FLASH/EEPROM来存储程序(当然我现在还没有找到这种芯片),那么28346在上电load程序时,28346如何进行解密呢?

 

  • 1. 对于外扩芯片,很难实现加密。除非用单独的加密芯片。

    2. 如果用加密芯片,需要在BootLoader中进行解密。其实这也不是最安全的,因为BootLoader也是可能被绕过去的。

  • 如果无法对程序进行加密的话,那使用28346进行系统设计则会很不安全。

  • 其实C5000, C6000 只要是Flash不在片内的都存在相同的问题。

    如果希望选择片内Flash,可以考虑F28335.

  • 正是有些应用场合28335的150MHz主频不够,所以才考虑28346的,但是没想到会有这样的问题。

  • 请问  如何通过I2C模式将程序写入EEPROM中呢?  刚接触DSP  很多问题不是很懂

  • 通过IIC写EEPROM,可以参考下面的代码历程:

    Uint16 I2C_Self_Test(void)

    {

     Uint16 temp,devID,len;

     Uint32 i,j,start_addr,num_page;

     Uint16 status;

     if (HAL_I2C_hnd.boardRev==BOARD_REV_PREV_D)

       return HAL_I2C_ST_NO_EEPROM;

     devID = I2C_AT24C1024B_CHIP_1;    // first Chip

     len   = I2C_AT24C1024B_PAGE_SIZE; // number of bytes

     num_page = I2C_AT24C1024B_CAPACITY/I2C_AT24C1024B_PAGE_SIZE;

     start_addr = 0x0;

     for (j=0;j<num_page;j++)

     {

       I2C_hnd.test_addr = start_addr;

       //generate the ramp data pattern

       for (i=0;i<len/2;i++)

       {

         temp = 2*i + ( (2*i +1)<<8);

         i2c_test_data[i] = temp;

       }

       // write data to EEPROM

       status = I2C_Write_DataBuf(devID,start_addr,len,i2c_test_data,0);

       if (status!=HAL_I2C_ST_SUCCESS)

         return status;

       memset(i2c_test_data,0xFF,sizeof(i2c_test_data));

       // read the data back

       status = I2C_Read_DataBuf(devID,start_addr,len,i2c_test_data,0);

       if (status!=HAL_I2C_ST_SUCCESS)

         return status;

       // verify the data

       for (i=0;i<len/2;i++)

       {

         temp = 2*i + ( (2*i +1)<<8);

         if (temp!=i2c_test_data[i])

           return HAL_I2C_ST_WRITE_READ_FAIL;

       }

       start_addr +=len;

     }

     return HAL_I2C_ST_SUCCESS;

    }

  • TI的例程中也有一个通过I2C将数据写入EEPROM中的,请问两者有什么区别吗?  另外,如果我想将例程中的LEDBlink写入EEPROM中,怎么样将程序而不是数据写入EEPROM?

  • 两个程序都是差不多的。你参考哪个都可以。

    需要将程序变成2进制码,像放数据一样存放到EEPROM中。

  • 是用hex2000将.out文件转换为.a00文件吗?  如何使用.a00文件呢?  而且例程中的I2C有字长限制的吧,不能超过FIFO的长度?