您好的团队,
当天的问候!
我在 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 来检查波形。 很好的发现了我的错
谢谢你