注册
登录
电子工程世界-论坛
返回首页
EEWORLD首页
频道
EE大学堂
下载中心
Datasheet
专题
单片机
物联网
汽车电子
嵌入式
手机/便携
模拟电子
家用电子
网络通信
电源管理
工业控制
测试测量
半导体设计/制造
安防电子
传感器
医疗电子
Justice_Gao的个人空间
https://home.eeworld.com.cn/space-uid-784175.html
[收藏]
[复制]
[分享]
[RSS]
空间首页
动态
记录
日志
相册
主题
分享
留言板
个人资料
借用开发板
论坛
淘帖
Collection
查看新帖
最新回复
社区活动
联系管理员
我的空间
帖子
日志
收藏
好友
勋章
积分
安全验证
请完成以下验证码
日志
【GD32F350开发分享七】GPIO模拟I2C驱动
已有 2276 次阅读
2018-10-9 19:58
|
个人分类:
GD32系列学习
我的作品没有用到I2C,有空的时候改了一下,仅供大家才考一下
#include "I2C.h"
#define SDA_HIGH gpio_bit_set(GPIOC, GPIO_PIN_13)
#define SDA_LOW gpio_bit_reset(GPIOC, GPIO_PIN_13)
#define SCL_HIGH gpio_bit_set(GPIOC, GPIO_PIN_10)
#define SCL_LOW gpio_bit_reset(GPIOC, GPIO_PIN_10)
#define RESET_HIGH gpio_bit_set(GPIOC, GPIO_PIN_11)
#define RESET_LOW gpio_bit_reset(GPIOC, GPIO_PIN_11)
#define POWERDOWN_HIGH gpio_bit_set(GPIOC, GPIO_PIN_12)
#define POWERDOWN_LOW gpio_bit_reset(GPIOC, GPIO_PIN_12)
//在开漏输出模式下,对端口输入状态寄存器的读访问将返回I/O的状态,因此 不需要为了读取数据,专门将I/0由输出设为输入
#define SDA_READ gpio_input_bit_get(GPIOC, GPIO_PIN_13)
void I2C_delay(void)
{
uint32_t t=300*13.5;
while(t--);
}
void nops1ms(void) //1ms
{
uint32_t t=8000*13.5;
while(t--);
}
void delay_50ms(void) //50ms
{
uint t=50;
for(t=0;t<50;t++)
nops1ms();
}
void init_camera(void)
{
uint i;
RESET_LOW;
POWERDOWN_HIGH;
for(i=0;i<10;i++)
nops1ms();
POWERDOWN_LOW;
for(i=0;i<10;i++)
nops1ms();
RESET_HIGH;
}
void I2C_Initializes(void)
{
I2C_GPIO_Configuration();
init_camera();
delay_50ms();
SCL_HIGH;
SDA_HIGH;
nops1ms();
}
void Delay(void)
{
nops1ms();
nops1ms();
}
int I2C_Start(void)
{
SDA_HIGH;
SCL_HIGH;//高电平有效
I2C_delay();//延时
if(!SDA_READ)
{
return DISABLE;//SDA总线忙,退出
}
SDA_LOW;
I2C_delay();
//查看此时SDA已经变为低电平
if(SDA_READ)
return DISABLE;//SDA总线忙,退出
}
SCL_LOW;
return ENABLE;
}
void I2C_Stop(void)
{
SCL_LOW;
//制造一个上升沿,上升沿是结束的标志
SDA_LOW;
SCL_HIGH;//高电平有效
I2C_delay();//延时
SDA_HIGH;
I2C_delay();
}
void I2C_Ack()
{
SCL_LOW;
SDA_LOW;//置低
I2C_delay(); //注意延时时间应该大于4微秒,其他位置也是如此
SCL_HIGH;
I2C_delay();
SCL_LOW;
}
void I2C_NoAck()
{
SCL_LOW;
I2C_delay();
SDA_HIGH;//置高
I2C_delay();
SCL_HIGH;
I2C_delay();
SCL_LOW;
}
uint8_t I2C_GetAck(void)
{
uint8_t time = 0;
SDA_HIGH;
I2C_delay();
SCL_HIGH;
I2C_delay();
while(SDA_READ)
{
time++;
if(time > 250)
{
SCL_LOW;
return DISABLE;
}
}
SCL_LOW;
return ENABLE;
}
//I2C写一个字节
void I2C_SendByte(uint8_t Data)
{
uint8_t cnt;
for(cnt=0; cnt<8; cnt++)
{
SCL_LOW; //SCL低(SCL低时,变化SDA)
I2C_delay();
if(Data & 0x80)
{
SDA_HIGH; //SDA高,从最低位开始写起
}
else
{
SDA_LOW; //SDA低
}
Data <<= 1;
SCL_HIGH; //SCL高(发送数据)
I2C_delay();
}
SCL_LOW; //SCL低(等待应答信号)
I2C_delay();
}
//I2C读取一个字节
uint8_t I2C_ReadByte(uint8_t ack)
{
uint8_t cnt;
uint8_t data;
for(cnt=0; cnt<8; cnt++)
{
SCL_LOW; //SCL低
I2C_delay();
SCL_HIGH; //SCL高(读取数据)
data <<= 1;
if(SDA_READ)
{
data |= 0x01; //SDA高(数据有效)
}
I2C_delay();
}
//发送应答信号,为低代表应答,高代表非应答
if(ack == 1)
{
I2C_NoAck();
}
else
{
I2C_Ack();
}
return data; //返回数据
}
复制代码
本文来自论坛,点击查看完整帖子内容。
收藏
邀请
举报
全部
作者的其他最新日志
•
【GD32F350开发分享九】单端输入ADC+定时器单次转换
•
【GD32F350开发分享八】RTC年月日时分秒实时时钟,并显示在TFT屏幕上
•
【GD32F350开发分享六】USART0和USART1的双串口应用
•
【GD32F350开发分享五】GPIO模拟SPI控制液晶显示屏
•
【GD32F350开发分享四】定时器T0中断:外部高速时钟源8MHz
评论 (
0
个评论)
涂鸦板
您需要登录后才可以评论
登录
|
注册
评论
Justice_Gao
加为好友
给我留言
打个招呼
发送消息
热门文章
头条资讯
苹果在欧洲法院胜诉 小米Mi Pad商标无法在欧洲注册
现场采访 | 抢占制高点,村田“智”造拥抱5G时代
文末福利|距离集齐五福,你还差 Vishay 五牛祝福
指纹识别不好用,谁该为你的手机负责?
【征稿】擎性能之颠,筑安全之底(1-3月征稿)
应用材料公司新年祝福到!
新增数据手册
NM1LMR12D23.5
M55342K09B316ACBS
MXZ-050/100M5X5
TF-596-ARD
ABVFM2-80.000MHZ-N-CM-N150-T
CHP2512K1241DN131
热搜器件
TMMH-125-01-F-T-RA
RNC55H7500FSB14
CC05CG561G
EKZM250
1-1579007-2
12067C472MAT2A
推荐下载
开关电源原理与设计
简单的电池电路扩展以太网供电(PoE)峰值电流
高整合度的雙頻DAB接收器設計
电子电路实验与虚拟技术
单片机学习
工业以太网和ANSI 709
推荐关注
益莱储2025新年回顾展望:租赁赋能客户创新蝶变
益莱储2025新年回顾展望:租赁赋能客户创新蝶变
极海G32R501实时控制 MCU 跨域新境界丨面向新一代高效能高实时控制设备
搓了块国产FPGA遨格芯AG10K的板子,水一下踩坑经历
ATGM336H-5N31:GPS+BDS定位车载导航模块资料,兼容代替 MAX-6/7Q MAX- M8Q
RK3562编译Android13 ROOT固件教程,触觉智能开发板演示