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**** 2563730 points
Other Parts Discussed in Thread: AM3358

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/614170/am3358-i2c-not-working

器件型号:AM3358

您好的团队,

当天的问候!

我在 AM3358的 I2C 上工作了一个半月,但它仍然不工作。 我想告诉大家、我没有为此任务使用任何驱动程序函数和库函数。 我正在尝试编写一个可以访问 I2C 控制 器的原始代码、并已获取 TI AM335X 技术参考手册的指导。 除了没有 CRO (阴极射线振荡器)和 DCRO (数字阴极射线振荡器)来检查 SDA 和 SCL 之外,我还编写了访问 I2C 控制 器的步骤(逻辑),希望您能完成所有步骤并注意到我的故障。

步骤:-

步骤1:-启用 AM3358的 I2C2模块

     (a) 引脚化

          #define CNTRL_MDL 0X44E10000     //存储器映射地址,参考:- AM335X TRM 第2.1节,第158页

#define I2C_ADD   0x4819C000          //存储器映射地址:-参考:- AM3358 TRM 部分编号 2.1,第160页

#define MUX_ADD 0x800                        //多路复用器控制寄存器,参考:- AM335X TRM 部分编号 9.3、第758页

#define I2C2_SCL 0x17C

#define I2C2_SDA 0x178

Cntrl_mdl_base=ioremap (CNTRL_MDL、128*1024);

 i2C2_Add_base=ioremap (I2C2_ADD、4095);

writel_relaxed (0x00000013、CNTRL_MDL_BASK+MUX_Add+I2C2_SCL);

writel_relaxed (0x00000013、CNTRL_MDL_BASK+MUX_Add+I2C2_SDA);

(b)使能 I2C2的时钟

#define CM_PER 0x44E00000      //时钟模块寄存器地址参考:- AM335x TRM,第2.1节,页号.-157

cm_per_base=ioremap (cm_per、1024);

writel_relaxed (0x2、CM_PER_BASE+CM_PER_L4LS_CLKCTRL);   //参考:- AM335x TRM 段号 -8.1.12.1.20页码: -570

mdelay (5);

 writel_relaxed (0x2、CM_PER_BASE+CM_PER_I2C2_CLKCTRL); //参考:- AM335X TRM 段号:- 8.1.12.1.16页码:-566

mdelay (5);

步骤2:- I2C2模块配置       //参考 AM335X TRM 第21.3.15.1页第-3714页

(a)编程预分频器以获得12MHz 内部时钟频率(ICLK)并计算 SCLL 值和 SCLH 值

    writel_relaxed (0x03、I2C2_Add_base_I2C_PSC); //参考:- AM335X TRM,段号。 -21.4.1.22,第-3754页
       mdelay (10);
       writel_relaxed (0x31、I2C2_Add_base+I2C_SCLL); //参考:- AM335X TRM,部分编号:- 21.4.1.23,页码:- 3755
       mdelay (10);
       writel_relaxed (0x2B、I2C2_Add_base+I2C_SCLH);  //参考:- AM335X TRM 部分编号:- 21.4.1.24,页码:- 3756
       mdelay (10);

   

  
    
(b) I2C2初始化过程、数据计数寄存器配置和数据传输启动  

    

       writel_relaxed ((1<<15)、I2C2_Add_base+I2C_CON);//启用 I2C 模块,参考:- AM335x,部分编号:-21.4.1.19,页码:- 3749
       writel_relaxed (0x2、I2C2_Add_base_I2C_CNT);      //要传输的字节数量,参考:- AM335x,段号:- 4.1.21.17,页码:-3747 I     

     while ((readl_relaxed (I2C2_Add_base+I2C_IRQSTATUS_raw)&(1<<12)));// Check is Bus Free,Reference:- AM335x,Section No.:- 21.4.1.4 Page No.:- 3721
     PR_INFO (Kern_info"总线是免费的\n");

     udelay (1);   
       k=readl_relaxed (I2C2_Add_base_I2C_CON);
       writel_relaxed (1<<10|k、I2C2_Add_base+I2C_CON); //发送器模式,参考:- AM335X TRM 部分编号:- 21.4.1.19,页码:-3750

         k=readl_relaxed (I2C2_Add_base_I2C_CON);
       writel_relaxed (1<<0|k、I2C2_Add_base+I2C_CON);// 开始条件,参考:- AM335X TRM 部分编号:- 4.1.21.19页码:-3751
       udelay (5.5);
       k=readl_relaxed (I2C2_Add_base_I2C_CON);
       writel_relaxed (1<<1|k、I2C2_Add_base+I2C_CON); //停止条件,参考:- AM335X TRM 部分编号:- 21.4.1.19页码:- 3751

     k=readl_relaxed (I2C2_Add_base_I2C_CON);
       writel_relaxed (1<<9|k、I2C2_Add_base+I2C_CON);//启用发送器模式,参考:-AM335X TRM 部分编号:- 4.1.21.19页码:-3750

