TI中文支持网
TI专业的中文技术问题搜集分享网站

am335x I2C1 连接 S-35390(RTC IC) 问题请教

大家好:

我是根据Startware中的 MLO 使用I2C0与PMIC例程来修改的。程序调试卡在  while(I2CMasterBusBusy(SOC_I2C_1_REGS) == 0); 详情如下:

一. 按照套路 修改pinmux,修改时钟初始化等,具体如下:

1. 使用I2C1  脚位E17、E18。

void  I2C_PinMuxSetup(void)

{

//I2C1_SCL  E17         

HWREG(SOC_CONTROL_REGS + CONTROL_CONF_UART_RTSN(0))  = 0x73;

 //I2C1_SDA  E18         

HWREG(SOC_CONTROL_REGS + CONTROL_CONF_UART_CTSN(0)) =  0x73;

}

2. 时钟初始化参考 startware_02_01_01\platform\evmAm335x\hsi3c.c中的void I2C1ModuleClkConfig(void),代码如下:

void I2C_1_ModuleClkConfig(void) (只是更改名称而已)

{    

HWREG(SOC_PRCM_REGS + CM_PER_L3S_CLKSTCTRL) |=                              CM_PER_L3S_CLKSTCTRL_CLKTRCTRL_SW_WKUP;

    while((HWREG(SOC_PRCM_REGS + CM_PER_L3S_CLKSTCTRL) &      CM_PER_L3S_CLKSTCTRL_CLKTRCTRL) != CM_PER_L3S_CLKSTCTRL_CLKTRCTRL_SW_WKUP);

    HWREG(SOC_PRCM_REGS + CM_PER_L3_CLKSTCTRL) |=                              CM_PER_L3_CLKSTCTRL_CLKTRCTRL_SW_WKUP;

    while((HWREG(SOC_PRCM_REGS + CM_PER_L3_CLKSTCTRL) &      CM_PER_L3_CLKSTCTRL_CLKTRCTRL) != CM_PER_L3_CLKSTCTRL_CLKTRCTRL_SW_WKUP);

    HWREG(SOC_PRCM_REGS + CM_PER_L3_INSTR_CLKCTRL) |=                              CM_PER_L3_INSTR_CLKCTRL_MODULEMODE_ENABLE;

    while((HWREG(SOC_PRCM_REGS + CM_PER_L3_INSTR_CLKCTRL) &                                CM_PER_L3_INSTR_CLKCTRL_MODULEMODE) !=                                    CM_PER_L3_INSTR_CLKCTRL_MODULEMODE_ENABLE);

    HWREG(SOC_PRCM_REGS + CM_PER_L3_CLKCTRL) |=                              CM_PER_L3_CLKCTRL_MODULEMODE_ENABLE;

    while((HWREG(SOC_PRCM_REGS + CM_PER_L3_CLKCTRL) &         CM_PER_L3_CLKCTRL_MODULEMODE) != CM_PER_L3_CLKCTRL_MODULEMODE_ENABLE);

    HWREG(SOC_PRCM_REGS + CM_PER_OCPWP_L3_CLKSTCTRL) |=                              CM_PER_OCPWP_L3_CLKSTCTRL_CLKTRCTRL_SW_WKUP;

    while((HWREG(SOC_PRCM_REGS + CM_PER_OCPWP_L3_CLKSTCTRL) &                               CM_PER_OCPWP_L3_CLKSTCTRL_CLKTRCTRL) !=                                 CM_PER_OCPWP_L3_CLKSTCTRL_CLKTRCTRL_SW_WKUP);

    HWREG(SOC_PRCM_REGS + CM_PER_L4LS_CLKSTCTRL) |=                              CM_PER_L4LS_CLKSTCTRL_CLKTRCTRL_SW_WKUP;

    while((HWREG(SOC_PRCM_REGS + CM_PER_L4LS_CLKSTCTRL) &                              CM_PER_L4LS_CLKSTCTRL_CLKTRCTRL) !=                                CM_PER_L4LS_CLKSTCTRL_CLKTRCTRL_SW_WKUP);

    HWREG(SOC_PRCM_REGS + CM_PER_L4LS_CLKCTRL) |=                              CM_PER_L4LS_CLKCTRL_MODULEMODE_ENABLE;

    while((HWREG(SOC_PRCM_REGS + CM_PER_L4LS_CLKCTRL) &       CM_PER_L4LS_CLKCTRL_MODULEMODE) != CM_PER_L4LS_CLKCTRL_MODULEMODE_ENABLE);

    HWREG(SOC_PRCM_REGS + CM_PER_I2C1_CLKCTRL) |=                              CM_PER_I2C1_CLKCTRL_MODULEMODE_ENABLE;

    while((HWREG(SOC_PRCM_REGS + CM_PER_I2C1_CLKCTRL) &       CM_PER_I2C1_CLKCTRL_MODULEMODE) != CM_PER_I2C1_CLKCTRL_MODULEMODE_ENABLE);

    while(!(HWREG(SOC_PRCM_REGS + CM_PER_L3S_CLKSTCTRL) &             CM_PER_L3S_CLKSTCTRL_CLKACTIVITY_L3S_GCLK));

    while(!(HWREG(SOC_PRCM_REGS + CM_PER_L3_CLKSTCTRL) &             CM_PER_L3_CLKSTCTRL_CLKACTIVITY_L3_GCLK));

    while(!(HWREG(SOC_PRCM_REGS + CM_PER_OCPWP_L3_CLKSTCTRL) &            (CM_PER_OCPWP_L3_CLKSTCTRL_CLKACTIVITY_OCPWP_L3_GCLK |             CM_PER_OCPWP_L3_CLKSTCTRL_CLKACTIVITY_OCPWP_L4_GCLK)));

    while(!(HWREG(SOC_PRCM_REGS + CM_PER_L4LS_CLKSTCTRL) &            (CM_PER_L4LS_CLKSTCTRL_CLKACTIVITY_L4LS_GCLK |             CM_PER_L4LS_CLKSTCTRL_CLKACTIVITY_I2C_FCLK)));

}

 

