久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 19157|回復: 7
收起左側

stm32模擬IIC驅動RX8025時鐘芯片C語言參考程序

[復制鏈接]
ID:59583 發表于 2014-3-21 13:57 | 顯示全部樓層 |閱讀模式
/* Includes--------------------------------------------------------------*/
//#include        "sysconfig.h"
#include "stm32f10x.h"
//#include        "bsp_SIIC.h"
#include "bsp_RX8025.h"
/*
Private define-----------------------------------------------------------------------------*/
// 設備讀寫地址
#define        RX8025_ADDR_READ                0x65
#define        RX8025_ADDR_WRITE                0x64
// 設備寄存器地址
#define        RX8025_ADDR_SECONDS                0x00
#define        RX8025_ADDR_WEEK                0x30
#define        RX8025_ADDR_DATES                0x40
#define        RX8025_ADDR_MONTH                0x50
#define        RX8025_ADDR_MINUTES                0x80
#define        RX8025_ADDR_CONTROL1        0xE0
#define        RX8025_ADDR_CONTROL2        0xF0
// 設備操作模式
#define        RX8025_WRITE_MODE                0xF0
#define        RX8025_READ_MODE                0xF0
#define        RX8025_SIMP_READ_MODE        0x04
#define u8BAND(addr, u8num) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(u8num<<2))
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
#define u8_ADDR(addr, u8num)   MEM_ADDR(u8BAND(addr, u8num))
//IO口地址映射
#define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C
#define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C
#define GPIOC_ODR_Addr    (GPIOC_BASE+12) //0x4001100C
#define GPIOD_ODR_Addr    (GPIOD_BASE+12) //0x4001140C
#define GPIOE_ODR_Addr    (GPIOE_BASE+12) //0x4001180C
#define GPIOF_ODR_Addr    (GPIOF_BASE+12) //0x40011A0C   
#define GPIOG_ODR_Addr    (GPIOG_BASE+12) //0x40011E0C   
#define GPIOA_IDR_Addr    (GPIOA_BASE+8) //0x40010808
#define GPIOB_IDR_Addr    (GPIOB_BASE+8) //0x40010C08
#define GPIOC_IDR_Addr    (GPIOC_BASE+8) //0x40011008
#define GPIOD_IDR_Addr    (GPIOD_BASE+8) //0x40011408
#define GPIOE_IDR_Addr    (GPIOE_BASE+8) //0x40011808
#define GPIOF_IDR_Addr    (GPIOF_BASE+8) //0x40011A08
#define GPIOG_IDR_Addr    (GPIOG_BASE+8) //0x40011E08
//IO口操作,只對單一的IO口!
//確保n的值小于16!
#define PAout(n)   u8_ADDR(GPIOA_ODR_Addr,n)  //輸出
#define PAin(n)    u8_ADDR(GPIOA_IDR_Addr,n)  //輸入
#define PBout(n)   u8_ADDR(GPIOB_ODR_Addr,n)  //輸出
#define PBin(n)    u8_ADDR(GPIOB_IDR_Addr,n)  //輸入
#define PCout(n)   u8_ADDR(GPIOC_ODR_Addr,n)  //輸出
#define PCin(n)    u8_ADDR(GPIOC_IDR_Addr,n)  //輸入
#define PDout(n)   u8_ADDR(GPIOD_ODR_Addr,n)  //輸出
#define PDin(n)    u8_ADDR(GPIOD_IDR_Addr,n)  //輸入
#define PEout(n)   u8_ADDR(GPIOE_ODR_Addr,n)  //輸出
#define PEin(n)    u8_ADDR(GPIOE_IDR_Addr,n)  //輸入
#define PFout(n)   u8_ADDR(GPIOF_ODR_Addr,n)  //輸出
#define PFin(n)    u8_ADDR(GPIOF_IDR_Addr,n)  //輸入
#define PGout(n)   u8_ADDR(GPIOG_ODR_Addr,n)  //輸出
#define PGin(n)    u8_ADDR(GPIOG_IDR_Addr,n)  //輸入
/////////////////////////////////////////////////////////////////
//Ex_NVIC_Config專用定義
#define GPIO_A 0
#define GPIO_B 1
#define GPIO_C 2
#define GPIO_D 3
#define GPIO_E 4
#define GPIO_F 5
#define GPIO_G 6

