国庆五I2C

IIC.C

#include "iic.h"

extern void printf(const char* fmt, ...);
/*
 * 函数名 : delay_us
 * 函数功能:延时函数
 * 函数参数:无
 * 函数返回值:无
 * */
void delay_us(void)
{
unsigned int i = 2000;
while(i--);
}
/*
 * 函数名 : i2c_init
 * 函数功能: i2C总线引脚的初始化, 通用输出,推挽输出,输出速度,
 * 函数参数:无
 * 函数返回值:无
 * */
void i2c_init(void)
{
 // 使能GPIOF端口的时钟
RCC->MP_AHB4ENSETR |= (0x1 << 5);
// 设置PF14,PF15引脚为通用的输出功能
GPIOF->MODER &= (~(0xF << 28));
GPIOF->MODER |= (0x5 << 28);
// 设置PF14, PF15引脚为推挽输出
GPIOF->OTYPER &= (~(0x3 << 14));
// 设置PF14, PF15引脚为高速输出
GPIOF->OSPEEDR |= (0xF << 28);
// 设置PF14, PF15引脚的禁止上拉和下拉
GPIOF->PUPDR &= (~(0xF << 28));
// 空闲状态SDA和SCL拉高 
I2C_SCL_H;
I2C_SDA_H;
}


void i2c_start(void)
{

SET_SDA_OUT;
I2C_SCL_H;
I2C_SDA_H;
delay_us();
I2C_SDA_L;
delay_us();
I2C_SCL_L; 
}

void i2c_stop(void)
{

SET_SDA_OUT;
I2C_SCL_L;
delay_us();
I2C_SDA_L; 
delay_us();

I2C_SCL_H;
delay_us();
I2C_SDA_H;
delay_us();
}

void i2c_write_byte(unsigned char dat)
{

unsigned int i;
SET_SDA_OUT;  
for(i=0;i<8;i++)
{
I2C_SCL_L;
delay_us();
if(dat & 0x80) 
{
I2C_SDA_H; 
}
else
{
I2C_SDA_L;
}
delay_us();
I2C_SCL_H;  
delay_us();
delay_us();
dat <<= 1; 
}
}


unsigned char i2c_read_byte(unsigned char ack)
{

unsigned int i;
unsigned char dat; SET_SDA_IN; 
for(i=0;i<8;i++)
{
I2C_SCL_L; 
delay_us();
delay_us();

I2C_SCL_H; 
delay_us();
dat <<= 1;
if(I2C_SDA_READ) 
{
dat |= 1;
}
else
{
dat |= 0;
}
delay_us();
}
if(!ack)
i2c_ack(); 
else
i2c_nack();
return dat;
}


unsigned char i2c_wait_ack(void)
{ 
I2C_SCL_L;
I2C_SDA_H; 
delay_us();
SET_SDA_IN; 

I2C_SCL_H;
delay_us();
if(I2C_SDA_READ)
return 1; 
I2C_SCL_L;
return 0; /
} 

void i2c_ack(void)
{

SET_SDA_OUT; 
delay_us();
I2C_SDA_L; 
delay_us();
I2C_SCL_H; 
delay_us();
delay_us();
I2C_SCL_L; 
}

void i2c_nack(void)
{

SET_SDA_OUT; /
I2C_SCL_L; 
delay_us();
I2C_SDA_H; 
delay_us();
I2C_SCL_H;
delay_us();
delay_us();
I2C_SCL_L; 
}

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值