新手上路
- 积分
- 32
- 金钱
- 32
- 注册时间
- 2018-1-22
- 在线时间
- 6 小时
|
本帖最后由 WwbH2 于 2018-1-23 12:47 编辑
STM8SF103 SCL接PD5 SDA接PD4,目前取时分秒老是有问题,数码管乱跳,有哪位帅哥美女帮我看一下呀。。
iic.h
[mw_shl_code=c,true]#ifndef _I2C_H
#define _I2C_H
#include "stm8s.h"
#define I2C_SCL_PIN GPIO_PIN_5
#define I2C_SDA_PIN GPIO_PIN_4
#define I2C_PORT GPIOD
#define I2C_SCL_L GPIO_WriteLow(I2C_PORT,I2C_SCL_PIN);
#define I2C_SCL_H GPIO_WriteHigh(I2C_PORT,I2C_SCL_PIN);
#define I2C_SDA_L GPIO_WriteLow(I2C_PORT,I2C_SDA_PIN);
#define I2C_SDA_H GPIO_WriteHigh(I2C_PORT,I2C_SDA_PIN);
#define I2C_SDA_OUT GPIO_Init(I2C_PORT, I2C_SDA_PIN, GPIO_MODE_OUT_OD_HIZ_FAST);
#define I2C_SDA_IN GPIO_Init(I2C_PORT, I2C_SDA_PIN, GPIO_MODE_IN_FL_NO_IT );
void I2C_Configuration(void);
void DS3231_ModifyTime(u32 yea,u8 mon,u8 da,u8 hou,u8 min,u8 sec);
u8 DS3231_ReadSecond(void);
u8 DS3231_ReadMiniute(void);
u8 DS3231_ReadHour(void);
#endif
[/mw_shl_code]
iic.c
[mw_shl_code=c,true]#include "pbdata.h"
void I2C_Configuration(void)
{
GPIO_Init(I2C_PORT, I2C_SCL_PIN, GPIO_MODE_OUT_OD_HIZ_FAST);
GPIO_Init(I2C_PORT, I2C_SDA_PIN, GPIO_MODE_OUT_OD_HIZ_FAST);
}
void I2C_Start(void)
{
I2C_SDA_OUT;
I2C_SDA_H;
I2C_SCL_H;
delay_us(5);
I2C_SDA_L;
delay_us(6);
I2C_SCL_L;
}
void I2C_Stop(void)
{
I2C_SDA_OUT;
I2C_SCL_L;
I2C_SDA_L;
I2C_SCL_H;
delay_us(6);
I2C_SDA_H;
delay_us(6);
}
void I2C_Ack(void)
{
I2C_SDA_OUT;
I2C_SCL_L;
I2C_SDA_L;
delay_us(2);
I2C_SCL_H;
delay_us(5);
I2C_SCL_L;
}
void I2C_NAck(void)
{
I2C_SDA_OUT;
I2C_SCL_L;
I2C_SDA_H;
delay_us(2);
I2C_SCL_H;
delay_us(5);
I2C_SCL_L;
}
// 返回1 代表 非应答信号
// 返回0 代表 有应答信号
u8 I2C_Wait_Ack(void)
{
u8 tempTime=0;
I2C_SDA_IN;
delay_us(5);
I2C_SCL_H;
delay_us(5);
while(GPIO_ReadInputPin(I2C_PORT,I2C_SDA_PIN))
{
tempTime++;
if(tempTime>250)
{
I2C_Stop();
return 1;
}
}
I2C_SCL_L;
return 0;
}
void I2C_Send_Byte(u8 txd)
{
u8 i=0;
I2C_SDA_OUT;
I2C_SCL_L;
for(i=0;i<8;i++)
{
if((txd&0x80)>0)
{
I2C_SDA_H;
}
else
{
I2C_SDA_L;
}
txd<<=1;
I2C_SCL_H;
delay_us(5);
I2C_SCL_L;
delay_us(5);
}
}
//ack=0 发送非应答信号 代表接收完成
//ack=1 发送应答信号 代表接收未完成 继续接收
u8 I2C_Read_Byte(u8 ack)
{
u8 i=0, receive=0;
I2C_SDA_IN;
for(i=0;i<8;i++)
{
I2C_SCL_L;
delay_us(2);
I2C_SCL_H;
delay_us(2);
receive<<=1;
if(GPIO_ReadInputPin(I2C_PORT,I2C_SDA_PIN))
receive++;
delay_us(1);
}
if(ack==0)
{
I2C_NAck();
}
else
{
I2C_Ack();
}
return receive;
}
u8 DS3231_ByteRead(u8 addr)
{
u8 Dat=0;
I2C_Start();
I2C_Send_Byte(0xD0); //器件写地址
I2C_Wait_Ack();
I2C_Send_Byte(addr);
I2C_Wait_Ack();
I2C_Start();
I2C_Send_Byte(0xD1); //器件读地址
I2C_Wait_Ack();
Dat=I2C_Read_Byte(1);
I2C_Stop();
return Dat;
}
void DS3231_ByteWrite(u8 addr,u8 data)
{
I2C_Start();
I2C_Send_Byte(0xD0);
I2C_Wait_Ack();
I2C_Send_Byte(addr);
I2C_Wait_Ack();
I2C_Send_Byte(data);
I2C_Wait_Ack();
I2C_Stop();
}
void DS3231_ModifyTime(u32 yea,u8 mon,u8 da,u8 hou,u8 min,u8 sec)
{
u8 temp=0;
temp=HEX_TO_BCD(yea);
DS3231_ByteWrite(0x06,temp);
temp=HEX_TO_BCD(mon);
DS3231_ByteWrite(0x05,temp);
temp=HEX_TO_BCD(da);
DS3231_ByteWrite(0x04,temp);
temp=HEX_TO_BCD(hou);
DS3231_ByteWrite(0x02,temp);
temp=HEX_TO_BCD(min);
DS3231_ByteWrite(0x01,temp);
temp=HEX_TO_BCD(sec);
DS3231_ByteWrite(0x00,temp);
}
u8 DS3231_ReadSecond(void)
{
u8 p=0;
p=DS3231_ByteRead(0x00);
p= BCD_TO_HEX(p);
return p;
}
u8 DS3231_ReadMiniute(void)
{
u8 p=0;
p=DS3231_ByteRead(0x01);
p= BCD_TO_HEX(p);
return p;
}
u8 DS3231_ReadHour(void)
{
u8 p=0;
p=DS3231_ByteRead(0x02);
p&=0x3f;
p= BCD_TO_HEX(p);
return p;
}
[/mw_shl_code]
main.c
[mw_shl_code=c,true]void main(void)
{
u8 tSec=0;
u8 tMin=0;
u8 tHour=0;
RCC_Config();
GPIO_Config();
//DS3231_ModifyTime(2018,1,22,22,52,05); //年,月,日,时,分,秒
while (1)
{
tSec = DS3231_ReadSecond();
tMin = DS3231_ReadMiniute();
tHour= DS3231_ReadHour();
TM1618_DispalyNum(tHour/10,tHour%10 ,tMin/10,tMin%10);
delay_ms(1000);
}
}
void RCC_Config(void)
{
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//时钟速度为内部16M,1分频
}
void GPIO_Config(void)
{
TM1618_Init();
I2C_Configuration();
}[/mw_shl_code]
|
|