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.

[参考译文] AM3358:从 I2C 地址读取时程序崩溃

Guru**** 2568585 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/629366/am3358-program-crashes-on-read-from-i2c-address

器件型号:AM3358

你(们)好

我注意到在读取 范围内的任何地址内容时出现问题

存储器映射 i2c-2通道(0x4819c000 - 0x4819d000)的说明。 为了本地化此问题、我修改了其中一个裸片

来自 AM335x StarterWare 的金属示例。

实际上、我要做的是:

125. /*初始化控制台以与主机进行通信*/
126. ConsoleUtilsInit();
127.
128 /*根据编译时间检查选择控制台类型*/
129. 控制台 UtilsSetType (console_UART);
130
131. /*在 CPSR 中启用 IRQ */
132. IntMasterIRQEnable();
133.
134. /*将 AINTC 配置为生成中断*/
135. I2CAINTCConfigure();
136.
137. 无符号长整型 PA = 0x4818C000;
138. 控制台 UtilsPrintf ("addr %x\n"、PA);
139. ConsoleUtilsPrintf ("读取%x\n"、*((volatile unsigned long *) pa");
140 PA = 0x4819C000;
141. 控制台 UtilsPrintf ("addr %x\n"、PA);
142. ConsoleUtilsPrintf ("读取%x\n"、*((volatile unsigned long *) pa"); 

我看到的是什么

##正在启动应用程序,地址为0x8000000000...
地址4818c000
读取50461100
地址4819c000

因为异常不是配置为挂起的。 我尝试基于 MMU 的代码时

使用配置的异常从0x4819c000 - 0x4819d000范围内的地址读取数据

为我提供数据中止异常。 为什么?

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

    在尝试从其地址范围读取之前、必须确保 I2C2已初始化。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我提供的示例使用物理地址、因此您无需在此设置 MMU。 您正在讨论什么类型的初始化? 是否初始化 I2C2? 如果对寄存器区域的任何访问导致数据中止、我该怎么做? 我只是尝试访问物理地址、根据数据表、物理地址属于 I2C2。 通常您不需要为此进行任何设置、因为它只是访问原始存储器。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果 I2C2子系统未启用(即、如果未向其提供时钟且其保持复位状态)、您将无法访问其寄存器。 请参阅 AM335x TRM 修订版 P 的第8.1.12.1.15节
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、谢谢、我将检查它。