hpdell 发表于 2014-7-14 16:43:48

RX8025T 无应答, 怎么回事啊?

大侠们好,我的i2c上接的at24c64读写都非常的好,

就是rx8025t 发送0x64 ( 应该是给rx8025t发送数据后就没有应答了 ) 后就没有反应了,

纠结

rx8025t 的第五脚接高电平了

zouzhichao 发表于 2014-7-14 19:22:50

QN8025???/???/

hpdell 发表于 2014-7-14 20:02:30

zouzhichao 发表于 2014-7-14 19:22
QN8025???/???/

rx8025, 不过已经搞定了,原来是搞硬件的工程师吧此芯片的第12脚接高电平了,只要悬空此脚就可以了,

iwqt1983 发表于 2014-7-15 09:33:14

分享的很好,以后别出错了

工程师030 发表于 2014-9-5 10:23:45

楼主你好,可以把你的程序共享一下吗,rx8025t 发送0x64 ( 应该是给rx8025t发送数据后就没有应答了 ) 后就没有反应了,烦死了

hpdell 发表于 2014-9-5 17:19:31

工程师030 发表于 2014-9-5 10:23
楼主你好,可以把你的程序共享一下吗,rx8025t 发送0x64 ( 应该是给rx8025t发送数据后就没有应答了 ) 后就 ...


祝你好运,

rx8025t的第12脚接地或者悬空,切记!!!

#ifndef __IIC_H
#define __IIC_H


#include "stm32f2xx.h"


#include "stm32f2xx_gpio.h"

#ifndef OFF
#define OFF 0L
#endif


#ifndef ON
#define ON 1L
#endif


extern I2C_InitTypeDef I2C_InitStructure;



#define I2C_PageSize                  (32)
#define I2C_MAX_PAGE_NUM         (I2C_MAX_ADDR / I2C_PageSize)
#define MEM_SIZE                      (0x1fff)

#define I2C_MAX_ADDR         ((MEM_SIZE+1)*DEV_24CXX_NUM-1)    //最大寻址范围

// Private define ------------------------------------------------------------
#define I2C_START_READ                    0x01
#define EEPROM_ADDRESS                 0xA0


#define I2C_TIME                ((u32)40960)


//#define I2C_SPEED (350000)

#define I2C_SPEED (300000)
#define I2C_DUTYCYCLE I2C_DutyCycle_2


void I2C_UserInit(I2C_TypeDef* I2Cx);



u8 RTC_ByteWrite(I2C_TypeDef* I2Cx, u8* pBuffer, u8 SlaveAddr, u8 WriteAddr);
u8 RTC_PageWrite(I2C_TypeDef* I2Cx, u8* pBuffer, u8 SlaveAddr, u8 WriteAddr, u16 NumByteToWrite);
u8 RTC_BufferRead(I2C_TypeDef* I2Cx, u8* pBuffer, u8 SlaveAddr, u8 ReadAddr, u16 NumByteToRead);

#endif


iic.c



#include "iic.h"
#include "stm32f2xx_i2c.h"

#include "usart.h"


I2C_InitTypeDef I2C_InitStructure;

vu32 I2C_TimeCnt;


/*******************************************************************************
* Function Name: Delay_Msstm32f2xx120MHz
* Description    : delay 1 ms.
* Input          : time (ms)
* Output         : None
* Return         : None
*******************************************************************************/

void delay_ms(u16 time)//延时函数
{
        u16 i,j;
        for(i=0;i<time;i++)
                for(j=0;j<20000;j++)
                    ;
}




/* Maximum number of trials for sEE_WaitEepromStandbyState() function */
#define sEE_MAX_TRIALS_NUMBER   300

void I2C_GPIO_Configuration(I2C_TypeDef* I2Cx)
{
        GPIO_InitTypeDef GPIO_InitStruct;
       
        if(I2C1 == I2Cx)
        {
                RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);

                //配置复用管脚SCL(PB8) 和 SDA(PB9)连接到I2Cx
                GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_I2C1);                //SCL               
                GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_I2C1);                //SDA       

                GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
                GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
                GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
                GPIO_InitStruct.GPIO_OType = GPIO_OType_OD;
                GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
                GPIO_Init(GPIOB, &GPIO_InitStruct);
        }
       
       
        //---------- I2C EE24C64 WP
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_Init(GPIOB, &GPIO_InitStruct);       
       
        //GPIO_SetBits(GPIOB, GPIO_Pin_5);                        //禁止写
       
        GPIO_ResetBits(GPIOB, GPIO_Pin_5);                        //允许读/写
       
}



