• stm32 r8025


    uint8_t RX8025_BCD2DEC(uint8_t val)
    {
        uint8_t i;
     
        i = val&0x0f;           //按位与,i得到低四位数。
        val >>= 4;              //右移四位,将高四位移到低四位的位置,得到高四位码值。
        val &= 0x0f;            //防止移位时高位补进1,只保留高四位码值
        val *= 10;              //高位码值乘以10
        i += val;               //然后与第四位码值相加。
        return i;               //将得到的十进制数返回
    }
     
    /**
     * @brief RX8025_DEC2BCD  十进制转BCD码
     * @param val      BCD码
     * @return
     */
    uint8_t RX8025_DEC2BCD(uint8_t val)
    {
        uint8_t i;
     
        i = val/10;            //取得十位
        val %= 10;             //取得个位
        i <<= 4;               //左移4位
        i += val;
     
        return i;
    }
     
    void Rx8025_WriteCTFG(void)
    {
        uint8_t temp;
     
        temp = RX8025_ReadReg(REG_CONTROL2);
        temp &= 0xFB;           //Write CTFG;
        RX8025_WriteReg(REG_CONTROL2,temp);
    }
     
    /****************************************************
    * Function Name  :
    * Description    :   初始化RX8025
    * Input          :
    * Return         :   返回非0值代表初始化通过
    * Note           :
    *****************************************************/
    uint8_t RX8025_Init(void)
    {
        uint8_t temp,temp1;
     
        RX8025GpioInit();
        temp = RX8025_ReadReg(REG_CONTROL1);
        /*******  RX8025上电默认选择12小时制  **********/
    #if USING_T12_T24==1    //24小时制
        RX8025_WriteReg(REG_CONTROL1,temp|REGBIT_12_24);
    #elif USING_T12_T24==0  //12小时制
        RX8025_WriteReg(REG_CONTROL1,temp&(~REGBIT_12_24));
    #endif
        /* INTA管脚输出模式 */
        temp = RX8025_ReadReg(REG_CONTROL1);
        temp &= 0xF8;  //清空低3位
        //temp |= 0x00;//INTA管脚不输出
        //temp |= 0x01;//INTA管脚输出固定低电平
        //temp |= 0x02;//INTA管脚输出占空比50%、2HZ的脉冲
        temp |= 0x03;//INTA管脚输出占空比50%、1HZ的脉冲
        //temp |= 0x04;//INTA管脚输出电平模式,1秒1次
        //temp |= 0x05;//INTA管脚输出电平模式,1分钟1次
        //temp |= 0x06;//INTA管脚输出电平模式,1小时1次
        //temp |= 0x07;//INTA管脚输出电平模式,1月1次
        RX8025_WriteReg(REG_CONTROL1,temp);
        temp1 = RX8025_ReadReg(REG_CONTROL1);
        if(temp == temp1)  //读写是否正常
            temp1 = 0;
        else
            temp1 = 1;
     
        /* 低电压检测功能 */
        /* 振动停止检测功能 */
        temp = RX8025_ReadReg(REG_CONTROL1);
        RX8025_WriteReg(REG_CONTROL1,temp|REGBIT_XST); //启动低电压检测
        /* 电源复位检测功能 */
        temp = RX8025_ReadReg(REG_CONTROL1);
        RX8025_WriteReg(REG_CONTROL1,temp&(~REGBIT_PON)); //清除标志位,为下次做准备
        /* INTB管脚输出 */
        temp = RX8025_ReadReg(REG_CONTROL2);
        RX8025_WriteReg(REG_CONTROL2,temp&(~REGBIT_WAFG)); //关闭ALARM_W引起的INTB管脚的输出
        temp = RX8025_ReadReg(REG_CONTROL2);
        RX8025_WriteReg(REG_CONTROL2,temp&(~REGBIT_DAFG)); //关闭ALARM_D引起的INTB管脚的输出
        /* 日历计数器 */
        temp = RX8025_ReadReg(REG_MONTH);
        RX8025_WriteReg(REG_MONTH,temp&(~0x80));  //规定:先写零再使用
     
        return temp1;
    }
     
    /*
        读取RTC
        method=0时采用阻塞方式读,method=1时采用状态机+非阻塞方式
    */
    void ReadRTCBlock(struct tm *rtc)
    {   
     
        Rx8025RTC.tm_sec = RX8025_BCD2DEC(RX8025_ReadReg(0)&0x7f);
        Rx8025RTC.tm_min = RX8025_BCD2DEC(RX8025_ReadReg(1)&0x7f);
        Rx8025RTC.tm_hour = RX8025_BCD2DEC(RX8025_ReadReg(2)&0x7f);
        //----星期
        Rx8025RTC.tm_wday= RX8025_BCD2DEC(RX8025_ReadReg(3)&0x07);
        //----一个月中的日期
        Rx8025RTC.tm_mday = RX8025_BCD2DEC(RX8025_ReadReg(4)&0x3f);
        Rx8025RTC.tm_mon = RX8025_BCD2DEC(RX8025_ReadReg(5)&0x1f);
        Rx8025RTC.tm_year = RX8025_BCD2DEC(RX8025_ReadReg(6)&0xff);
        Rx8025RTC.tm_year += 2000;
     
        (*rtc).tm_sec = Rx8025RTC.tm_sec;
        (*rtc).tm_min = Rx8025RTC.tm_min;
        (*rtc).tm_hour = Rx8025RTC.tm_hour;
        //----星期
        (*rtc).tm_wday= Rx8025RTC.tm_wday;
        //----一个月中的日期
        (*rtc).tm_mday = Rx8025RTC.tm_mday;
        (*rtc).tm_mon = Rx8025RTC.tm_mon;
        (*rtc).tm_year = Rx8025RTC.tm_year;
    }
     
    void ReadRTCNoBlock(struct tm *rtc)
    {
        (*rtc).tm_sec = Rx8025RTC.tm_sec;
        (*rtc).tm_min = Rx8025RTC.tm_min;
        (*rtc).tm_hour = Rx8025RTC.tm_hour;
        //----星期
        (*rtc).tm_wday= Rx8025RTC.tm_wday;
        //----一个月中的日期
        (*rtc).tm_mday = Rx8025RTC.tm_mday;
        (*rtc).tm_mon = Rx8025RTC.tm_mon;
        (*rtc).tm_year = Rx8025RTC.tm_year;
    }
     
    /****************************************************
    * Function Name  :
    * Description    :
    * Input          :
    * Return         :
    * Note           :  采用阻塞方式写,耗时75ms
    *****************************************************/
    uint8_t WriteRTCBlock(struct tm rtc)
    {   
     
        Rx8025RTC.tm_sec = rtc.tm_sec;
        Rx8025RTC.tm_min = rtc.tm_min;
        Rx8025RTC.tm_hour = rtc.tm_hour;
        //----星期
        Rx8025RTC.tm_wday = rtc.tm_wday;
        //----一个月中的日期
        Rx8025RTC.tm_mday = rtc.tm_mday;
        Rx8025RTC.tm_mon = rtc.tm_mon;
        Rx8025RTC.tm_year = rtc.tm_year;
     
        /* 每次写入耗时0.97ms */
        RX8025_WriteReg(0,RX8025_DEC2BCD(Rx8025RTC.tm_sec));
        RX8025_WriteReg(1,RX8025_DEC2BCD(Rx8025RTC.tm_min));
        RX8025_WriteReg(2,RX8025_DEC2BCD(Rx8025RTC.tm_hour));
        RX8025_WriteReg(3,RX8025_DEC2BCD(Rx8025RTC.tm_wday));
        RX8025_WriteReg(4,RX8025_DEC2BCD(Rx8025RTC.tm_mday));
        RX8025_WriteReg(5,RX8025_DEC2BCD(Rx8025RTC.tm_mon));
        RX8025_WriteReg(6,RX8025_DEC2BCD(Rx8025RTC.tm_year-2000));
        return 1;   
    }
     
    /**************************************
    功能描述:   发送读取时间命令
    参数说明:
    返回说明:
    调用方式:   1s调用一次
    全局变量:
    读写时间:
    注意事项:
    日期    :
    **************************************/
    void Rx8025ReadRTCTask(void)
    {
        rx8025_status = READ_RTC;
    }
     
    /**************************************
    功能描述:   周期性轮询任务
    参数说明:
    返回说明:
    调用方式:   100ms调用一次
    全局变量:
    读写时间:
    注意事项:
    日期    :
    **************************************/
    void Rx8025Task(void)
    {
        static uint8_t step=0;
     
        switch(rx8025_status)
        {
            case IDLE_RTC:
                break;
            case READ_RTC:
                switch(step)
                {
                    case 0:
                        Rx8025RTC.tm_sec = RX8025_BCD2DEC(RX8025_ReadReg(0)&0x7f);
                        step++;
                        break;
                    case 1:
                        Rx8025RTC.tm_min = RX8025_BCD2DEC(RX8025_ReadReg(1)&0x7f);
                        step++;
                        break;    
                    case 2:
                        Rx8025RTC.tm_hour = RX8025_BCD2DEC(RX8025_ReadReg(2)&0x7f);
                        step++;
                        break; 
                    case 3:
                        Rx8025RTC.tm_wday= RX8025_BCD2DEC(RX8025_ReadReg(3)&0x07);
                        step++;
                        break;              
                    case 4:
                        Rx8025RTC.tm_mday = RX8025_BCD2DEC(RX8025_ReadReg(4)&0x3f);
                        step++;
                        break;
                    case 5:
                        Rx8025RTC.tm_mon = RX8025_BCD2DEC(RX8025_ReadReg(5)&0x1f);
                        step++;
                        break;    
                    case 6:
                        Rx8025RTC.tm_year = RX8025_BCD2DEC(RX8025_ReadReg(6)&0xff);
                        Rx8025RTC.tm_year += 2000;
                        step = 0;
                        rx8025_status = IDLE_RTC;
                        break;                 
                }
                break;                   
            default:
                break;
        }
    }

    1.  void Delayus(u16 us)  
    2.  {  
    3.      u16 i;  
    4.      for(i=0;i<us;i++)  
    5.      __nop();  
    6.  }  
    7.    
    8.    
    9. void IIC_Init(void)  
    10. {                          
    11.     GPIO_InitTypeDef GPIO_InitStructure;  
    12.     RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );   
    13.          
    14.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;  
    15.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //ÍÆÍìÊä³ö  
    16.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;  
    17.     GPIO_Init(GPIOB, &GPIO_InitStructure);  
    18. //  GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7);  //PB6,PB7 Êä³ö¸ß  
    19. }  
    20.   
    21. void IIC_Start(void)  
    22. {  
    23.     SDA_OUT();       
    24.     SCL_1  
    25.     SDA_1  
    26.     Delayus(10);  
    27.     SDA_0  
    28.     Delayus(10);  
    29.     SCL_0     
    30.     Delayus(10);  
    31.       
    32.       
    33.       
    34. }       
    35.   
    36. void IIC_Stop(void)  
    37. {  
    38.     u8 i;  
    39.     SDA_OUT();//sdaÏßÊä³ö  
    40.     SDA_0  
    41.     Delayus(10);  
    42.     SCL_1  
    43.     Delayus(10);  
    44.     SDA_1  
    45.     for(i=0;i<5;i++)  
    46.     {  
    47.         Delayus(10);  
    48.     }             
    49. }  
    50.   
    51. u8 IIC_Wait_Ack(void)  
    52. {  
    53.     u8 ucErrTime=0;  
    54.     SDA_IN();      //SDAÉèÖÃΪÊäÈë    
    55.     Delayus(10);     
    56.     Delayus(10);  
    57.     while(READ_SDA)  
    58.     {  
    59.         ucErrTime++;  
    60.         if(ucErrTime>250)  
    61.         {  
    62.             IIC_Stop();  
    63.             return 1;  
    64.         }  
    65.           
    66.     }  
    67.     SCL_0//ʱÖÓÊä³ö0         
    68.     return 0;    
    69. }   
    70.   
    71. void IIC_Ack(void)  
    72. {  
    73.       
    74.     SDA_OUT();  
    75.     SDA_0;  
    76.     Delayus(10);  
    77.     SCL_1  
    78.     Delayus(10);  
    79.     SCL_0  
    80.     Delayus(10);  
    81. }  
    82.           
    83. void IIC_NAck(void)  
    84. {  
    85.     SDA_OUT();  
    86.     SDA_1;  
    87.     Delayus(10);  
    88.     SCL_1  
    89.     Delayus(10);  
    90.     SCL_0  
    91.     Delayus(10);  
    92. }                                          
    93.             
    94. void IIC_Send_Byte(u8 txd)  
    95. {   
    96.     u8 i;  
    97.     SDA_OUT();  
    98.     for(i=0;i<8;i++)  
    99.     {  
    100.         if(txd & 0x80) SDA_1  
    101.         else SDA_0  
    102.         txd <<= 1;  
    103.         Delayus(10);  
    104.         SCL_1  
    105.         Delayus(10);  
    106.         SCL_0     
    107.     }  
    108.     Delayus(10);  
    109.     SCL_1  
    110.     Delayus(10);  
    111.     SCL_0  
    112. }         
    113.   
    114. u8 IIC_Read_Byte(unsigned char ack)  
    115. {  
    116.     u8 i,receive=0;  
    117.     SDA_IN();//SDAÉèÖÃΪÊäÈë  
    118.       
    119.         for(i=0;i<8;i++)  
    120.         {  
    121.             SCL_1  
    122.             Delayus(10);  
    123.             receive <<=1;  
    124.             if(READ_SDA) receive |= 0x01;  
    125.               
    126.             SCL_0  
    127.             Delayus(10);  
    128.         }  
    129.         SDA_OUT();  
    130.         return receive;  
    131.           
    132. }  
    133.   
    134.   
    135. void R8025AC_Read(u8 sadd, u8 *buf, u8 len)  
    136. {  
    137.     u8 i;  
    138.     IIC_Start();  
    139.     IIC_Send_Byte(0x64);  
    140.     IIC_Send_Byte(sadd<<4|0x01);  
    141.     IIC_Start();  
    142.     IIC_Send_Byte(0x65);  
    143.     for(i=0;i<len-1;i++)  
    144.     {  
    145.         buf[i] = IIC_Read_Byte(1);  
    146.         IIC_Ack();  
    147.     }  
    148.     buf[i] = IIC_Read_Byte(0);  
    149.     IIC_NAck();  
    150.     IIC_Stop();  
    151. }  
    152.   
    153. void R8025AC_Write(u8 sadd,u8 *buf,u8 len)  
    154. {  
    155.     u8 i;  
    156.       
    157.     IIC_Start();  
    158.     IIC_Send_Byte(0X64);  
    159.     IIC_Send_Byte(sadd<<4);  
    160.       
    161.     for(i=0;i<len;i++)  
    162.     {  
    163.         IIC_Send_Byte(buf[i]);  
    164.     }  
    165.     IIC_Stop();
  • 相关阅读:
    SQLDataSet中执行DDL语句
    在SQL语句中使用参数
    delphi排序算法
    ClientDataSet中的PacketRecords属性,减轻网络负载,提升服务器与客户端性能
    ClientDataSet中修改,删除,添加数据和Delta属性
    SQLMonitor观察DBE的执行行为
    this的指向(慢慢添加)
    如何在Html的CSS中去除<li>标签前面小黑点,和ul、LI部分属性方法
    AJAX的工作原理及其优缺点
    IE浏览器和Firefox浏览器兼容性问题及解决办法
  • 原文地址:https://www.cnblogs.com/zym0805/p/7016224.html
Copyright © 2020-2023  润新知