//IO操作函數
#define IIC_SCL PBout(15) //SCL
#define IIC_SDA PBout(14) //SDA
#define READ_SDA PBin(14) //輸入SDA
void I2C_Configuration(void);
/* Private typedef----------------------------------------------------------------------------*/
// 寄存器結構
// CONTROL1,結構定義
typedef struct
{
        u8 CT:3;
        u8 TEST:1;
        u8 nCLEN2:1;
        u8 HOUR24:1;
        u8 DALE:1;
        u8 WALE:1;
}_RX8025_REG_CONTROL1_BITS;
typedef union
{
        u8 byte;
        _RX8025_REG_CONTROL1_BITS bits;
}_RX8025_REG_CONTROL1;
/* Private macro------------------------------------------------------------------------------*/
/* Private variables--------------------------------------------------------------------------*/
/* Private function prototypes----------------------------------------------------------------*/
/* Private functions--------------------------------------------------------------------------*/

void I2C_Configuration(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
        
        RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO ,ENABLE);
        
        
        /* Configure I2C2 pins: PB15 -> SCL and PB14 -> SDA */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_14 | GPIO_Pin_15;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;  
        GPIO_Init(GPIOB, &GPIO_InitStructure);
}

void SDA_IN(void) //sda線輸入 ,PA11
{
        GPIO_InitTypeDef GPIO_InitStructure;//聲明GPIO初始化結構體                        
        // Configure I2C1 pins:SDA
        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_14;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
}