void I2C_Configuration(I2C_TypeDef* I2Cx)
{
        if(I2C1 == I2Cx)
        {
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
                I2C_InitStructure.I2C_ClockSpeed = I2C_SPEED;         // 该参数用来设置时钟频率
                I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;            // 设置I2C为I2C模式 ;
                I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;    // I2C快速模式Tlow / Thigh = 2 ;
                I2C_InitStructure.I2C_OwnAddress1 = I2C_START_READ;   //作为从机时的地址1
                I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;         // 用来设置第一个设备自身地址
                I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;   // 应答7位地址 ;

                I2C_Cmd(I2Cx, ENABLE);                  // 使能I2Cx外设 ;
                I2C_Init(I2Cx, &I2C_InitStructure);              // 初始化外设I2Cx寄存器 ;

                //I2C_AcknowledgeConfig(I2Cx, ENABLE);    //允许1字节1应答模式
        }           
}


void I2C_UserInit(I2C_TypeDef* I2Cx)
{
    I2C_GPIO_Configuration(I2Cx);
    I2C_Configuration(I2Cx);
}



static u8 I2Cx_FlagBusy(I2C_TypeDef* I2Cx)
{
        I2C_TimeCnt = I2C_TIME;
while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY))
{
                if((I2C_TimeCnt--) == 0)
                        return ERROR;       
}
   
return SUCCESS;
}


static u8 I2Cx_MasterModeSelectEv5(I2C_TypeDef* I2Cx)
{
        I2C_TimeCnt = I2C_TIME;
        while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT))
{
                if((I2C_TimeCnt--) == 0)
                        return ERROR;       
}
   
return SUCCESS;
}


static u8 I2Cx_MasterTranModeSelectEv6(I2C_TypeDef* I2Cx)
{
        I2C_TimeCnt = I2C_TIME;               
        while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
{
                if((I2C_TimeCnt--) == 0)
                        return ERROR;
}
return SUCCESS;
}


static u8 I2Cx_MasterReceiverModeSelectionEv6(I2C_TypeDef* I2Cx)
{
I2C_TimeCnt = I2C_TIME;
while(!I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))
{
    if((I2C_TimeCnt--) == 0)
      return ERROR;               
}
return SUCCESS;
}


static u8 I2Cx_MasterByteTranEv8(I2C_TypeDef* I2Cx)
{
I2C_TimeCnt = I2C_TIME;
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTING))
{
    if((I2C_TimeCnt--) == 0)
       return ERROR;
}
return SUCCESS;
}






//------------------------- RTC -------------------------
//------------------------- RTC -------------------------
//------------------------- RTC -------------------------
u8 RTC_ByteWrite(I2C_TypeDef* I2Cx, u8* pBuffer, u8 SlaveAddr, u8 WriteAddr)

{
        if(I2Cx_FlagBusy(I2Cx) == ERROR)
                return ERROR;       

        I2C_GenerateSTART(I2Cx, ENABLE);
        if((I2Cx_MasterModeSelectEv5(I2Cx)) == ERROR)
        {
                return ERROR;               
        }

        I2C_Send7bitAddress(I2Cx, (u8)(SlaveAddr & 0xfe), I2C_Direction_Transmitter);
        if((I2Cx_MasterTranModeSelectEv6(I2Cx)) == ERROR)
        {
                I2C_GenerateSTOP(I2Cx, ENABLE);
                return ERROR;               
        }      

        I2Cx->DR = (u8)(WriteAddr);
        if((I2Cx_MasterByteTranEv8(I2Cx)) == ERROR)
        {
                I2C_GenerateSTOP(I2Cx, ENABLE);
                return ERROR;               
        }

        //--------------------------------------------------------------------
        //Send the byte to be written
        I2Cx->DR = *pBuffer;
        if((I2Cx_MasterByteTranEv8(I2Cx)) == ERROR)
        {
                I2C_GenerateSTOP(I2Cx, ENABLE);
                return ERROR;               
        }

        I2C_GenerateSTOP(I2Cx, ENABLE);

        delay_ms(8);
        return SUCCESS;
}



u8 RTC_PageWrite(I2C_TypeDef* I2Cx, u8* pBuffer, u8 SlaveAddr, u8 WriteAddr, u16 NumByteToWrite)