3. 修改I2C0的SetupReception(),改为I2C1的,代码如下:

void I2C_1_SetupReception(unsigned int recvlen)

{    

I  2CSetDataCount(SOC_I2C_1_REGS, 1);

    I2C_1_CleanupInterrupts();

    I2CMasterControl(SOC_I2C_1_REGS, I2C_CFG_MST_TX);     I2CMasterStart(SOC_I2C_1_REGS);

    while(I2CMasterBusBusy(SOC_I2C_1_REGS) == 0);   //调试时此处一直为真,不知为何?

    I2CMasterDataPut(SOC_I2C_1_REGS, dataToSlave[txCount]);    

   I2CMasterIntClearEx(SOC_I2C_1_REGS, I2C_INT_TRANSMIT_READY);    

。。。。

}

二. 另请教Am335x作为master, slave add如何设置呢? 我调试时使用0x40  , 35390的datasheet 如附件

不知还有哪里设置有问题,所以请大家帮助,先行谢过。

STONE:

哪位大侠可以帮忙看看啊?

肯定还有我没注意到的地方

andarm lin1:

回复 STONE:

貌似我也遇到类似的问题,请问一下解决了没有,是什么原因。

Yaoming Qin:

驱动的调用过程,您可以参考下starterware中的demoi2c.c 中的SetupI2CTransmit()中的调用循序。

Jian Zhou:

回复 Yaoming Qin:

请问有测试过I2C0么,不知道I2C1总线上的设备在硬件设计上和I2C0有什么区别,也有可能是硬件的的问题

STONE:

回复 Jian Zhou:

新年好!

谢谢诸位的提醒。

上述卡住的问题已解决。应该是在pinmux时出的问题。将 |= 改为 = 即可。

 

 目前遇到的问题是 在调试对S35390A的读写,读取寄存器时 MCU收到的数据总是FF,

同时I2C_IRQSTATUS_RAW=0x84, AERR错误位为真,

S35390A的datasheet中的描述 当master接收数据结束后master需要发送NO_ACK给它

想请问上图中的NO_ACK 对应到MCU  如何设置呢?

谢谢!

STONE:

回复 Jian Zhou:

嗯,正在查看中,赞无进展。

不知哪位 用过这颗RTC芯片,可否提供些读写的例子?目前抓取读\写时,MCU发送出的波形与其datasheet上的不一致,

发送命令不符合其要求导致问题的可能性较大。自己在不断尝试中,目前困惑如下:

1. 这颗IC的slaveAddress 设置数值是多少?目前我设置为0x30

2. dataToSlave[0]= 0xA0;然后调用SetupI2CTransmit(1)写STATUS1,个人认为发送成功。

 接着dataToSlave[0]= 0x61;然后调用SetupReceptiont(1)读STATUS1,读取时得到的数值为0xFF.与下图不一致,不知为何?

 

正在调试中,如果哪位仁兄有建议请不吝指教,谢谢!

 

 

STONE:

回复 STONE:

OK

赞(0)
未经允许不得转载:TI中文支持网 » am335x I2C1 连接 S-35390(RTC IC) 问题请教
分享到: 更多 (0)