am335x 读取pcf85163时间



测试工程实例hsi2cTempSensor ,我现在想这个基础上修改下读出PCF85163的时间,我的操作是把configData修改成从机地址,I2C端口修改下。调试出现无应答的错误。是不是还需要修改一些其它的东西。

我用的平台是CCS5.2,用的是自己的平台,BSD是AM335X_StarterWare_02_00_00_07,谢谢大神的指教,刚接触,谢谢。

  • 使用的是I2C2(D18 D17) 读取PCF8563时间   平台是CCS5.2,用的是自己的平台,BSD是AM335X_StarterWare_02_00_00_07  

    部分发代码如下:

    main(){

       IntMasterIRQEnable();

       I2CAintcConfigure();

     

      I2CPinMuxSetup(1);

       I2CMasterDisable(SOC_I2C_2_REGS);

        I2CAutoIdleDisable(SOC_I2C_2_REGS);

        I2CMasterInitExpClk(SOC_I2C_2_REGS, 48000000, 12000000, 400000);

        I2CMasterSlaveAddrSet(SOC_I2C_2_REGS, I2C_SLAVE_ADDR);  //此处设置的从机地址是写(A3)

        I2CMasterEnable(SOC_I2C_2_REGS);

       configData  = 0xA2

       ConfigureTimeSensor(configData)   //发送写

     

       configData  = 0x02

       ConfigureTimeSensor(configData)   //发送从机地址

     

       configData  = 0x02 | 0x01

       ConfigureTimeSensor(configData)   //发送读模式

     

       configData = 0x02

       TimeRegRead(time, configData);  //读指令

     

    }

     

    static void ConfigureTempSensor(unsigned char configData){

        dataToSlave[0] =configData;

        tCount = 0;    

       SetupI2CTransmit(1);

    }

    在调试的过程中,每次发送数据就会停止在SetupI2CTransmit里面的while(flag)等待。一直执行不下去,是不是哪个地方设置有问题,还有就是对 SetupI2CTransmit函数理解错误了,求指导,谢谢了。

     

     

  • 有时间可以给一个am335x 的I2C2的一个使用例程。我修改使用I2C2读取pcf8563时间(祼机跑),可是无法正常执行下去(修改时钟、管脚)。已经好几天了,还是没有解决问题。刚入手,谢谢。修改后的代码如下:

    main(){   

    I2CAintcConfigure();

        SetupI2C();

      configData = 0xA2 ;
      ConfigureTimeSensor(configData);

      ptrReg = 0x02;

    TemperatureRegRead(temperature, ptrReg);

    }

    static void SetupI2C(void)
    {
    // I2C1ModuleClkConfig(); // I2C2 clk module
    I2C2ModuleClkConfig();
    I2CPinMuxSetup(2);

    /* Put i2c in reset/disabled state */
    I2CMasterDisable(SOC_I2C_2_REGS);

    /*
    ** Upon reset Auto Idel is enabled.
    ** Hence it is disabled after reset
    */
    I2CAutoIdleDisable(SOC_I2C_2_REGS);

    /* Configure i2c bus speed to 400khz */
    I2CMasterInitExpClk(SOC_I2C_2_REGS, 48000000, 12000000, 400000);

    /* Set i2c slave address */
    I2CMasterSlaveAddrSet(SOC_I2C_2_REGS, I2C_SLAVE_ADDR);   //0xA2

    /* Bring I2C module out of reset */
    I2CMasterEnable(SOC_I2C_2_REGS);
    }

    void I2CPinMuxSetup(unsigned int instance)
    {

    if(instance == 0)
    {
    HWREG(SOC_CONTROL_REGS + CONTROL_CONF_I2C0_SDA) =
    (CONTROL_CONF_I2C0_SDA_CONF_I2C0_SDA_RXACTIVE |
    CONTROL_CONF_I2C0_SDA_CONF_I2C0_SDA_SLEWCTRL |
    CONTROL_CONF_I2C0_SDA_CONF_I2C0_SDA_PUTYPESEL );

    HWREG(SOC_CONTROL_REGS + CONTROL_CONF_I2C0_SCL) =
    (CONTROL_CONF_I2C0_SCL_CONF_I2C0_SCL_RXACTIVE |
    CONTROL_CONF_I2C0_SCL_CONF_I2C0_SCL_SLEWCTRL |
    CONTROL_CONF_I2C0_SCL_CONF_I2C0_SCL_PUTYPESEL );

    }
    else if(instance == 1)
    {
    /* I2C_SCLK */
    HWREG(SOC_CONTROL_REGS + CONTROL_CONF_SPI0_D1) =
    (CONTROL_CONF_SPI0_D1_CONF_SPI0_D1_PUTYPESEL |
    CONTROL_CONF_SPI0_D1_CONF_SPI0_D1_RXACTIVE |
    CONTROL_CONF_SPI0_D1_CONF_SPI0_D1_SLEWCTRL |
    CONTROL_CONF_MUXMODE(2));
    /* I2C_SDA */
    HWREG(SOC_CONTROL_REGS + CONTROL_CONF_SPI0_CS0) =
    (CONTROL_CONF_SPI0_CS0_CONF_SPI0_CS0_PUTYPESEL |
    CONTROL_CONF_SPI0_CS0_CONF_SPI0_CS0_RXACTIVE |
    CONTROL_CONF_SPI0_D1_CONF_SPI0_D1_SLEWCTRL |
    CONTROL_CONF_MUXMODE(2));

    }
    else if(instance == 2)
    {
    /* I2C_SCLK */
    HWREG(SOC_CONTROL_REGS + CONTROL_CONF_UART_RTSN(1)) =
    (CONTROL_CONF_SPI0_D1_CONF_SPI0_D1_PUTYPESEL |
    CONTROL_CONF_SPI0_D1_CONF_SPI0_D1_RXACTIVE |
    CONTROL_CONF_SPI0_D1_CONF_SPI0_D1_SLEWCTRL |
    CONTROL_CONF_MUXMODE(2));
    /* I2C_SDA */
    HWREG(SOC_CONTROL_REGS + CONTROL_CONF_UART_CTSN(1)) =
    (CONTROL_CONF_SPI0_CS0_CONF_SPI0_CS0_PUTYPESEL |
    CONTROL_CONF_SPI0_CS0_CONF_SPI0_CS0_RXACTIVE |
    CONTROL_CONF_SPI0_D1_CONF_SPI0_D1_SLEWCTRL |
    CONTROL_CONF_MUXMODE(2));
    }
    }

    /*
    ** I2C Interrupt Service Routine. This function will read and write
    ** data through I2C bus.
    */
    void I2CIsr(void)
    {
    unsigned int status = 0;

    /* Get only Enabled interrupt status */
    status = I2CMasterIntStatus(SOC_I2C_2_REGS);

    /*
    ** Clear all enabled interrupt status except receive ready and
    ** transmit ready interrupt status
    */
    I2CMasterIntClearEx(SOC_I2C_2_REGS,
    (status & ~(I2C_INT_RECV_READY | I2C_INT_TRANSMIT_READY)));

    if(status & I2C_INT_RECV_READY)
    {
    /* Receive data from data receive register */
    dataFromSlave[rCount++] = I2CMasterDataGet(SOC_I2C_2_REGS);

    /* Clear receive ready interrupt status */
    I2CMasterIntClearEx(SOC_I2C_2_REGS, I2C_INT_RECV_READY);

    if(rCount == numOfBytes)
    {
    /* Disable the receive ready interrupt */
    I2CMasterIntDisableEx(SOC_I2C_2_REGS, I2C_INT_RECV_READY);

    /* Generate a STOP */
    I2CMasterStop(SOC_I2C_2_REGS);

    }


    }
    if (status & I2C_INT_TRANSMIT_READY)
    {
    /* Put data to data transmit register of i2c */
    I2CMasterDataPut(SOC_I2C_2_REGS, dataToSlave[tCount++]);

    /* Clear Transmit interrupt status */
    I2CMasterIntClearEx(SOC_I2C_2_REGS, I2C_INT_TRANSMIT_READY);

    if(tCount == numOfBytes)
    {
    /* Disable the transmit ready interrupt */
    I2CMasterIntDisableEx(SOC_I2C_2_REGS, I2C_INT_TRANSMIT_READY);

    }

    }

    if (status & I2C_INT_STOP_CONDITION)
    {
    /* Disable transmit data ready and receive data read interupt */
    I2CMasterIntDisableEx(SOC_I2C_2_REGS, I2C_INT_TRANSMIT_READY |
    I2C_INT_RECV_READY |
    I2C_INT_STOP_CONDITION);
    flag = 0;
    }

    if(status & I2C_INT_NO_ACK)
    {
    I2CMasterIntDisableEx(SOC_I2C_2_REGS, I2C_INT_TRANSMIT_READY |
    I2C_INT_RECV_READY |
    I2C_INT_NO_ACK |
    I2C_INT_STOP_CONDITION);
    /* Generate a STOP */
    I2CMasterStop(SOC_I2C_2_REGS);

    flag = 0;
    }
    }

  • static void ConfigureTimeSensor(unsigned char configData)
    {
    dataToSlave[0] = configData;

    tCount = 0;
    SetupI2CTransmit(1);
    }

    /* Reads temperature value */
    static void TemperatureRegRead(unsigned char *data, unsigned char ptrReg)
    {
    unsigned int i;
    rCount = 0;
    tCount = 0;

    /* Reg offset of temperature sensor */
    dataToSlave[0] = ptrReg;
    SetupI2CReception(7);

    for(i = 7; i ; i--)
    {
    *data = dataFromSlave[7-i];
    data++;
    }
    }

  • 建议楼主下次发到Sitara论坛版块讨论 http://www.deyisupport.com/question_answer/dsp_arm/sitara_arm/f/25.aspx