{
        if(I2Cx_FlagBusy(I2Cx) == ERROR)
                return ERROR;          

        I2C_GenerateSTART(I2Cx, ENABLE);   
        if((I2Cx_MasterModeSelectEv5(I2Cx)) == ERROR)
        {
                I2C_GenerateSTOP(I2Cx, ENABLE);
                return ERROR;               
        }

        I2C_Send7bitAddress(I2Cx, (SlaveAddr & 0xfe), I2C_Direction_Transmitter);
        if(I2Cx_MasterTranModeSelectEv6(I2Cx) == ERROR)
        {
                I2C_GenerateSTOP(I2Cx, ENABLE);
                return ERROR;               
        }       
               
        I2Cx->DR = (u8)(WriteAddr);
        if((I2Cx_MasterByteTranEv8(I2Cx)) == ERROR)
        {
                I2C_GenerateSTOP(I2Cx, ENABLE);
                return ERROR;               
        }

        while(NumByteToWrite--)             //While there is data to be written
        {
                I2Cx->DR = *pBuffer;
                pBuffer++;                     

                if((I2Cx_MasterByteTranEv8(I2Cx)) == ERROR)
                        return ERROR;
        }

        I2C_GenerateSTOP(I2Cx, ENABLE);
        //delay_ms(5);   
        return SUCCESS;
}


u8 RTC_BufferRead(I2C_TypeDef* I2Cx, u8* pBuffer, u8 SlaveAddr, u8 ReadAddr, u16 NumByteToRead)

{
        if(I2Cx_FlagBusy(I2Cx) == ERROR)
                return ERROR;

        I2C_GenerateSTART(I2Cx, ENABLE);
        if((I2Cx_MasterModeSelectEv5(I2Cx)) == ERROR)
        {
                I2C_GenerateSTOP(I2Cx, ENABLE);
                return ERROR;               
        }


        I2Cx->DR = (u8)(SlaveAddr & 0xfe);      
        if(I2Cx_MasterTranModeSelectEv6(I2Cx) == ERROR)   
        {
                I2C_GenerateSTOP(I2Cx, ENABLE);
                return ERROR;               
        }               

        I2C_Cmd(I2Cx, ENABLE);            // Clear EV6 by setting again the PE bit


        I2Cx->DR = (u8)(ReadAddr);
        if((I2Cx_MasterByteTranEv8(I2Cx)) == ERROR)
        {
                I2C_GenerateSTOP(I2Cx, ENABLE);
                return ERROR;               
        }

        I2C_GenerateSTOP(I2Cx, ENABLE);      


        //--------------------------------------------------------------------------------
        //--------------------------------------------------------------------------------
        //--------------------------------------------------------------------------------

        I2C_GenerateSTART(I2Cx, ENABLE);
        if((I2Cx_MasterModeSelectEv5(I2Cx)) == ERROR)
                return ERROR;       


        I2Cx->DR = (u8)((SlaveAddr & 0xfe) | I2C_START_READ);
        if((I2Cx_MasterReceiverModeSelectionEv6(I2Cx)) == ERROR)
        {
                I2C_GenerateSTOP(I2Cx, ENABLE);
                return ERROR;               
        }

        //if((I2Cx_MasterByteReceivedEv7(I2Cx)) == ERROR)
        //        return ERROR;


        while(NumByteToRead)      //While there is data to be read
        {
                if(NumByteToRead == 1)   
                {
                        I2C_AcknowledgeConfig(I2Cx, DISABLE);
                        I2C_GenerateSTOP(I2Cx, ENABLE);
                }

                if(I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED))
                {      
                        *pBuffer = I2Cx->DR;      
                        pBuffer++;
                        NumByteToRead--;   
                        I2C_AcknowledgeConfig(I2Cx, ENABLE);   
                }   
        }
       
        I2C_GenerateSTOP(I2Cx, ENABLE);
        return SUCCESS;
}









/******************************************************************************************************
文件名:HardRTC.c
描述:硬时钟总线的子程序。
*****************************************************************************************************/

#include <includes.h>

#include "rt8025rtc.h"
#include "bsp.h"

#include "iic.h"



//设置固定周期报警时间
#define SET_PERIOD_TIME         60 //以秒为单位,范围:0-250秒
/**
* @briefI2C port definitions
*/
#define IOE_I2C                        I2C1
#define IOE_I2C_CLK                      RCC_APB1Periph_I2C1
#define IOE_I2C_SCL_PIN                  GPIO_Pin_6
#define IOE_I2C_SCL_GPIO_PORT            GPIOB
#define IOE_I2C_SCL_GPIO_CLK             RCC_AHB1Periph_GPIOB
#define IOE_I2C_SCL_SOURCE               GPIO_PinSource6
#define IOE_I2C_SCL_AF                   GPIO_AF_I2C1
#define IOE_I2C_SDA_PIN                  GPIO_Pin_9
#define IOE_I2C_SDA_GPIO_PORT            GPIOB
#define IOE_I2C_SDA_GPIO_CLK             RCC_AHB1Periph_GPIOB
#define IOE_I2C_SDA_SOURCE               GPIO_PinSource9
#define IOE_I2C_SDA_AF                   GPIO_AF_I2C1
#define IOE_I2C_DR                     ((uint32_t)0x40005410)

