|
楼主 |
发表于 2014-9-5 17:19:31
|
显示全部楼层
祝你好运,
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_Ms stm32f2xx 120MHz
* 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秒
/**
* @brief I2C 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_InitTypeDef GPIO_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[0], 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[7] = {0};
uint8 status = 0;
RTC_BufferRead(I2C1, (u8 *)&rtc_buf[0], RTC_W_DEVICE_ADR, 0x00, 7);
if(rtc_buf[0]>0x59) status|=1; //second
if(rtc_buf[1]>0x59) status|=2; //minute
if(rtc_buf[2]>0x23) status|=4; //hour
if(rtc_buf[3]>0x40) status|=8; //week
if((rtc_buf[4]>0x31) || (rtc_buf[4]<0x1))status|=10; //day
if((rtc_buf[5]>0x12) || (rtc_buf[5]<0x1))status|=20; //month
if((rtc_buf[6]<0x14) || (rtc_buf[6]>0x99)) status|=40; //year
if(status != 0)
{
printf("\r\n★ RTC Read Test Error ? %d", status);
RTC_RT8025_WriteInit_Clock();
}
RtcTime.year = ((((rtc_buf[6]&0xf0) >> 4) * 10) + (rtc_buf[6]&0x0f));
RtcTime.month = ((((rtc_buf[5]&0x10) >> 4) * 10) + (rtc_buf[5]&0x0f));
RtcTime.dom = ((((rtc_buf[4]&0x30) >> 4) * 10) + (rtc_buf[4]&0x0f));
RtcTime.dow = rtc_buf[3];
RtcTime.hour = ((((rtc_buf[2]&0x30) >> 4) * 10) + (rtc_buf[2]&0x0f));
RtcTime.min = ((((rtc_buf[1]&0x70) >> 4) * 10) + (rtc_buf[1]&0x0f));
RtcTime.sec = ((((rtc_buf[0]&0x70) >> 4) * 10) + (rtc_buf[0]&0x0f));
}
void RTC_RT8025_WriteInit_Clock(void)
{
unsigned char WTime[7]={0x25,0x16,0x10,0x01,0x04,0x08,0x14}; //2014-07-18 5 16:14:09
WriteRX8025(&WTime[0]);
}
//-----------------------------------------------------------------------------
// END
//-----------------------------------------------------------------------------
|
|