OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4719|回复: 1

需要向HYM8563T的CLKout 地址为0x0D 写入0x81(10000001),使其输出的频率是1024Hz。)芯片基于IIC通讯

[复制链接]

1

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2021-9-18
在线时间
14 小时
发表于 2021-10-27 09:19:43 | 显示全部楼层 |阅读模式
7金钱
#include "pcf8563.h"
#include "delay.h"



unsigned char Time[7];

void PCF_IIC_Init(void)
{                       
  GPIO_InitTypeDef  GPIO_InitStructure;

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOB时钟

  //GPIOB8,B9初始化设置
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化
        PCF_IIC_SCL=1;
        PCF_IIC_SDA=1;
}

void PCF_IIC_Start(void)
{
        PCF_SDA_OUT();     //sda线输出
        PCF_IIC_SDA=1;                    
        PCF_IIC_SCL=1;
        delay_us(4);
        PCF_IIC_SDA=0;//START:when CLK is high,DATA change form high to low
        delay_us(4);
        PCF_IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
}

void PCF_IIC_Stop(void)
{
        PCF_SDA_OUT();//sda线输出
        PCF_IIC_SCL=0;
        PCF_IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
        delay_us(4);
        PCF_IIC_SCL=1;
        PCF_IIC_SDA=1;//发送I2C总线结束信号
        delay_us(4);                                                                  
}

u8 PCF_IIC_Wait_Ack(void)
{
        u8 ucErrTime=0;
        PCF_SDA_IN();      //SDA设置为输入  
        PCF_IIC_SDA=1;delay_us(1);          
        PCF_IIC_SCL=1;delay_us(1);         
        while(PCF_READ_SDA)
        {
                ucErrTime++;
                if(ucErrTime>250)
                {
                        PCF_IIC_Stop();
                        return 1;
                }
        }
        PCF_IIC_SCL=0;//时钟输出0           
        return 0;  
}

//产生ACK应答
void PCF_IIC_Ack(void)
{
        PCF_IIC_SCL=0;
        PCF_SDA_OUT();
        PCF_IIC_SDA=0;
        delay_us(2);
        PCF_IIC_SCL=1;
        delay_us(2);
        PCF_IIC_SCL=0;
}

//不产生ACK应答                    
void PCF_IIC_NAck(void)
{
        PCF_IIC_SCL=0;
        PCF_SDA_OUT();
        PCF_IIC_SDA=1;
        delay_us(2);
        PCF_IIC_SCL=1;
        delay_us(2);
        PCF_IIC_SCL=0;
}       

//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答                          
void PCF_IIC_Send_Byte(u8 txd)
{                        
  u8 t;   
        PCF_SDA_OUT();             
        PCF_IIC_SCL=0;//拉低时钟开始数据传输
        for(t=0;t<8;t++)
        {              
                PCF_IIC_SDA=(txd&0x80)>>7;
                txd<<=1;           
                delay_us(2);   //对TEA5767这三个延时都是必须的
                PCF_IIC_SCL=1;
                delay_us(2);
                PCF_IIC_SCL=0;       
                delay_us(2);
        }         
}             

//读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
u8 PCF_IIC_Read_Byte(unsigned char ack)
{
        unsigned char i,receive=0;
        PCF_SDA_IN();//SDA设置为输入
        for(i=0;i<8;i++ )
        {
                PCF_IIC_SCL=0;
                delay_us(2);
                PCF_IIC_SCL=1;
                receive<<=1;
                if(PCF_READ_SDA)receive++;   
                delay_us(1);
        }                                         
        if (!ack)
                PCF_IIC_NAck();//发送nACK
        else
                PCF_IIC_Ack(); //发送ACK   
        return receive;
}


unsigned char PCF_BinToBcd2(unsigned char BINValue)
{
        unsigned char BCDHigh=0;
        while(BINValue >= 10)
        {
                BCDHigh ++;
                BINValue -= 10;
        }
        return ((unsigned char)(BCDHigh<<4)|BINValue);
}