#define IOE_DMA_CLK                      RCC_AHB1Periph_DMA1
#define IOE_DMA_CHANNEL                  DMA_Channel_1
#define IOE_DMA_TX_STREAM                DMA1_Stream6   
#define IOE_DMA_RX_STREAM                DMA1_Stream0
#define IOE_DMA_TX_TCFLAG                DMA_FLAG_TCIF6
#define IOE_DMA_RX_TCFLAG                DMA_FLAG_TCIF0


#define TIMEOUT_MAX    0x3000 /*<! The value of the maximal timeout for I2C waiting loops */


uint32_t IOE_TimeOut = TIMEOUT_MAX; /*<! Value of Timeout when I2C communication fails */





void RTC_RT8025_RW_Init(void)
{
        GPIO_InitTypeDefGPIO_InitStructure;
       
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);                       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        //SYSCFG->CMPCR = 0x00000001;                                                                                 //使用IO 补偿单元,
                                                                                                                                                //当GPIO 速度超过50M 的时候要考虑使用此设置       
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_Init(GPIOF, &GPIO_InitStructure);
       
        RX8025_RW_EN;

}






unsigned char WriteRX8025(unsigned char *Wt)
{   
        uint8 i;

        RTC_PageWrite(I2C1, (unsigned char *)&Wt, RTC_W_DEVICE_ADR, 0, 7);

        i = 0;
        RTC_ByteWrite(I2C1, &i, RTC_W_DEVICE_ADR, 0x0d);
        i = 0;
        RTC_ByteWrite(I2C1, &i, RTC_W_DEVICE_ADR, 0x0e);       
        i = 0x40;
        RTC_ByteWrite(I2C1, &i, RTC_W_DEVICE_ADR, 0x0f);                        //2.0s(默认)
       
       
        return 0;       
       
       
       
}






void RTC_RT8025_Read_Clock(void)
{
        uint8 rtc_buf = {0};
        uint8 status = 0;

        RTC_BufferRead(I2C1, (u8 *)&rtc_buf, RTC_W_DEVICE_ADR, 0x00, 7);

        if(rtc_buf>0x59) status|=1;                //second
        if(rtc_buf>0x59) status|=2;                //minute
        if(rtc_buf>0x23) status|=4;                //hour
        if(rtc_buf>0x40) status|=8;                //week
        if((rtc_buf>0x31) || (rtc_buf<0x1))status|=10;                //day
        if((rtc_buf>0x12) || (rtc_buf<0x1))status|=20;                //month
        if((rtc_buf<0x14) || (rtc_buf>0x99))status|=40;                //year
       
        if(status != 0)
        {
                printf("\r\n★   RTC Read Test Error ? %d", status);
                RTC_RT8025_WriteInit_Clock();
        }       
       
        RtcTime.year= ((((rtc_buf&0xf0) >> 4) * 10) + (rtc_buf&0x0f));
        RtcTime.month = ((((rtc_buf&0x10) >> 4) * 10) + (rtc_buf&0x0f));
        RtcTime.dom =   ((((rtc_buf&0x30) >> 4) * 10) + (rtc_buf&0x0f));

        RtcTime.dow =   rtc_buf;       

        RtcTime.hour = ((((rtc_buf&0x30) >> 4) * 10) + (rtc_buf&0x0f));
        RtcTime.min= ((((rtc_buf&0x70) >> 4) * 10) + (rtc_buf&0x0f));
        RtcTime.sec= ((((rtc_buf&0x70) >> 4) * 10) + (rtc_buf&0x0f));
}


void RTC_RT8025_WriteInit_Clock(void)
{
        unsigned char WTime={0x25,0x16,0x10,0x01,0x04,0x08,0x14};   //2014-07-18 5 16:14:09
       
        WriteRX8025(&WTime);
}







//-----------------------------------------------------------------------------
// END
//-----------------------------------------------------------------------------


















工程师030 发表于 2014-9-7 11:49:51

hpdell 发表于 2014-9-5 17:19
祝你好运,

rx8025t的第12脚接地或者悬空,切记!!!


谢谢楼主的支持,找到无应答的原因了,我是软件模拟的IIC,IO配置完成后立即至高,无应答的问题就解决了。
但是现在读数据存在一些问题,读取多字节时,只能读出第一个字节,后面的全是零0,郁闷死了,我在琢磨琢磨

