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.

[参考译文] CC2530EM:如何使用 CC2530 EM 中的 SPI 在闪存中写入数据

Guru**** 2386910 points
Other Parts Discussed in Thread: CC2530, Z-STACK
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/791397/cc2530em-how-to-write-data-in-flash-using-spi-in-cc2530-em

器件型号:CC2530EM
Thread 中讨论的其他器件:CC2530Z-STACK

您好!

我想使用 SPI 在 CC2530的闪存中写入数据:

1) 1)能否使用"HalSPIWrite"函数来写入数据。

2)在函 数的这个定义中、"static void HalSPIWrite (uint32 addr、uint8 *pBuf、uint16 len)"应该传递什么地址以及如何计算用户指南中未提到的地址。

3)"HalSPIWrite"、此函数位于文件"hal_ota.c"中、我无法将此文件包含在"ZMain.c"文件中、它显示如下所示的错误、

链接
错误[E27]:条目 T
"HLOTAAvail:?Relay"
模块 hal_OTA (C:\Texas
Instruments\Z-Stack 3.0.2\
Projects\Zstack\ota\
软件狗\CC2530DB\
CoordinatorEB\Obj\
HAL_OTA.R51)在中重新定义
模块 ZMain (C:\TExaS)
Instruments\Z-Stack 3.0.2\
Projects\Zstack\ota\
软件狗\CC2530DB\
CoordinatorEB\Obj\
ZMain.R51)
运行链接器时出错

谢谢、此致、

