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.

[参考译文] RTOS/F28M36P63C2:C28xx:I2C在调试器下工作,但不能独立工作?

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/584357/rtos-f28m36p63c2-c28xx-i2c-works-under-debugger-but-not-stand-alone

部件号:F28M36P63C2

工具/软件:TI-RTOS

在我的主板上,PF0_GPIO32为I2C SDA路由,PF1_GPIO33为I2C SCL路由。  

臂侧的代码大致如下所示:

  1. 配置(初始化)内存
  2. 配置GPIO端口(特别是PF0_GPIO32和PF1_GPIO33)
  3. 向C28xx引导加载程序发送信号以使C28xx运行
  4. 等待(无限) C28发出其正在运行的信号
  5. 配置EMAC
  6. 通过以太网向等待服务器发送文本字符串
  7. 无限等待("同时(1);")

C28xx端的代码大致如下所示:

  1. 配置(初始化)内存
  2. 向臂芯发出C28xx正在运行的信号
  3. 为I2C配置GPIO
  4. 发送I2C命令以打开LED
  5. 无限等待("同时(1);")

这在调试器中工作正常。  当然,我必须跳一点舞,让两个核心按正确的顺序运行:

  1. 我将两个应用程序加载到闪存(ARM和C28xx代码)。
  2. 我运行ARM代码,直到在步骤4中出现无限等待,然后暂停执行
  3. 我开始在C28xx内核上执行
  4. 我绕过步骤4中的无限等待代码(ARM代码)并让ARM核心运行

通过此过程,我可以看到服务器上的文本字符串(来自ARM内核,步骤6),并且LED亮起(来自C28xx内核,步骤4)。

不幸的是,如果我退出调试器并重新启动主板,我会得到不同的行为:我在服务器上得到文本字符串(从ARM内核,步骤6),但我看不到LED亮起。  因此,调试器似乎正在改变I2C GPIO的行为(或提供一些意外的配置)。  

C28xx上是否有I2C示例程序?  我没有看到一个。  如果不能做到这一点, 我怎么能弄清楚调试器正在做什么(或者也许--某种程度上--不管gel文件正在做什么都是禁用的)?

谢谢!

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

    我了解了如何配置GPIO以输出8位值(串行)。  我的C28x main()的开头如下:

    int main (void)
    {
      DGPIO(main_enter);// gPIO debug:start of main()
      InitRAM();
    
      DGPIO(main_copy);// gPIO debug:before memcpy()
    memcpy (&RamfuncsRunStart,&RamfuncsLoadStart,(size_t)&RamfuncsLoadSize);
      DGPIO (MAIN_COPY2);// gPIO调试:memcpy之后 

    我构建并刷新此代码,然后在调试器之外运行它,并使用示波器观察GPIO引脚。  在O形作用域上,我在GPIO引脚上看到main_enter和main_copy代码,但我看不到main_COPY2代码。  以下是定义RamfuncsRunStart (et al)的链接程序脚本文件中的文本:

    组
    {
    Ramfuns
    {
    	-l F021_API_C28x_FPU32.lib
    }
    
    }	load = flash page =0,
    		run = L0_S4_RAM page =1,
    		load_start(_RamfuncsLoadStart),
    		load_size(_RamfuncsLoadSize),
    		load_end(_RamfuncsLoadEnd),
    		run_start(_RamfuncsRunStart)
    		run_size(_RamfuncsRunSize),
    		Run_End(_RamfuncsRunEnd)(运行结束(_RamfuncsRunEnd))
    

    闪存页在第0页中定义为:
    flash       :origin = 0x13万,length = 0x0000FFF0 // bootloader flash

    L0_S4_RAM块在第1页中定义为:
    l0_S4_RAM    :原始= 0x0.8万,长度= 0x0.9万 //片上RAM块L0-L3,S0-S4

    在C28x内核收到从闪存加载其代码的信号之前,ARM内核将共享内存块S0-S4分配给C28x。

    我在这里可能做错了什么,有什么提示?

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

    1)在DGPIO (MAIN复制)之前,是否完成了C28x的S0-S4 RAM分配? 您是否阻止C28x进一步执行,直到M3指示分配已完成?
    2)你在ramfuns有什么?
    3) C28x上是否有NMI ISR? 您是否可以尝试在ISR中切换GPIO以查看是否获得NMI?

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

    您是否对此调试程序有任何更新?

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

    您是否尝试在C28x NMI ISR中切换GPIO以了解是否发生NMI?
    如果您的问题得到解决,请使用详细信息更新线程,以使他人受益。

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

    由于我在过去3周内未收到回复,我即将结束此话题。

    谢谢,此致,
    Vamsi