hpdell 发表于 2014-9-7 18:05:37

工程师030 发表于 2014-9-7 11:49
谢谢楼主的支持,找到无应答的原因了,我是软件模拟的IIC,IO配置完成后立即至高,无应答的问题就解决了 ...

我上面 的程序是没有问题的,你试一下硬件的 I2c

工程师030 发表于 2014-9-9 11:01:52

hpdell 发表于 2014-9-7 18:05
我上面 的程序是没有问题的,你试一下硬件的 I2c

终于搞定了,我软件模拟的I2C用的是正点原子的,里面的ACK函数把SDA拉低后就没至高,所以后面的数据读出来全部是0,因此只能读一个字节。
也不知道是原子源程序是这样还是后来不知道怎么改掉了,总之找到问题就好了。
再次谢谢楼主!下次画板准备用硬件i2c和楼主的程序

xunke 发表于 2014-10-10 21:06:34

本帖最后由 xunke 于 2014-10-11 23:21 编辑

hpdell 发表于 2014-7-14 20:02
rx8025, 不过已经搞定了,原来是搞硬件的工程师吧此芯片的第12脚接高电平了,只要悬空此脚就可以了, ...
官网手册的电路
请教你D1D2用什么型号的?电池用多少伏的?
我的D1 D2用IN4148 ,备用电池用3V的钮扣电池,电路掉电后RX8025不会走时,是不是备用电池电压不够?但手册说"时钟供电电压1.6---5.5V”

hpdell 发表于 2014-10-11 09:18:17

xunke 发表于 2014-10-10 21:06
请教你D1D2用什么型号的?电池用多少伏的?
我的D1 D2用IN4148 ,备用电池用3V的钮扣电池,电路掉电后 ...





xunke 发表于 2014-10-11 23:25:51

hpdell 发表于 2014-10-11 09:18


现在才知道官网上的手册的电路有的问题 R2 R3 应该接+5V 才能达到低功耗(约0.9uA),像官网手册的电路工作电流达到0.5mA.

bolizhicheng204 发表于 2019-9-25 14:49:46

xunke 发表于 2014-10-11 23:25
现在才知道官网上的手册的电路有的问题 R2 R3 应该接+5V 才能达到低功耗(约0.9uA),像官网手册的电路工 ...

R2 R3 应该接+5V 才能达到低功耗(约0.9uA)
确定吗?官网没找到这样的说明

xiaoquguang 发表于 2019-12-9 11:38:12

问题已出,答案已更;有始有终,共同进步,好贴

zhcj66 发表于 2022-12-17 14:44:52

hpdell 发表于 2014-9-5 17:19
祝你好运,

rx8025t的第12脚接地或者悬空,切记!!!
(引用自6楼)

读取第一个秒后面的 数据全部读出来的是0不知道为什么?只能读取一个正确数据,如果想读取其他,需要单独再读一个数

写入时间可以连续一次写多个

hpdell 发表于 2022-12-18 21:25:55

zhcj66 发表于 2022-12-17 14:44
读取第一个秒后面的 数据全部读出来的是0不知道为什么?只能读取一个正确数据,如果想读取其他,需要单独 ...
(引用自15楼)

是不是你的 i2c 读取函数有问题 ? 或者是速度太快 ??

我现在都好久 没有使用这个芯片了

zhcj66 发表于 2022-12-24 11:25:02

hpdell 发表于 2022-12-18 21:25
是不是你的 i2c 读取函数有问题 ? 或者是速度太快 ??

我现在都好久 没有使用这个芯片了 ...
(引用自16楼)

现在又用什么高级芯片了?

lfgc 发表于 2023-1-3 17:18:44

多少钱一个RX8025

hpdell 发表于 2023-2-22 12:09:46

zhcj66 发表于 2022-12-24 11:25
现在又用什么高级芯片了?
(引用自17楼)

目前使用 ds3231

zhcj66 发表于 2023-2-26 19:50:37

hpdell 发表于 2023-2-22 12:09
目前使用 ds3231
(引用自19楼)

ds3231 哪种封装的

hpdell 发表于 2023-2-27 10:19:35

zhcj66 发表于 2023-2-26 19:50
ds3231 哪种封装的
(引用自20楼)

sop封装的,宝宝上一大堆,

zhcj66 发表于 2023-2-27 16:04:50

hpdell 发表于 2023-2-27 10:19
sop封装的,宝宝上一大堆,
(引用自21楼)

sop-8 不便宜啊
页: [1]
查看完整版本: RX8025T 无应答, 怎么回事啊?