unsigned char PCF_Bcd2ToBin(unsigned char BCDValue)
{
        unsigned char Time=0;
        {
                Time=((unsigned char)(BCDValue&(unsigned char)0xF0)>>(unsigned char)0x04)*10;
                return (Time+(BCDValue&(unsigned char)0x0F));
        }
}

void PCF8563_Write_Byte(unsigned char REG_ADDR, unsigned char DAT)
{
        PCF_IIC_Start();
        PCF_IIC_Send_Byte(PCF8563_WADDR);
//        delay_us(5);
//        PCF_IIC_Send_Byte(PCF8563_CLKOUT,0x81);
        while(PCF_IIC_Wait_Ack());
        PCF_IIC_Send_Byte(REG_ADDR);
        PCF_IIC_Wait_Ack();
        PCF_IIC_Send_Byte(DAT);
        PCF_IIC_Wait_Ack();
        PCF_IIC_Stop();
}

unsigned char PCF8563_Read_Byte(unsigned char REG_ADDR)
{
        u8 ReData;
        PCF_IIC_Start();
        PCF_IIC_Send_Byte(PCF8563_WADDR);
        while(PCF_IIC_Wait_Ack());
        PCF_IIC_Send_Byte(REG_ADDR);
        PCF_IIC_Wait_Ack();
        PCF_IIC_Start();
        PCF_IIC_Send_Byte(PCF8563_RADDR);
        PCF_IIC_Wait_Ack();
        ReData=PCF_IIC_Read_Byte(0);
        PCF_IIC_Stop();
        return ReData;
}

void PCF8563_Config(void)
{
        PCF8563_Write_Byte(PCF8563_Control_Status_1,0x00);
        PCF8563_Write_Byte(PCF8563_Control_Status_2,0x02);
//  PCF8563_Write_Byte(PCF8563_CLKOUT,0x83);

       
}

void PCF8563_GetTime(void)
{
        if((PCF8563_Read_Byte(PCF8563_Months)>>7)==0)
        {
                Time[0]=0x14;
        }
        if((PCF8563_Read_Byte(PCF8563_Months)>>7)==1)
        {
                Time[0]=0x13;
        }
        Time[1]=PCF_Bcd2ToBin(PCF8563_Read_Byte(PCF8563_Years));                                                                        //年份读取
        Time[2]=PCF_Bcd2ToBin((PCF8563_Read_Byte(PCF8563_Months)<<3&0xff)>>3);                //月份设置
        Time[3]=PCF_Bcd2ToBin((PCF8563_Read_Byte(PCF8563_Days)<<2&0xff)>>2);                        //日期设置
        Time[4]=PCF_Bcd2ToBin((PCF8563_Read_Byte(PCF8563_Hours)<<2&0xff)>>2);                        //小时设置
        Time[5]=PCF_Bcd2ToBin((PCF8563_Read_Byte(PCF8563_Minutes)<<1&0xff)>>1);                //分钟设置
        Time[6]=PCF_Bcd2ToBin((PCF8563_Read_Byte(PCF8563_Seconds)<<1&0xff)>>1);                //秒钟设置
}

void PCF8563_SetTime(unsigned char year, unsigned char month, unsigned char day, unsigned char hour, unsigned char minute, unsigned char second)
{
        PCF8563_Write_Byte(PCF8563_Years,PCF_BinToBcd2(year));                        //年份设置
        PCF8563_Write_Byte(PCF8563_Months,PCF_BinToBcd2(month));                //月份设置       
        PCF8563_Write_Byte(PCF8563_Days,PCF_BinToBcd2(day));                                //日期设置
        PCF8563_Write_Byte(PCF8563_Hours,PCF_BinToBcd2(hour));                        //小时设置
        PCF8563_Write_Byte(PCF8563_Minutes,PCF_BinToBcd2(minute));        //分钟设置
        PCF8563_Write_Byte(PCF8563_Seconds,PCF_BinToBcd2(second));        //秒钟设置
       
}



最佳答案

查看完整内容[请看2#楼]

在 setTIME后面加即可 自己已经解决
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2021-9-18
在线时间
14 小时
 楼主| 发表于 2021-10-27 09:19:44 | 显示全部楼层
在 setTIME后面加即可 自己已经解决
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 19:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表