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.

[参考译文] CC3235SF:CC3235SF 程序映像自动删除

Guru**** 2644125 points

Other Parts Discussed in Thread: CC3235SF

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1587922/cc3235sf-cc3235sf-program-image-auto-deletion

器件型号: CC3235SF

这是 CC3235SF 器件。 它在实地工作了一个星期。 然后、与该器件的通信中断。 每次打开器件时、用户 LED 都会闪烁一次。 当我拔下设备并将其重新插入时、我注意到该 LED 未亮起。
稍后、当我通过不可插拔连接设备时、我注意到程序映像已被删除。 它说 0KB。 这是什么原因? 导致这种情况的原因是什么? 为什么程序映像会自动删除?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Mehmet:

    程序通常不会自行删除。 这可能是:

    • 灾难性的内存故障
    • 安全功能触发(有意擦除)
    • 文件系统损坏导致图像无法读取

    根据您对 CC3235SF 器件的描述、这种情况似乎是闪存损坏或故障的典型情况。 下面是最可能的解释:

    1. 电源相关问题

      • 在关键写入操作期间电源不稳定或突然断电
    2. 闪光磨损(一周后可能不太可能发生,但值得考虑)

      • CC3235SF 使用写入周期有限的内部闪存
      • 如果您的应用频繁写入非易失性存储、则可能是电芯寿命耗尽
    3. 硬件看门狗复位

      • CC3235SF 具有安全功能、可以在检测到某些条件时触发存储器擦除
      • 反复的崩溃或锁定可能触发了恢复出厂设置的条件
    4. 文件系统损坏

      • SimpleLink 文件系统可能已损坏、导致程序映像无法访问
    5. MCU 安全启动验证失败

      • 如果启用了安全启动、验证失败会阻止应用程序加载
      • 这可能会显示为当程序实际被拒绝时被删除

    为了防止将来发生这种情况、请考虑实施功耗监控、减少对闪存的写入周期、并确保在应用程序中进行正确的错误处理。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    1-) 我创建以下块并运行代码。 在 STA/AP 模式转换期间、我将写入闪存、并且我将在每次启动时读取保存的 Wi-Fi 信息。 我不会干扰存储程序的闪存。 您认为程序映像文件此时被删除或损坏了吗?

    int FS_WriteFile(const char *文件名、const void *数据、uint32_t 长度)

    _i32 fileHandle;
    _u32 MAXFILESIZE =长度;
    _u32 令牌= 0;
    INT 状态= 0;

    // Dosya oluşturulmamışsa oluştur ó n, varsa üstüne Yaz
    fileHandle = sl_FsOpen ((unsigned char *) filename、
    SL_FS_CREATE | SL_FS_OVERWRITE | SL_FS_CREATE_MAX_SIZE (MAXFILESIZE)、
    令牌);

    if (fileHandle < 0){
    return fileHandle;// Hata kodunu döndür
    }

    // Dosyaya veri Yaz
    STATUS = sl_FsWrite (fileHandle、0、(_u8 *) data、length);
    if (status < 0){
    sl_FsClose (fileHandle、0、(unsigned char *)“a",“,1、1);// Yazma hatası varsa abort ile kapat
    返回状态;
    }

    // Dosyayı düzgün şekilde kapat
    状态= sl_FsClose (fileHandle、0、0、0);
    返回状态;
    }

    /**
    *@简介 Belirtilen dosyadan veri okur ( tüm içeriği buffer'a kopyalar ).
    *
    *@param[in] filename Okunacak dosya adı(ör :“/wifi_config.txt")“)
    *@param[out] buffer Okunan verinin kopyalanacağı buffer
    *@param[in] length Okunacak maksimum byte sayısı(缓冲区 boyutu)
    *@return 0: Başarılı,<0: Hata kodu (SL_FS* fonksiyonlarından döner )
    */
    int FS_ReadFile(const char *文件名、void *缓冲器、uint32_t 长度)

    _i32 fileHandle;
    _u32 令牌= 0;
    INT 状态= 0;

    // Dosyayı Oku modunda aç
    fileHandle = sl_FsOpen ((unsigned char *) filename、SL_FS_READ、&token);
    if (fileHandle < 0){
    return fileHandle ;// Hata kodunu döndür(ör : dosya Yok)
    }

    // Dosyadan Oku
    状态= sl_FsRead (fileHandle、0、(_u8 *) 缓冲区,长度);
    if (status < 0){
    sl_FsClose (fileHandle、0、(unsigned char *)“a",“,1、1);// Okuma hatası varsa abort ile kapat
    返回状态;
    }

    // Dosyayı düzgün şekilde kapat
    状态= sl_FsClose (fileHandle、0、0、0);
    返回状态;
    }

    /**
    *@简介 Eğer dosya mevcut değilse belirtilen boyutta boş bir dosya oluşturur。
    *
    *@param[in] filename Kontrol edilecek/ oluşturulacak dosya adı
    *@param[in] length Oluşturulacak dosyanın maksimum boyutu
    */
    void ensereFileExists (const char *文件名、uint32_t length){
    _i32 fileHandle;
    _u32 令牌= 0;
    // dosya var mı kontrol et
    fileHandle = sl_FsOpen ((unsigned char *) filename、SL_FS_READ、&token);
    if (fileHandle < 0){
    // dosya yoksa, boş şekilde oluştur
    fileHandle = sl_FsOpen ((unsigned char *) filename、
    SL_FS_CREATE | SL_FS_OVERWRITE | SL_FS_CREATE_MAX_SIZE (LENGTH)、
    令牌);
    if (fileHandle >= 0){
    sl_FsClose (fileHandle、0、0、0);// Oluşturulan dosyayı hemen kapat
    }
    }其他{
    // dosya varsa kapat
    sl_FsClose (fileHandle、0、0、0);
    }
    }

    //----------------------------------------------------------------------------------------------------
    //测试 fonksiyonu: dosya yazma/Okuma örneği(调试 amaçlı)
    //----------------------------------------------------------------------------------------------------
    Char MyData[]=“deneme!“;
    char readBuffer[64]={0};

    /**
    *@简介 Dosya Sistemi ile yazma/Okuma işlemini 测试 Eder. (Yaz→Oku→Logla)
    */
    void flashFileTest(){
    ensureFileExists(“wifi_config.txt",“,sizeof、sizeof (readBuffer));// Dosya mevcut değilse oluştur

    // Yaz
    INT writeRes = FS_WriteFile(“wifi_config.txt",“,MyData、MyData、strlen (MyData);
    if (writeRes == 0){
    Display_printf (display、0、0、“Dosya başarıyla yazıldı。“);
    }其他{
    Display_printf (display、0、0、“Yazma hatası:%d“、writeRes);
    }

    // Oku
    memset (readBuffer、0、sizeof (readBuffer));
    int readRes = FS_ReadFile(“wifi_config.txt",“,readBuffer、readBuffer、sizeof (readBuffer)- 1);
    if (readRes == 0){
    Display_printf (display、0、0、“Okunan veri:%s“、readBuffer);
    }其他{
    Display_printf (display、0、0、“Okuma hatası:%d“、readRes);
    }
    }

    /**
    *@简短的 Wi-Fi konfigürasyonunu(SSID,密码,安全,用户名)Tek satır halinde dosyaya 皮艇.
    *
    *@param[in] SSID Wi-Fi SSID
    *@param[in] password Wi-Fi password
    *@param[in] security Güvenlik tipi(ör :“2" veya“ veya string olarak)
    *@param[in] username Kullanıcı adı( isteğe bağlı)için(企业<eps> )
    *@return 0: Başarılı,<0: Hata kodu
    */
    int saveWifiConfig(常量字符*SSID,常量字符*password,常量字符*security,常量字符*username){
    char buffer[256]={0};
    snprintf(缓冲区,sizeof(缓冲区)、“%s|%s|%s|%s",“,SSID、SSID、密码、 安全,用户名);// Tüm alanları| ile birleştir
    返回 FS_WriteFile(“wifi_config.txt",“,buffer、buffer、strlen (buffer));
    }

    /**
    *@简短的 Dosyadan Wi-Fi konfigürasyonunu okur ve dört ayrı Alana böler .
    *
    *@param[out] SSID Okunan SSID(缓冲区,最小 64 字节)
    *@param[out] password Okunan password(缓冲区,最小 64 字节)
    *@param[out] security Okunan security(缓冲区,最小 16 字节)
    *@param[out] username Okunan username(缓冲区,最小 32 字节)
    *@return 0: Başarılı, hatası 0: Hata (Okuma veya parse )
    */
    int loadWifiConfig(char *SSID, char *password, char *security, char *username){
    char buffer[256]={0};
    if (FS_ReadFile(“wifi_config.txt",“,buffer、buffer、sizeof (buffer)–1)!= 0)
    返回–1;

    // Dosya satırını| ile parçala ve sırayla alanlara kopyala.
    char *ptr = strtok (buffer、“|")“);
    if (ptr) strncpy (SSID、ptr、63);否则返回–2;
    ptr = strtok (NULL、“|")“);
    if (ptr) strncpy (password、ptr、63);否则返回–2;
    ptr = strtok (NULL、“|")“);
    if (ptr) strncpy (security、ptr、15);否则返回–2;
    ptr = strtok (NULL、“|")“);
    if (ptr) strncpy (username、ptr、31);else username[0]= 0;// Kullanıcı adı olmayabilir

    返回 0;
    }

    设备每次启动时都会调用此函数。 //在 sl_Start 之后读取 Wi-Fi 配置文件
    enereFileExists(“wifi_config.txt",“,256、256);//如果文件不存在、则创建该文件

    int configLoadStatus = loadWifiConfig(SSID,密码,安全性,用户名);

    saveCounterValue (1);
    TASK_SLEEP (1000);
    apmodeaktif=0;
    deviceReset ();这样,在更改模式后,我保存值并重置系统。


    2) MCU 安全启动验证错误:这是什么意思? 在 CCS Studio 中的哪里可以检查该设置?
    3-) 文件系统损坏:这可能是什么原因造成的? 在什么情况下?
    4-) My Field 器件的 SOP 值为 010。 这可能是删除它们的原因吗?

    其他信息:当我重新启用设备时、它们可以正常工作。 但是、即使我在不重新注册的情况下拔下并重新插入设备、它也不起作用、也根本没有响应。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    代码如何上传到器件中。 使用 UART (ImageCreator) 或 JTAG(从 IDE 运行)?

    1 月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我正在通过 UART 从 CCS Studio 进行安装。 我稍后将通过 OTA 进行更新。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    您是否在函数 deviceReset () 中调用 sl_Stop ()?

    您的症状看起来像是 SPI 闪存损坏。 您是否在上述代码所述的其他位置写入 SPI 闪存? 您多久向 SPI 闪存写入一次? 如果您更换了 SPI 闪存芯片、它可以解决您的问题吗?

    1 月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。


    void deviceReset (void)

    /* 1) Ağ alt sistemini durdur–açık socket/scan vs. olmasın */
    sl_Stop (SL_STOP_TIMEOUT);

    /* 2) Kısa bir nefes:NWP STOP'un tamamlanması için 20–50 ms */
    ClockP_USleep (50000);

    /* 3) Tüm kesmeleri kapat–yarış koşullarını kes */
    hwi_disable();// veya hwip_disable()

    /* 4)(İsteğe bağlı)watchdog'u kapat ya da beklenen reset nedeni olarak ayarla */
    /*…*/

    UART_print(“[Common] CC32xx MCU 复位\r\n“);

    /* 5) 休眠复位–TI'nin önerdiği “temiz reboot“*/
    MAP_PRCMHibernateCycleTrigger();

    /* Buraya düşmemeli ć*/
    while (1){;}
    }  

    我的 devicereset 函数如下所示

    我不会一直写入 SPI 闪存、我会在情况发生变化时写入、然后使用 devicereset 进行复位。

    我们将写入外部 SPI 闪存。 它与 LaunchPad 中集成的闪存相同。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    另一个可能破坏 SPI 闪存的因素是、如果您经常调用具有持久性的 SL_ API。 这些 SL_ API 在后台将数据写入 SPI 闪存。 另一件可能损坏 SPI 闪存中内容的事情可能是 SPI 本身出现问题(例如,错误的信号完整性)或在写入期间断电。  您是否有具有相同症状的更多硬件?

    我想您应交换 SPI 闪存芯片并检查问题是否仍然存在。  

    1 月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我在不同的时间在几乎所有设备上都遇到过这个问题。 当我在不更改闪存芯片的情况下重新加载代码时、它是有效的。 我遇到了一个巨大的问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    如果您认为您的 SPI 闪存芯片未因过多的写入周期而损坏、并且完全相同的代码在 LaunchPad 上工作、那么没有太多的选择、因为您的硬件存在设计问题。

    您的板有多少层? 您是否使用 QFN 封装而不是 MOD 封装、对吧?

    1 月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我使用的是 QFN 4 层 PCB。 我可以对损坏的器件进行重新编码。 它是有效的。 但是,为什么闪存驱动器被损坏或代码被删除的字段? 这是因为 SOP 010、还是因为我要写入闪存? 我写入闪存、但不写入 mcuflash.bin 区域。 我不明白为什么。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    不发出 SOP 模式 0-1-0。 写入 SPI 闪存不是问题、除非在 SPI 闪存写入周期中写入的次数过多会断电。 如果 SPI 设计错误或电源不足、这可能会导致 SPI 闪存内容损坏。

    我认为至关重要的是确定在 LaunchPad 上运行的完全相同的代码是否没有任何问题。 如果是、没有其他选择、除非您的硬件设计是错误的。

    1 月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这些设备在实验室环境中不会造成问题。 我在现场遇到这些问题。 我遇到的另一个器件经常切换到 UARTboot 模式。 我将 SOP 值设置为 000、现在没问题。 因此、我怀疑 SOP 引脚。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    您的器件是否已经过 EMC 抗扰性测试? 您测试了哪些标准和级别?

    您的归档环境是什么? 是来自电源逆变器、高压等的 EM 干扰

    1 月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    不是、但我们使用了 LaunchPad 设计作为参考。 该器件还通过 UART 与另一个处理器持续通信。 它使用与编程 UART 相同的 UART。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    在此类配置下使用 UART 不应是一个因素。  

    您根据 LaunchPad 设计了硬件、这并不意味着什么。 在 EMC 抗扰度的情况下、即使 PCB 上的一条不同布线也可能会导致不同的行为。  在没有进行适当 EMC 测试的情况下将器件归档可能会产生不良后果、不仅是合法的、而且也是正常工作的。

    您是否知道 EMC 环境是如何成为设备出现故障的领域?

    1 月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    实际上、桌面测试通常是进行的。 我认为不会有很高的 EMC 干扰。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在特定条件下、器件由另一个处理器复位。 如果在按下或按住闪存复位按钮的同时另一个处理器复位器件、那么在发生该复位时是否会出现永久性情况、例如程序删除?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    很抱歉、我没有解析您的问题(闪存重置按钮...)。

    但是、如果在写入 SPI 闪存期间重新启动 CC3235、则可能会导致 SPI 闪存内容损坏。

    1 月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我写的扇区是否已损坏? 我没有写入程序所在的区域、因此不应删除程序。 我错了吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    SL_文件系统具有类似“FAT"的“的内容、并且根据类型的不同、写入是 FAT 更新的。 当与 FAT 的扇区被损坏,你有一个问题。

    1 月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。


    int FS_WriteFile(const char *文件名、const void *数据、uint32_t 长度)

    _i32 fileHandle;
    _u32 令牌= 0;
    INT 状态;

    if(!filename ||!data || length ==0){
    返回 SL_ERROR_BSD_EINVAL;
    }

    /* 1)Önce mevcut dosyayı yazma modunda açmayı Dene.
    *(örneğin wifi_config.txt daha önce failsailure/create ile açılmış olabilir)。
    */
    fileHandle = sl_FsOpen ((unsigned char *) filename、SL_FS_WRITE、&token);

    if (fileHandle < 0){
    /* 2) Dosya yoksa veya açılamıyorsa : failsafe olarak oluştur。
    *
    * Burada MAXFILESIZE olarak “length" kullanıyoruz“ kullanıyoruz ; kritik config dosyaları
    * için zaten Sabit/üst 限制 bir uzunlukla çağırman 理想(Örn . 256)。
    */
    _u32 MAXFILESIZE =长度;

    fileHandle = sl_FsOpen ((unsigned char *) filename、
    SL_FS_CREATE |
    SL_FS_OVERWRITE |
    SL_FS_CREATE_MAX_SIZE (MAXFILESIZE)|
    SL_FS_CREATE_FAILSAFE、
    令牌);
    if (fileHandle < 0){
    return (int) fileHandle;// Açma / oluşturma hatası
    }
    }

    /* 3) Dosyaya baştan í a itibaren Yaz */
    STATUS = sl_FsWrite (fileHandle、0、(_u8 *) data、length);
    if (status < 0){
    /* Yazma hatası→abort signature ile kapat, hatayı Geri döndür */
    (void) sl_FsClose (fileHandle、0、(unsigned char *)“a",“,1、1);
    返回状态;
    }

    /* 4) Düzgün şekilde kapat (commit)*/
    状态= sl_FsClose (fileHandle、0、0、0);
    if (status < 0){
    返回状态;
    }

    返回 0;
    }

    /**
    *@简介 Belirtilen dosyadan veri okur ( tüm içeriği buffer'a kopyalar ).
    *
    *@param[in] filename Okunacak dosya adı(ör :“/wifi_config.txt")“)
    *@param[out] buffer Okunan verinin kopyalanacağı buffer
    *@param[in] length Okunacak maksimum byte sayısı(缓冲区 boyutu)
    *@return 0: Başarılı,<0: Hata kodu (SL_FS* fonksiyonlarından döner )
    */
    int FS_ReadFile(const char *文件名、void *缓冲器、uint32_t 长度)

    _i32 fileHandle;
    _u32 令牌= 0;
    INT 状态;

    if(!filename ||!buffer || length ==0){
    返回 SL_ERROR_BSD_EINVAL;
    }

    // Dosyayı Oku modunda aç
    fileHandle = sl_FsOpen ((unsigned char *) filename、SL_FS_READ、&token);
    if (fileHandle < 0){
    return (int)fileHandle;// Hata kodunu döndür(ör:dosya Yok)
    }

    // Dosyadan Oku
    状态= sl_FsRead (fileHandle、0、(_u8 *) 缓冲区,长度);
    if (status < 0){
    (void) sl_FsClose (fileHandle、0、(unsigned char *)“a",“,1、1);// Okuma hatası varsa abort ile kapat
    返回状态;
    }

    // Dosyayı düzgün şekilde kapat
    int closeStatus = sl_FsClose (fileHandle、0、0);
    如果 (closeStatus < 0){
    返回 closeStatus;
    }

    返回 0;
    }

    /**
    *@简介 Eğer dosya mevcut değilse belirtilen boyutta boş bir failsafe dosia oluşturur。
    *
    *@param[in] filename Kontrol edilecek/ oluşturulacak dosya adı
    *@param[in] length Oluşturulacak dosyanın maksimum boyutu
    */
    void ensereFileExists(const char *文件名、uint32_t 长度)

    _i32 fileHandle;
    _u32 令牌= 0;

    if(!fileName || length == 0){
    返回;
    }

    // dosya var mı kontrol et
    fileHandle = sl_FsOpen ((unsigned char *) filename、SL_FS_READ、&token);
    if (fileHandle >= 0){
    // dosya varsa kapatıp çık
    (void) sl_FsClose (fileHandle、0、0、0);
    返回;
    }

    // dosya yoksa, failsafe boş dosya olarak oluştur
    fileHandle = sl_FsOpen ((unsigned char *) filename、
    SL_FS_CREATE |
    SL_FS_OVERWRITE |
    SL_FS_CREATE_MAX_SIZE (LENGTH)|
    SL_FS_CREATE_FAILSAFE、
    令牌);
    if (fileHandle >= 0){
    (void) sl_FsClose (fileHandle、0、0、0);// Oluşturulan dosyayı hemen kapat
    }
    }  这些代码是否用于 FAT 系统?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    如果你创建了文件,fat 是更新到我知道的程度。 由于我无权访问 NWP 代码、因此无法确认。

    1 月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、  

    何时重置设备?  在写入 Wi-Fi 配置后是否存在延迟或您是否立即复位? 如 Jan 所述、如果在写入过程中重置、则可能会损坏数据。 我查看了您最近的代码片段、它看起来不错、因此我认为问题来自其他地方。