(c)写操作:-

 writel_relaxed (0x0D、I2C2_Add_base_I2C_Data);  //我正在尝试与地址为0x68的微型 RTC 模块(DS 1307)进行通信 TRM 建议发送带读/写位的地址并首先发送 MSB,因此我将发送0x0D。

while (!(readl_relaxed (I2C2_Add_base+I2C_IRQSTATUS_raw)&(1<<4)));
       PR_INFO ("数据已发送并准备好进行下 一个\n");
     微延迟(0.25);
       writel_relaxed (1<<4、I2C2_Add_base+I2C_IRQSTATUS_RAW);//清除位



 writel_relaxed (0x00,I2C2_Add_base+I2C_Data);  //我正在尝试访问从设备的地址0x00,参考:- AM335x TRM 部分编号:- 21.4.1.18,页码:-3748

while (!(readl_relaxed (I2C2_Add_base+I2C_IRQSTATUS_raw)&(1<<4))); //检查传输状态,参考:- AM335X TRM 部分编号:- 21.4.1.4,页码:-3725
       PR_INFO ("数据已发送并准备好进行下 一个\n");

(D)停止位检测

 while (!(readl_relaxed (I2C2_Add_base+I2C_IRQSTATUS_raw)&1<(2));//检查停止位的状态 ,参考:- AM335x TRM 部分编号:- 21.4.1.4,页码:- 3726

在上述所有步骤之后,才检测到启动条件,之后 SDA 线变为低电平的时间。我无法检查 SCL 和 SDA 信号,因为我没有数字 CRO 或 CRO 来检查波形。 很好的发现了我的错

谢谢你

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


    我将查看此内容并进行更新。 我看到这是一个 Linux 驱动程序,您正在使用 ioremap()& readl/writel_relaxed()函数。
    您能否共享这是哪个内核(哪个 SDK 版本)? 您是否已验证您是否已将自定义驱动程序包含在 Linux 版本(Kconfig)中并通过内核配置启用了您的驱动程序?

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    一 我正在使用 Linux 4.4.43
    2.是的,我已经通过内核配置启用了驱动程序

    感谢您的宝贵响应
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Yordan,您好!
    我恳请您尽快回复,我正在等待您的回复
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    器件型号:AM3358

    HII 团队、

    我正在使用 AM3358的 I2C2模块,但它不起作用。您是否可以建议我启用 I2C2模块的过程正确?

    步骤:-

    (a)针对 SCL 和 SDA 的 PINMUXING

    (b)我知道 I2C2属于外设域,因此我必须从 PRCM (电源复位时钟模块)启用它。

      -->从   CM_PER_L4LS_CLKCTRL 启用 L4LS 域(I2C2属于 L4域)   //参考:- AM335x TRM 段编号 -8.1.12.1.20页码: -570

       -->从 CM_PER_I2C2_CLKCTRL 中启用 I2C2的功能时钟 //参考:- AM335X TRM 部分编号:- 8.1.12.1.16页码:-566

    仅 从 PRCM 启用 I2C2模块是否需要执行其他步骤? 如果有其他问题,请注意。

    谢谢你

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    HII Yordan
    我仍在等待您的回复,我是否希望您的回复?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    HII Yordan、
    在过去七小时里,我一直在等待您的回复。 那么,我是否可以接受您在我的查询前放弃自己。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我一直在执行其他任务。 您的问题在我的队列中。 我将在明天中午之前公布我的调查结果。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的积极响应。
    我将於明日中午前等候您的回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是不是 Yordan 先生对我的查询进行了任何更新。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    I2C 初始化序列看起来正确。 但是、要检查您的设置是否已生效、您可以通过 devmem2查看 PRCM 和 CTRL 模块的寄存器值。 如果驱动程序未能正确设置寄存器、您可能需要使用 DTS 文件来启用 I2C2、即添加 i2c 节点并使用通过自定义驱动程序探测和初始化模块。

    至于读/写函数、请参阅 OMAP-i2c.c、i2c-core.c 和 i2c-dev.c 驱动程序、以了解协议的实现方式、每条指令之间所需的延迟等。

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