新手上路
- 积分
- 30
- 金钱
- 30
- 注册时间
- 2020-10-30
- 在线时间
- 31 小时
|
17金钱
#ifndef _MYIIC_H_
#define _MYIIC_H_
#include "sys.h"
//IO????
#define SDA2_IN() {GPIOC->CRL&=0X0FFFFFFF;GPIOC->CRL|=(u32)8<<28;} //PB7????
#define SDA2_OUT() {GPIOC->CRL&=0X0FFFFFFF;GPIOC->CRL|=(u32)3<<28;} //PB7????
//IO??
#define IIC2_SCL PCout(5) //SCL
#define IIC2_SDA PCout(4) //SDA
#define READ_SDA2 PCin(4) //??SDA
//IIC2??????
void IIC2_Init(void); //???IIC?IO?
void IIC2_Start(void); //??IIC????
void IIC2_Stop(void); //??IIC????
void IIC2_Send_Byte(u8 txd); //IIC??????
u8 IIC2_Read_Byte(unsigned char ack);//IIC??????
u8 IIC2_Wait_Ack(void); //IIC??ACK??
void IIC2_Ack(void); //IIC??ACK??
void IIC2_NAck(void); //IIC???ACK??
void IIC2_Write_One_Byte(u8 daddr,u8 addr,u8 data);
u8 IIC2_Read_One_Byte(u8 daddr,u8 addr);
#endif
#include "myiic.h"
#include "delay.h"
//IIC???
void IIC2_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //????
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_SetBits(GPIOC,GPIO_Pin_4|GPIO_Pin_5); //PB10,PB11 ???
}
//??IIC????
void IIC2_Start(void)
{
SDA2_OUT(); //sda???
IIC2_SDA=1;
IIC2_SCL=1;
delay_us(4);
IIC2_SDA=0;//START:when CLK is high,DATA change form high to low
delay_us(4);
IIC2_SCL=0;//??I2C??,?????????
}
//??IIC????
void IIC2_Stop(void)
{
SDA2_OUT();//sda???
IIC2_SCL=0;
IIC2_SDA=0;//STOP:when CLK is high DATA change form low to high
delay_us(4);
IIC2_SCL=1;
IIC2_SDA=1;//??I2C??????
delay_us(4);
}
//????????
//???:1,??????
// 0,??????
u8 IIC2_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA2_IN(); //SDA?????
IIC2_SDA=1;delay_us(1);
IIC2_SCL=1;delay_us(1);
while(READ_SDA2)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC2_Stop();
return 1;
}
}
IIC2_SCL=0;//????0
return 0;
}
//??ACK??
void IIC2_Ack(void)
{
IIC2_SCL=0;
SDA2_OUT();
IIC2_SDA=0;
delay_us(2);
IIC2_SCL=1;
delay_us(2);
IIC2_SCL=0;
}
//???ACK??
void IIC2_NAck(void)
{
IIC2_SCL=0;
SDA2_OUT();
IIC2_SDA=1;
delay_us(2);
IIC2_SCL=1;
delay_us(2);
IIC2_SCL=0;
}
//IIC??????
//????????
//1,???
//0,???
void IIC2_Send_Byte(u8 txd)
{
u8 t;
SDA2_OUT();
IIC2_SCL=0;//??????????
for(t=0;t<8;t++)
{
IIC2_SDA=(txd&0x80)>>7;
txd<<=1;
delay_us(2); //?TEA5767??????????
IIC2_SCL=1;
delay_us(2);
IIC2_SCL=0;
delay_us(2);
}
}
//?1???,ack=1?,??ACK,ack=0,??nACK
u8 IIC2_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA2_IN();//SDA?????
for(i=0;i<8;i++ )
{
IIC2_SCL=0;
delay_us(2);
IIC2_SCL=1;
receive<<=1;
if(READ_SDA2)receive++;
delay_us(1);
}
if (!ack)
IIC2_NAck();//??nACK
else
IIC2_Ack(); //??ACK
return receive;
}
//////////////////////////////////////////DS3231
#include "sys.h"
#ifndef __DS3231_H__
#define __DS3231_H__
typedef struct
{
u8 hour;
u8 min;
u8 sec;
u32 w_year;
u8 w_month;
u8 w_date;
u8 week;
}_calendar_obj;
extern _calendar_obj calendar; //èÕàú½á11ìå
extern u8 const mon_table[12]; //Ô·YèÕÆúêy¾Y±í
void DS3231_Init(void);
void get_show_time(void);
//u8 RTC_Get_Week(u16 year,u8 month,u8 day);
void DS3231_Set(u8 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec);//éèÖÃê±¼ä
#endif
#include "DS3231.h"
#include "myiic.h"
#include "delay.h"
#include "sys.h"
_calendar_obj calendar;
#define DS3231_WriteAddress 0xD0
#define DS3231_ReadAddress 0xD1
u8 BCD2HEX(u8 val)
{
u8 i;
i= val&0x0f;
val >>= 4;
val &= 0x0f;
val *= 10;
i += val;
return i;
}
u16 B_BCD(u8 val)
{
u8 i,j,k;
i=val/10;
j=val%10;
k=j+(i<<4);
return k;
}
void I2cByteWrite(u8 addr,u8 bytedata)
{
IIC2_Start();
delay_us(5);
IIC2_Send_Byte(DS3231_WriteAddress);
IIC2_Wait_Ack();
delay_us(5);
IIC2_Send_Byte(addr);
IIC2_Wait_Ack();
delay_us(5);
IIC2_Send_Byte(bytedata);
IIC2_Wait_Ack();
delay_us(5);
IIC2_Stop();
}
u8 I2cByteRead(u8 addr)
{
u8 Dat=0;
IIC2_Start();
IIC2_Send_Byte(DS3231_WriteAddress);
IIC2_Wait_Ack();
delay_us(5);
IIC2_Send_Byte(addr);
IIC2_Wait_Ack();
delay_us(5);
IIC2_Start();
IIC2_Send_Byte(DS3231_ReadAddress);
IIC2_Wait_Ack();
delay_us(5);
Dat=IIC2_Read_Byte(1);
IIC2_Stop();
return Dat;
}
void DS3231_Init(void)
{
IIC2_Init();
// I2cByteWrite(0x0e,0);
// delay_ms(2);
// I2cByteWrite(0x0f,0x0);
// delay_ms(2);
}
void DS3231_Get(void)
{
calendar.w_year=I2cByteRead(0x06);
calendar.w_month=I2cByteRead(0x05);
calendar.w_date=I2cByteRead(0x04);
calendar.hour=I2cByteRead(0x02);
calendar.min=I2cByteRead(0x01);
calendar.sec=I2cByteRead(0x00);
}
void DS3231_Set(u8 yea,u8 mon,u8 da,u8 hou,u8 min,u8 sec)
{
u8 temp=0;
temp=B_BCD(yea);
I2cByteWrite(0x06,temp);
temp=B_BCD(mon);
I2cByteWrite(0x05,temp);
temp=B_BCD(da);
I2cByteWrite(0x04,temp);
temp=B_BCD(hou);
I2cByteWrite(0x02,temp);
temp=B_BCD(min);
I2cByteWrite(0x01,temp);
temp=B_BCD(sec);
I2cByteWrite(0x00,temp);
}
void get_show_time(void)
{
calendar.w_year=I2cByteRead(0x06);
calendar.w_year=BCD2HEX(calendar.w_year);
calendar.w_month=I2cByteRead(0x05);
calendar.w_month=BCD2HEX(calendar.w_month);
calendar.w_date=I2cByteRead(0x04);
calendar.w_date=BCD2HEX(calendar.w_date);
calendar.hour=I2cByteRead(0x02);
calendar.hour&=0x3f;
calendar.hour=BCD2HEX(calendar.hour);
calendar.min=I2cByteRead(0x01);
calendar.min=BCD2HEX(calendar.min);
calendar.sec=I2cByteRead(0x00);
calendar.sec=BCD2HEX(calendar.sec);
}
////////////////////////////////////////////////main
#include "stm32f10x.h"
#include "delay.h"
#include "usart.h"
#include "DS3231.h"
int main(void)
{
delay_init();
DS3231_Init();
NVIC_Configuration(); //éèÖÃNVICÖD¶Ï·Ö×é2:2λÇàÕ¼óÅÏè¼¶£¬2λÏìó|óÅÏè¼¶
uart_init(115200); //′®¿ú3õê¼»ˉÎa9600
DS3231_Set(20,1,9,11,05,00);
while(1)
{
get_show_time();
printf("ÄêÔÂèÕ:");
printf("%ld,%d,%d\r\n",calendar.w_year+2000,calendar.w_month,calendar.w_date);
printf("ê±·ÖÃë:");
printf("%d,%d,%d\r\n",calendar.hour,calendar.min,calendar.sec);
delay_ms(5000);
}
}
打印出来的结果是
[21:00:08.246]收←◆年月日:2165,165,165
时分秒:45,165,165
[21:00:09.526]收←◆年月日:2165,165,165
时分秒:45,165,165
[21:00:10.805]收←◆年月日:2165,165,165
时分秒:45,165,165
[21:00:12.084]收←◆年月日:2165,165,165
时分秒:45,165,165
[21:00:13.363]收←◆年月日:2165,165,165
时分秒:45,165,165
[21:00:14.642]收←◆年月日:2165,165,165
时分秒:45,165,165
哪位大神给看看为什么啊
|
|