埃克塔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1.是的。
    2.您可以决定要使用的任何地址、但该地址应与 HAL_FLASH_WORD_SIZE 对齐。
    3.您应该将"static void HalSPIWrite (uint32 addr、uint8 *pBuf、uint16 len);"改为"void HalSPIWrite (uint32 addr、uint8 *pBuf、uint16 len);"并在"extern void HalSPIWrite (uint32 adlen、uint8 *使用 uint16 uintuintf * men) API 来使用"external API。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    1) 1)我已经给出了地址"0x3B000"、但无法查看它是否正在写入或未在存储器中反映。
    2) 2)我尝试删除静态并将 extern 放入函数声明中、但它不起作用、仍然显示相同的错误。

    谢谢、此致、
    埃克塔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1.您是否从"0x3B000"读取数据以检查内容?
    2.我在我的 Zmain.c 中尝试它、但看不到构建/链接错误。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    1) 1)是的、我尝试在该地址读取、但无法看到。
    2) 2)我看到了相同的错误、以及如何解决该错误。

    谢谢、此致、
    埃克塔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1.您如何阅读它来检查内容?
    2.我已经向您展示了步骤。 不要将函数复制到 Zmain.c 中 您只需要将其用作外部变量并使用它。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    1) 1)我正在通过输入相应的逻辑地址"0x3B000"来检查存储器。
    2) 2)我已在文件"hal_ota.c"中添加了 extern、其中声明和定义了函数并在"ZMain.c"文件中使用、但仍面临此链接错误。

    谢谢、此致、
    埃克塔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1、HalSPI 写入数据到外部闪存。 为什么要检查内部存储器?
    2.您应该在 Zmain.c 中执行 extern、而不是 hal_ota.c
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    1) 1)我应该检查的位置
    2) 2)我在 ZMain.c 中执行了该操作、但它在那里不起作用。 如果我在 ZMain.c 中声明函数"extern void HalSPIWrite (uint32 addr、uint8 * pBuf、uint16 len);"
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我想你应该使用 HalSPIRead 来读取内容。
    2.是的
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    1) 1)我调用了 HalSPIRead 此函数、您能解释一下它在该函数中传递的参数吗、它是否与写入函数相同、因为我尝试调用此函数、但未写入任何内容。
    2) 2)我在"ZMain.c"中声明"extern void HalSPIWrite (uint32 addr、uint8 * pBuf、uint16 len";但仍然面临链接错误。

    谢谢、此致、
    埃克塔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果仍然出现构建错误、如何使用 HalSPIWrite 正确写入数据? 您应该首先解决构建问题。 您能向我展示一下您在 hal_dota.c 中更改了什么吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我还随附了屏幕截图供参考:

    我仅在"ZMain.c"文件中进行了如下更改:  

    (三

    *包括
    *

    #ifndef NONWK
    #include "AF.h"
    #endif
    #include "hal_adc.h"
    #include "hal_flash.h"
    #include "hal_lcd.h"
    #include "hal_led.h"
    #include "hal_drivers.h"
    #include "onboard.h"
    #include "OSAL.h"
    #include "OSAL_NV.h"
    #include "ZComDef.h"
    #include "zMAC.h"

    extern void HalSPIWrite (uint32 addr、uint8 * pBuf、uint16 len);                用于 SPI 调用的//extern

    int main( void )

    //关闭中断
    OSAL_INT_DISABLE (ints_all);

    //初始化与电路板相关的内容,如 LED
    HAL_Board_init ();

    //确保电源电压足够高以运行
    zmain_VDD_CHECK ();

    //初始化电路板 I/O
    InitBoard( OB_COLD );

    //初始化 HAL 驱动程序
    HalDriverInit();

    //初始化 NV 系统
    OSAL_NV_INIT( NULL );

    //初始化 MAC
    ZMacInit();

    //确定扩展地址
    zmain_ext_addr ();

    //

    #if def定义 ZCL_KEY_establish

    //初始化 Certicom 证书信息。
    zmain_cert_init ();
    #endif

    //初始化基本 NV 项目
    zgInit();

    #ifndef NONWK
    //由于 AF 不是一项任务,因此调用它的初始化例程
    afInit();
    #endif

    //初始化操作系统
    OSAL_INIT_SYSTEM ();

    uint8 buf[10]={0x10、0x20、0x30、0x40、0x50、0x60、 0x70、0x80、0x90};              //更改  
    HalSPIWrite (0x3B000、buf、10);                                             //表示 SPI  

    OSAL_START_SYSTEM ();//此处无返回

    返回0;//不应到达此处。
    }// main()

    e2e.ti.com/.../error-SPI.docx

    谢谢、此致、

    埃克塔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否要从 hal_ota.c 中的“static void HalSPIWrite (UINT32 addr、uint8 *pBuf、uint16 len);”中删除“static”?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    是的、我是这样做的。

    "HAL_ota.c"文件中提到的代码如下所示:

    #if HAL_OTA_XNV_IT_SPI
    void HalSPIRead (uint32 addr、uint8 *pBuf、uint16 len);
    void HalSPIWrite (uint32 addr、uint8 *pBuf、uint16 len);
    静态空 xnvSPIWrite (uint8 ch);
    #endif

    谢谢、此致、
    埃克塔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您还需要删除"void HalSPIWrite (uint32 addr、uint8 *pBuf、uint16 len..."前面的以下"静态" 在 hal_ota.c.中


    静态空 HalSPIWrite (uint32 addr、uint8 *pBuf、uint16 len)

    uint8 cnt;
    #if !HAL_OTA_BOOT_CODE
    UINT8 Shdw = P1DIR;
    halIntState_t HIS;
    HAL_ENTER_CRITICAL_SECTION (HIS);
    P1DIR |= BV (3);
    #endif

    while (len)

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

    我从函数定义和声明中删除了静态、在 main 中将其定义为 extern、但仍然面临相同的链接错误。


    /*********
    *@fn HalSPIWrite
    *
    *@通过 SPI 向外部 NV 存储器进行简要写入。
    *
    *@param addr -到外部 nv 的偏移。
    *@param pBuf -指向缓冲区的指针、从中将字节写入外部 nv。
    *@param len -要写入外部 NV 的字节数。
    *
    *@返回无。
    (小部分 /
    //静态空 HalSPIWrite (uint32 addr、uint8 *pBuf、uint16 len)
    空 HalSPIWrite (uint32 addr、uint8 *pBuf、uint16 len)


    uint8 cnt;
    #if !HAL_OTA_BOOT_CODE
    UINT8 Shdw = P1DIR;
    halIntState_t HIS;
    HAL_ENTER_CRITICAL_SECTION (HIS);
    P1DIR |= BV (3);
    #endif

    错误为:
    正在更新生成树...
    HAL_OTA.c
    ZMain.c
    链接
    ERROR[E27]:条目
    模块中的"HalOtAvail:?Relay"
    HAL_OTA (C:\Texas Instruments\
    Z-Stack 3.0.2\projects\Zstack\ota\
    转换器\CC2530DB\CoordinatorEB\
    obj/hal_ota.r51)在模块中重新定义
    ZMain (C:\Texas Instruments\
    Z-Stack 3.0.2\projects\Zstack\ota\
    转换器\CC2530DB\CoordinatorEB\
    obj\ZMain.R51)
    运行链接器时出错


    谢谢、此致、
    埃克塔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请附加您的 hal_ota.c 和 ZMain.c
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我要附加这两个文件

    e2e.ti.com/.../ZMain.c

    谢谢、此致、

    埃克塔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我看不到您附加了 hal_dota.c
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我认为问题是您在 ZMain.c 中添加了"#include "hal_ota.c" 您应该删除此行。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我删除了"<hal_ota.c" but now getting error as :
    正在更新生成树...
    ZMain.c
    链接
    错误[E16]:段 XDATA_I (大小:
    0x18c 对齐:0)太长
    段定义。 至少为0x22
    需要更多字节。 问题
    在处理时发生
    段放置命令
    "-Z (XDATA) XDATA_Z、XDATA_I=_XD
    ATA_START--_XDATA_END"、其中
    放置时的电流
    可用的存储器范围是
    "XDATA:1d96-1eff (XDATA:1d96-1eff)"
    与此相关的保留范围
    放置:
    XDATA:1-4cd XSTACK
    XDATA:4 ce-1eff XDATA_Z
    位:0-7 布雷格
    位:80-87 SFR_An
    位:90-97 SFR_An
    位:a0-af SFR_An
    位:B8-C7 SFR_An
    位:e8-ef SFR_An
    位:F8-ff SFR_An
    运行链接器时出错

    感谢和此致、
    埃克塔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此错误意味着 RAM 已用完。 您应该减少应用中的 RAM 用量。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、
    感谢你的帮助。