void SDA_OUT(void) //sda線輸出
{
        GPIO_InitTypeDef GPIO_InitStructure;//聲明GPIO初始化結構體
        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_14;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
}
//   延時總時間=cnt*16+24us
void delay(u16 cnt)
{
        u8 i;
for(;cnt>0;cnt--)
        for(i=0;i<100;i++);
}
//產生IIC起始信號
void IIC_Start(void)
{
        SDA_OUT(); //sda線輸出
        IIC_SDA=1;
        IIC_SCL=1;
        delay(4);
        IIC_SDA=0;//START:when CLK is high,DATA change form high to low
        delay(4);
        IIC_SCL=0;//鉗住I2C總線,準備發送或接收數據
}
//產生IIC停止信號
void IIC_Stop(void)
{
        SDA_OUT();//sda線輸出
        IIC_SCL=0;
        IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
        delay(4);
        IIC_SCL=1;
        IIC_SDA=1;//發送I2C總線結束信號
        delay(4);
}
//等待應答信號到來
//返回值:1,接收應答失敗
// 0,接收應答成功
u8 IIC_Wait_Ack(void)
{
        u8 ucErrTime=0;
        SDA_IN(); //SDA設置為輸入
        IIC_SDA=1;delay(1);
        IIC_SCL=1;delay(1);
        while(READ_SDA)
        {
                ucErrTime++;
                if(ucErrTime>250)
                {
                        IIC_Stop();
                        return 1;
                }
        }
        IIC_SCL=0;//時鐘輸出0
        return 0;
}
//產生ACK應答
void IIC_ACK(void)
{
        IIC_SCL=0;
        SDA_OUT();
        IIC_SDA=0;
        delay(2);
        IIC_SCL=1;
        delay(2);
        IIC_SCL=0;
}
//不產生ACK應答
void IIC_NAck(void)
{
        IIC_SCL=0;
        SDA_OUT();
        IIC_SDA=1;
        delay(2);
        IIC_SCL=1;
        delay(2);
        IIC_SCL=0;
}
//IIC發送一個字節
//返回從機有無應答
//1,有應答
//0,無應答
u8 IIC_Send_Byte(u8 txd)
{
        u8 t;
        SDA_OUT();
        IIC_SCL=0;//拉低時鐘開始數據傳輸
        for(t=0;t<8;t++)
        {
                IIC_SDA=(txd&0x80)>>7;
                txd<<=1;
                delay(2); //對TEA5767這三個延時都是必須的
                IIC_SCL=1;
                delay(2);
                IIC_SCL=0;
                delay(2);
        }
        t=IIC_Wait_Ack();
        return (t);
}
//讀1個字節,ack=1時,發送ACK,ack=0,發送nACK
u8 IIC_Read_Byte(u8 ack)
{
        u8 i,receive=0;
        SDA_IN();//SDA設置為輸入
        for(i=0;i<8;i++ )
        {
                IIC_SCL=0;
                delay(2);
                IIC_SCL=1;
                receive<<=1;
                if(READ_SDA)receive++;
                delay(1);
        }
        if (!ack)
        IIC_NAck();//發送nACK
        else
        IIC_ACK(); //發送ACK
        return receive;
}
void RX8025Write(u8 addr,u8 *pData,u8 len)
{
        u8 i;
        IIC_Start();
        if(IIC_Send_Byte(RX8025_ADDR_WRITE)==1)
        {
                IIC_Stop();
                return;
        }
        if(IIC_Send_Byte(addr)==1)
        {
                IIC_Stop();
                return;
        }
        for(i=0;i<len;i++)
        {
                if(IIC_Send_Byte(pData)==1)
                {
                        IIC_Stop();
                        return;
                }
        }
        IIC_Stop();
}
void RX8025Read(u8 addr,u8 *pData,u8 len)
{
        u8 i;
        IIC_Start();
        if(IIC_Send_Byte(RX8025_ADDR_WRITE)==1)
        {
                IIC_Stop();
                return;
        }
        if(IIC_Send_Byte(addr)==1)
        {
                IIC_Stop();
                return;
        }
        IIC_Start();
        if(IIC_Send_Byte(RX8025_ADDR_READ)==1)
        {
                IIC_Stop();
                return;
        }
        for(i=0;i<len-1;i++)
        {
                pData = IIC_Read_Byte(1);
//                IIC_ACK();
        }
        pData = IIC_Read_Byte(0);
//        IIC_NAck();
        IIC_Stop();
}
/***********************************************************************************************
* Function                : BSP_RX8025Write
* Description        : 向時鐘芯片寫數據
* Input                        :
* Output                :
* Note(s)                :
* Contributor        : 081218        andydriver
***********************************************************************************************/
void BSP_RX8025Write(u8 *pData,u8 len)
{
        RX8025Write((RX8025_ADDR_SECONDS&RX8025_WRITE_MODE),pData,len);
}
/***********************************************************************************************
* Function                : BSP_RX8025Read
* Description        : 從時鐘芯片讀取數據
* Input                        :
* Output                :
* Note(s)                :
* Contributor        : 081218        andydriver
***********************************************************************************************/
void BSP_RX8025Read(u8 *pData,u8 len)
{
        RX8025Read((RX8025_ADDR_SECONDS&RX8025_READ_MODE),pData,len);
}
/***********************************************************************************************
* Function                : BSP_RX8025ControlINTA
* Description        : 控制芯片的INTA腳狀態
* Input                        : state:狀態(_BSPRX8025_INTAOUT)
                                        BSPRX8025_INTAOUT_HIZ:高阻
                                        BSPRX8025_INTAOUT_LOW:輸出低
                                        BSPRX8025_INTAOUT_2HZ:輸出2Hz(50%)的脈沖
                                        BSPRX8025_INTAOUT_1HZ:輸出1Hz(50%)的脈沖
                                        BSPRX8025_INTAOUT_SEC:每秒的第0秒翻轉?還是脈沖?
                                        BSPRX8025_INTAOUT_MIN:每分的第0秒翻轉?還是脈沖?
                                        BSPRX8025_INTAOUT_HOUR:每時的第0秒翻轉?還是脈沖?
                                        BSPRX8025_INTAOUT_MONTH:每月的第0秒翻轉?還是脈沖?
* Output                :
* Note(s)                :
* Contributor        : 081218        andydriver
***********************************************************************************************/
//void BSP_RX8025ControlINTA(_BSPRX8025_INTAOUT state)
//{
//        _RX8025_REG_CONTROL1 data;
//        
//        RX8025Read((RX8025_ADDR_CONTROL1&RX8025_READ_MODE),(u8 *)(&data),1);
//        data.bits.CT = state;                                                        // INTA輸出1Hz方波
//        RX8025Write((RX8025_ADDR_CONTROL1&RX8025_WRITE_MODE),(u8 *)(&data),1);
//}
/***********************************************************************************************
* Function                : BSP_RX8025Init
* Description        : RX8025初始化
* Input                        :
* Output                :
* Note(s)                :
* Contributor        : 081210        andydriver
***********************************************************************************************/
void BSP_RX8025Init(void)
{
    u8 buf[16];         
        u8 i;
//        iic_init();
        RX8025Read((RX8025_ADDR_SECONDS&RX8025_READ_MODE),buf,8);
        buf[0] = 0x20;
        RX8025Write((RX8025_ADDR_CONTROL1&RX8025_WRITE_MODE),buf,1);        //24小時制
        RX8025Read((RX8025_ADDR_SECONDS&RX8025_READ_MODE),buf,16);
        i++;
}
回復

