RX8025T 无应答, 怎么回事啊?
大侠们好,我的i2c上接的at24c64读写都非常的好,就是rx8025t 发送0x64 ( 应该是给rx8025t发送数据后就没有应答了 ) 后就没有反应了,
纠结
rx8025t 的第五脚接高电平了
QN8025???/???/ zouzhichao 发表于 2014-7-14 19:22
QN8025???/???/
rx8025, 不过已经搞定了,原来是搞硬件的工程师吧此芯片的第12脚接高电平了,只要悬空此脚就可以了, 分享的很好,以后别出错了 楼主你好,可以把你的程序共享一下吗,rx8025t 发送0x64 ( 应该是给rx8025t发送数据后就没有应答了 ) 后就没有反应了,烦死了 工程师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
//-----------------------------------------------------------------------------
hpdell 发表于 2014-9-5 17:19
祝你好运,
rx8025t的第12脚接地或者悬空,切记!!!
谢谢楼主的支持,找到无应答的原因了,我是软件模拟的IIC,IO配置完成后立即至高,无应答的问题就解决了。
但是现在读数据存在一些问题,读取多字节时,只能读出第一个字节,后面的全是零0,郁闷死了,我在琢磨琢磨 工程师030 发表于 2014-9-7 11:49
谢谢楼主的支持,找到无应答的原因了,我是软件模拟的IIC,IO配置完成后立即至高,无应答的问题就解决了 ...
我上面 的程序是没有问题的,你试一下硬件的 I2c hpdell 发表于 2014-9-7 18:05
我上面 的程序是没有问题的,你试一下硬件的 I2c
终于搞定了,我软件模拟的I2C用的是正点原子的,里面的ACK函数把SDA拉低后就没至高,所以后面的数据读出来全部是0,因此只能读一个字节。
也不知道是原子源程序是这样还是后来不知道怎么改掉了,总之找到问题就好了。
再次谢谢楼主!下次画板准备用硬件i2c和楼主的程序 本帖最后由 xunke 于 2014-10-11 23:21 编辑
hpdell 发表于 2014-7-14 20:02
rx8025, 不过已经搞定了,原来是搞硬件的工程师吧此芯片的第12脚接高电平了,只要悬空此脚就可以了, ...
官网手册的电路
请教你D1D2用什么型号的?电池用多少伏的?
我的D1 D2用IN4148 ,备用电池用3V的钮扣电池,电路掉电后RX8025不会走时,是不是备用电池电压不够?但手册说"时钟供电电压1.6---5.5V” xunke 发表于 2014-10-10 21:06
请教你D1D2用什么型号的?电池用多少伏的?
我的D1 D2用IN4148 ,备用电池用3V的钮扣电池,电路掉电后 ...
hpdell 发表于 2014-10-11 09:18
现在才知道官网上的手册的电路有的问题 R2 R3 应该接+5V 才能达到低功耗(约0.9uA),像官网手册的电路工作电流达到0.5mA. xunke 发表于 2014-10-11 23:25
现在才知道官网上的手册的电路有的问题 R2 R3 应该接+5V 才能达到低功耗(约0.9uA),像官网手册的电路工 ...
R2 R3 应该接+5V 才能达到低功耗(约0.9uA)
确定吗?官网没找到这样的说明 问题已出,答案已更;有始有终,共同进步,好贴 hpdell 发表于 2014-9-5 17:19
祝你好运,
rx8025t的第12脚接地或者悬空,切记!!!
(引用自6楼)
读取第一个秒后面的 数据全部读出来的是0不知道为什么?只能读取一个正确数据,如果想读取其他,需要单独再读一个数
写入时间可以连续一次写多个 zhcj66 发表于 2022-12-17 14:44
读取第一个秒后面的 数据全部读出来的是0不知道为什么?只能读取一个正确数据,如果想读取其他,需要单独 ...
(引用自15楼)
是不是你的 i2c 读取函数有问题 ? 或者是速度太快 ??
我现在都好久 没有使用这个芯片了 hpdell 发表于 2022-12-18 21:25
是不是你的 i2c 读取函数有问题 ? 或者是速度太快 ??
我现在都好久 没有使用这个芯片了 ...
(引用自16楼)
现在又用什么高级芯片了? 多少钱一个RX8025 zhcj66 发表于 2022-12-24 11:25
现在又用什么高级芯片了?
(引用自17楼)
目前使用 ds3231 hpdell 发表于 2023-2-22 12:09
目前使用 ds3231
(引用自19楼)
ds3231 哪种封装的 zhcj66 发表于 2023-2-26 19:50
ds3231 哪种封装的
(引用自20楼)
sop封装的,宝宝上一大堆, hpdell 发表于 2023-2-27 10:19
sop封装的,宝宝上一大堆,
(引用自21楼)
sop-8 不便宜啊
页:
[1]