| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594 |
- /*--------------------------------------------------------------------------------------
- * @file FM31256.c
- * @author ZhangJing
- * @version base on stm32f0x
- * @date 2015.09.11
- * @brief FM31256驱动
- ---------------------------------------------------------------------------------------*/
- /*--------------------------------------------------------------------------------------
- * @file FM31256.c
- * @author ZhangJing
- * @version base on stm32f0x
- * @date 2015.09.11
- * @brief FM31256驱动
- ---------------------------------------------------------------------------------------*/
- #include "stm32f10x_gpio.h"
- #include "TypeDefine.h"
- #include "IICSetup.h"
- #include "FM31256.h"
- /*************************************************************************************
- * Function: hex_to_bcd
- * Object: 十六进数转换成BCD码
- * 输入: unsigned char condata需转换数据
- * 输出: 转换完成的BCD码
- * 备注: unsigned char temp;
- unsigned char temp0;
- unsigned char temp10; 做数据计算的临时变量
- **************************************************************************************/
- unsigned char hex_to_bcd(unsigned char condata)
- {
- unsigned char temp;
- unsigned char temp0;
- unsigned char temp10;
- temp10=condata/10;
- temp0=condata%10;
- temp=(temp10<<4)|temp0;
- return(temp);
- }
- /*************************************************************************************
- * Function: bcd_to_hex
- * Object: BCD码转换成十六进制数
- * 输入: unsigned char condata需转换数据
- * 输出: 转换完成的BCD码
- * 备注: unsigned char temp;
- unsigned char temp0;
- unsigned char temp10; 做数据计算的临时变量
- **************************************************************************************/
- unsigned char bcd_to_hex(unsigned char condata)
- {
- unsigned char temp;
- unsigned char temp0;
- unsigned char temp10;
- temp10=(condata&0xF0)>>4;
- temp0=condata&0x0F;
- temp=temp10*10+temp0;
- return(temp);
- }
- /*************************************************************************************
- * Function: Read_Reg
- * Object: 读取FM31256寄存器
- * 输入: unsigned char addr, 读取地址 unsigned char *ucDataPtr 读取数据存储指针
- * 输出: 返回读取状态
- * 备注: unsigned char read_data=0xaa;读取数据
- unsigned char tempState = 0;状态值
- **************************************************************************************/
- unsigned char Read_Reg(unsigned char addr, unsigned char *ucDataPtr)
- {
- unsigned char read_data=0xaa;
- unsigned char tempState = 0;
-
- //启动
- if(RTC_START()!=RTC_READY)
- return 0;
- //TWI_START();
- //从机地址写入
- tempState = RTC_SendByte( Const_REG_ADDR + Const_IIC_WRITE );
- //tempState = TWI_SendByte( Const_REG_ADDR + Const_IIC_WRITE );
- if( 1 != tempState )
- {
- RTC_STOP(); //发送终止I2C标志
- //TWI_STOP();
- return( tempState );
- }
- //输出地址
- tempState = RTC_SendByte( addr );
- //tempState = TWI_SendByte( addr );
-
- if( 1 != tempState )
- {
- RTC_STOP(); //发送终止I2C标志
- //TWI_STOP();
- return( tempState );
- }
-
- //启动
- if(RTC_START()!=RTC_READY)
- return 0;
- //TWI_START();
- //从机地址写入
- tempState = RTC_SendByte( Const_REG_ADDR + Const_IIC_READ );
- //tempState = TWI_SendByte( Const_REG_ADDR + Const_IIC_READ );
-
- if( 1 != tempState )
- {
- RTC_STOP(); //发送终止I2C标志
- //TWI_STOP();
- return( tempState );
- }
-
- read_data = RTC_ReceiveByte();
- //read_data = TWI_ReceiveByte();
-
- RTC_STOP();
- //TWI_STOP();
- *ucDataPtr=read_data;
-
- return 1;
- }
- /*************************************************************************************
- * Function: Write_Reg
- * Object: 写FM31256寄存器
- * 输入: unsigned char addr, 写入地址 unsigned char data 写入数据
- * 输出: 返回写入状态
- * 备注: unsigned char tempState = 0;状态值
- **************************************************************************************/
- unsigned char Write_Reg(unsigned char addr,unsigned char data)
- {
- unsigned char tempState = 0;
-
- //启动
- if(RTC_START()!=RTC_READY)
- return 0;
- //TWI_START();
-
- //从机地址写入
- tempState = RTC_SendByte( Const_REG_ADDR + Const_IIC_WRITE );
- //tempState = TWI_SendByte( Const_REG_ADDR + Const_IIC_WRITE );
-
- if( 1 != tempState )
- {
- RTC_STOP(); //发送终止I2C标志
- //TWI_STOP();
- return( tempState );
- }
-
- //输出地址
- tempState = RTC_SendByte( addr );
- //tempState = TWI_SendByte( addr );
-
- if( 1 != tempState )
- {
- RTC_STOP(); //发送终止I2C标志
- //TWI_STOP();
-
- return( tempState );
- }
-
- //输出地址
- tempState = RTC_SendByte( data );
- //tempState = TWI_SendByte( data );
-
- if( 1 != tempState )
- {
- RTC_STOP(); //发送终止I2C标志
- //TWI_STOP();
-
- return( tempState );
- }
-
- RTC_STOP();
- //TWI_STOP();
-
- return 1;
- }
- /*********************************************************************************
- * Function: Read_FM31256RAM
- * Object: 单个读出RAM寄存器
- * 输入: RAM寄存器地址 ,读取数据存储指针
- * 输出: 无
- * 返回值: 1:读正常; 非1值:从机无应答
- * 备注: uint8_t tempState = 0;状态值
- uint8_t tempAddr = 0; 地址计算变量
- **********************************************************************************/
- uint8_t Read_FM31256RAM( uint16_t uiAddr , uint8_t *ucDataPtr )
- {
- uint8_t tempState = 0;
- uint8_t tempAddr = 0;
- //启动
- if( RTC_START() != RTC_READY )
- {
- return 0;
- }
- //从机地址写入
- tempState = RTC_SendByte( Const_RAM_ADDR + Const_IIC_WRITE );
- if( 1 != tempState )
- {
- RTC_STOP(); //发送终止I2C标志
- return( tempState );
- }
- //输出地址
- tempAddr = ( uiAddr >> 8 ) & 0xff;//addr_h
- tempState = RTC_SendByte( tempAddr );
- if( 1 != tempState )
- {
- RTC_STOP(); //发送终止I2C标志
- return( tempState );
- }
- tempAddr = uiAddr & 0xff;//addr_l
- tempState = RTC_SendByte( tempAddr );
- if( 1 != tempState )
- {
- RTC_STOP(); //发送终止I2C标志
- return( tempState );
- }
- //启动
- if( RTC_START() != RTC_READY )
- {
- return 0;
- }
- //从机地址写入
- tempState = RTC_SendByte( Const_RAM_ADDR + Const_IIC_READ );
- if( 1 != tempState )
- {
- RTC_STOP(); //发送终止I2C标志
- return( tempState );
- }
- *ucDataPtr = RTC_ReceiveByte();
- RTC_STOP();
- return 1;
- }
- /*********************************************************************************
- * Function: Read_Multi31256RAM
- * Object: 连续读出RAM寄存器
- * 输入: RAM寄存器地址
- * 输出: 无
- * 返回值: 1:读正常; 非1值:从机无应答
- * 备注: uint8_t tempState = 0;状态值
- uint8_t tempAddr = 0; 地址计算变量
- **********************************************************************************/
- uint8_t Read_Multi31256RAM( uint16_t uiAddr, uint8_t *ucDataBufPtr, uint16_t uiLen )
- {
- uint8_t tempState = 0;
- uint8_t tempAddr = 0;
- uint8_t iN = 0;
-
- //判断地址是否越界
- if( ( uiAddr + uiLen ) > MAX_31256RAM_ADDRESS )
- {
- return( 3 );
- }
-
- RTC_SendNACK(); //不发送应答
- RTC_STOP(); //发送终止I2C标志
-
- if( RTC_START() != RTC_READY ) //启动
- {
- return 0;
- }
-
- //从机地址写入
- tempState = RTC_SendByte( Const_RAM_ADDR + Const_IIC_WRITE );
- if( 1 != tempState )
- {
- RTC_STOP(); //发送终止I2C标志
- return( tempState );
- }
-
- //输出地址
- tempAddr = ( uiAddr >> 8 ) & 0xff;//addr_h
- tempState = RTC_SendByte( tempAddr );
- if( 1 != tempState )
- {
- RTC_STOP(); //发送终止I2C标志
- return( tempState );
- }
- tempAddr = uiAddr & 0xff;//addr_l
- tempState = RTC_SendByte( tempAddr );
- if( 1 != tempState )
- {
- RTC_STOP(); //发送终止I2C标志
- return( tempState );
- }
- //启动
- if( RTC_START() != RTC_READY )
- {
- return 0;
- }
- //从机地址写入
- tempState = RTC_SendByte( Const_RAM_ADDR + Const_IIC_READ );
- if( 1 != tempState )
- {
- RTC_STOP(); //发送终止I2C标志
- return( tempState );
- }
-
- for( iN = 0; iN < ( uiLen - 1 ); iN++ )
- {
- *( ucDataBufPtr+iN ) = RTC_ReceiveByte(); //读数据
- RTC_SendACK(); //发送应答
- }
- *( ucDataBufPtr + iN )=RTC_ReceiveByte(); //读数据
- RTC_SendNACK(); //最后一个字节不发送应答
-
- RTC_STOP();
- return 1;
- }
- /*********************************************************************************
- * Function: Write_FM31256RAM
- * Object: 单个写入RAM寄存器
- * 输入: RAM寄存器地址
- * 输出: 无
- * 返回值: 1:读正常; 非1值:从机无应答
- * 备注: uint8_t tempState = 0;状态值
- uint8_t tempAddr = 0; 地址计算变量
- **********************************************************************************/
- uint8_t Write_FM31256RAM( uint16_t uiAddr , uint8_t ucData )
- {
- uint8_t tempState = 0;
- uint8_t tempAddr = 0;
- //启动
- if( RTC_START() != RTC_READY )
- {
- return 0;
- }
-
- //从机地址写入
- tempState = RTC_SendByte( Const_RAM_ADDR + Const_IIC_WRITE );
- if( 1 != tempState )
- {
- RTC_STOP(); //发送终止I2C标志
- return( tempState );
- }
-
- //输出地址
- tempAddr = ( uiAddr >> 8 ) & 0xff;//addr_h
- tempState = RTC_SendByte( tempAddr );
- if( 1 != tempState )
- {
- RTC_STOP(); //发送终止I2C标志
- return( tempState );
- }
- tempAddr = uiAddr & 0xff;//addr_l
- tempState = RTC_SendByte( tempAddr );
- if( 1 != tempState )
- {
- RTC_STOP(); //发送终止I2C标志
- return( tempState );
- }
-
- //写入单个数据
- tempState = RTC_SendByte( ucData );
- if( 1 != tempState )
- {
- RTC_STOP(); //发送终止I2C标志
- return( tempState );
- }
-
- RTC_STOP();
-
- return 1;
- }
- /*********************************************************************************
- * Function: Write_Multi31256RAM
- * Object: 连续写入RAM寄存器
- * 输入: RAM寄存器地址
- * 输出: 无
- * 返回值: 1:读正常; 非1值:从机无应答
- * 备注: uint8_t tempState = 0;状态值
- uint8_t tempAddr = 0; 地址计算变量
- **********************************************************************************/
- uint8_t Write_Multi31256RAM( uint16_t uiAddr , uint8_t *ucDataBufPtr , uint16_t uiLen )
- {
- uint8_t tempState = 0;
- uint8_t tempAddr = 0;
- uint8_t iN = 0;
-
- //判断地址是否越界
- if( ( uiAddr + uiLen ) > MAX_31256RAM_ADDRESS )
- {
- return( 3 );
- }
-
- RTC_SendNACK(); //不发送应答
- RTC_STOP(); //发送终止I2C标志
-
- if( RTC_START() != RTC_READY ) //启动
- {
- return 0;
- }
-
- //从机地址写入
- tempState = RTC_SendByte( Const_RAM_ADDR + Const_IIC_WRITE );
- if( 1 != tempState )
- {
- RTC_STOP(); //发送终止I2C标志
- return( tempState );
- }
-
- //输出地址
- tempAddr = ( uiAddr >> 8 ) & 0xff;//addr_h
- tempState = RTC_SendByte( tempAddr );
- if( 1 != tempState )
- {
- RTC_STOP(); //发送终止I2C标志
- return( tempState );
- }
- tempAddr = uiAddr & 0xff;//addr_l
- tempState = RTC_SendByte( tempAddr );
- if( 1 != tempState )
- {
- RTC_STOP(); //发送终止I2C标志
- return( tempState );
- }
-
- //连续写入数据
- for( iN = 0 ; iN < uiLen; iN++ )
- {
- tempState = RTC_SendByte( *( ucDataBufPtr + iN ) );
- if( 1 != tempState )
- {
- RTC_STOP(); //发送终止I2C标志
- return( tempState );
- }
- }
- RTC_STOP(); //发送终止I2C标志
- return(1);
- }
- /*********************************************************************************
- * Function: InitRtc
- * Object: FM31256初始化
- * 输入: 无
- * 输出: 无
- * 备注: 可初始化时间及工作电压
- **********************************************************************************/
- void InitRtc(void)
- {
-
- Write_Reg(Const_CONTROL,0);
-
- //Write_Reg(0,2);//??
- Write_Reg(Const_YEAR,hex_to_bcd(13));
- Write_Reg(Const_MONTH,hex_to_bcd(8));
- Write_Reg(Const_DATE,hex_to_bcd(26));
- Write_Reg(Const_WEEK,hex_to_bcd(3));
- Write_Reg(Const_HOURS,hex_to_bcd(13));
- Write_Reg(Const_MINUTES,hex_to_bcd(13));
- Write_Reg(Const_SECONDS,hex_to_bcd(15));
- //Write_Reg(0,0);//????
- //Write_Reg(1,0);
- //Write_Reg(Const_COMPANION,1);//无保护、充电(7)无充电(3)、复位电压4.4V
-
- }
- /*********************************************************************************
- * Function: GetCurDateTimeFromRTC
- * Object: 获取当前时间
- * 输入: 无
- * 输出: 无
- * 备注: uint8_t ucTimeBuf[8];
- uint8_t ucTempTime = 0; 读取时间计算变量
- **********************************************************************************/
- void GetCurDateTimeFromRTC( void )
- {
- uint8_t ucTimeBuf[8];
- uint8_t ucTempTime = 0;
- RTC_STOP();
- //Write_Reg(0,1);
- // Read_Reg(Const_SECONDS,&ucTimeBuf[0]);
- Read_Reg(Const_MINUTES,&ucTimeBuf[1]);
- Read_Reg(Const_HOURS,&ucTimeBuf[2]);
- // Read_Reg(Const_WEEK,&ucTimeBuf[3]);
- Read_Reg(Const_DATE,&ucTimeBuf[4]);//Const_DAY
- Read_Reg(Const_MONTH,&ucTimeBuf[5]);
- Read_Reg(Const_YEAR,&ucTimeBuf[6]);
- //Write_Reg(0,0);
- ucTempTime = bcd_to_hex(ucTimeBuf[6]);
- if( ucTempTime >= 15 && ucTempTime <= 99 )
- {
- displayTimeBuf.year = ucTempTime + 2000;
- }
-
- ucTempTime = (bcd_to_hex(ucTimeBuf[5]) & 0x1f);
- if( ucTempTime >= 1 && ucTempTime <= 12 )
- {
- displayTimeBuf.month = ucTempTime;
- }
-
- ucTempTime = (bcd_to_hex(ucTimeBuf[4]) & 0x3f);
- if( ucTempTime >= 1 && ucTempTime <= 31 )
- {
- displayTimeBuf.date = ucTempTime;
- }
- ucTempTime = ( bcd_to_hex(ucTimeBuf[2]) & 0x3f);
- if( ucTempTime <= 23 )
- {
- displayTimeBuf.hour = ucTempTime;
- }
-
- ucTempTime = (bcd_to_hex(ucTimeBuf[1])& 0x7f);
- if( ucTempTime <= 59 )
- {
- displayTimeBuf.minute = ucTempTime;
- }
-
- ucTempTime = (bcd_to_hex(ucTimeBuf[0]) & 0x7f);
- if( ucTempTime <= 59 )
- {
- displayTimeBuf.seconds = ucTempTime;
- }
- }
- /*********************************************************************************
- * Function: SetDateTimeToRTC
- * Object: 向FM31256设置时间
- * 输入: 无
- * 输出: 无
- * 备注: 根据displayTimeBuf结构体的数据向FM31256设置时间
- **********************************************************************************/
- void SetDateTimeToRTC( void )
- {
- if( displayTimeBuf.year < 2021 )
- {
- displayTimeBuf.year = 2021;
- }
- /* Write_Reg(0,0);
-
- Write_Reg(0,2);//使能*/
-
- Write_Reg(Const_CONTROL,0);
-
- //Write_Reg(0,2);//使能*/
-
- Write_Reg(Const_YEAR,hex_to_bcd(displayTimeBuf.year - 2000));
- Write_Reg(Const_MONTH,(hex_to_bcd(displayTimeBuf.month) & 0x1f));
- Write_Reg(Const_DATE,(hex_to_bcd(displayTimeBuf.date) & 0x3f));
- Write_Reg(Const_HOURS,(hex_to_bcd(displayTimeBuf.hour) & 0x3f));
- Write_Reg(Const_MINUTES,(hex_to_bcd(displayTimeBuf.minute) & 0x7f));
- Write_Reg(Const_SECONDS,(hex_to_bcd(displayTimeBuf.seconds) & 0x7f));
- //Write_Reg(0,0);//关闭读写
- Write_Reg(Const_FLAGS,0);
- }
|