使用道具 舉報

ID:12816 發表于 2017-8-19 12:41 | 顯示全部樓層
這是RX8025AC的吧
回復

使用道具 舉報

ID:142977 發表于 2017-8-22 15:20 | 顯示全部樓層

RX8025T和AC在在時序上有區別嗎,最近也是在調試,希望解惑,總是讀出00來
回復

使用道具 舉報

ID:12816 發表于 2017-9-3 21:29 | 顯示全部樓層
小二郎666 發表于 2017-8-22 15:20
RX8025T和AC在在時序上有區別嗎,最近也是在調試,希望解惑,總是讀出00來

基本一樣就是幾個寄存器不同
回復

使用道具 舉報

ID:437042 發表于 2018-12-1 11:54 | 顯示全部樓層
你好,我想問一下設備讀寫地址和寄存器地址是怎么定義的啊?
回復

使用道具 舉報

ID:55591 發表于 2019-1-31 07:18 | 顯示全部樓層
有沒有 RX8025T的??
回復

使用道具 舉報

ID:581992 發表于 2020-11-12 22:54 | 顯示全部樓層
RX8025T我也是一直沒有找到例程
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 九九av| 99热碰| 国产精品日韩欧美一区二区三区 | 欧美色成人 | 欧美精品久久久久久久久老牛影院 | 美女视频黄的免费 | 人人干97| 精品国产一区二区国模嫣然 | 伊人狠狠干 | 日韩成人精品一区 | 久久久久99 | 黄片毛片在线观看 | 国产一区久久 | 日韩一区二区久久 | 福利在线观看 | 欧美视频免费在线 | 精产嫩模国品一二三区 | 天天干天天操 | 男人的天堂视频网站 | 久久久久久国产精品 | 日一区二区 | 精品一区二区三区四区五区 | 欧美精品一区二区在线观看 | 午夜一级黄色片 | 亚洲欧洲成人av每日更新 | 久久久精| 美女福利视频网站 | avmans最新导航地址 | 91精品久久久久久久久中文字幕 | 九九久久久 | 日韩精品久久一区二区三区 | 亚洲精品成人网 | 久久噜噜噜精品国产亚洲综合 | 99久久久国产精品 | 欧美一区二区在线播放 | 欧美一级特黄aaa大片在线观看 | 青娱乐国产 | 99reav| 精品久久久久久久久久久久久久 | 欧美日韩国产精品一区二区 | 日韩a视频 |